it-swarm.com.de

Mehrere zufällige Beiträge anzeigen, aber gesichert, dass eine Bedingung erfüllt ist

Ich habe einen benutzerdefinierten Beitragstyp für eine Gruppe von Personen (Mitarbeitern). Zuerst musste ich 7 zufällige Mitarbeiter anzeigen. Das war einfach

<?php 
    $args = array(
        'post_type' => 'employees',
        'orderby' => 'Rand',
        'posts_per_page' => 7,
    );
    $query = new WP_Query($args);
    while ( $query->have_posts() ) { $query->the_post();
        //do stuff
    <?php endif;
    } wp_reset_postdata(); 

?>

Aber jetzt wurde ich gebeten sicherzustellen, dass mindestens eine der sieben immer eine Frau ist. Das Verhältnis von Mann zu Frau im Unternehmen beträgt 4 zu 1.

Ich habe ein Kontrollkästchen aktiviert, auf das ich testen kann:

<?php if( in_array( 'yes', get_field('is_female') ) ){
 // this is a female
}

Ich brauche Hilfe beim Zusammenstellen. Ich gehe davon aus, dass ich den Überblick behalten muss, wenn die angezeigten Beiträge Frauen sind. Wenn eine Frau nicht aufgeführt ist und ich die 7. Position erreiche, muss ich so lange iterieren, bis ich eine finde.

Irgendwelche Vorschläge?

4
Christina

Ich denke, der beste Weg wäre, hier drei separate Loops zu starten ( Sie können auch zwei Loops ausführen, aber dann müssen Sie die vollständigen Posts in den Männer- und Frauenabfragen abrufen, diese kombinieren und mischen ) zwei werden verwendet, um 5 Männer zu bekommen, und die zweite Schleife wird 2 Frauen bekommen. Sie können dies nach Bedarf anpassen. In der dritten Schleife werden die Informationen aus den ersten beiden Schleifen verwendet, um die vollständigen Beiträge abzurufen.

Hier akzeptiere ich, dass Sie ein benutzerdefiniertes Feld verwenden, das zwei separate Werte aufweist, einen für Männer und einen für Frauen. Außerdem akzeptiere ich, dass Sie diese Abfrage nicht paginieren müssen.

Sie können so etwas versuchen

/*
 * First query to get 5 men. Only get post ID's to increase performance
 */
$args1 = array(
    'posts_per_page'   => 5,
    'orderby'          => 'Rand',
    'suppress_filters' => true,
    'no_found_rows'    => true,
    'fields'           => 'ids',
    'meta_query'       => array(
        array(
            'key'   => 'custom-field-name',
            'value' => 'value-for-men',
        )
    )
);
$men = new WP_Query( $args1 );

/*
 * Second query to get 2 women. Only get post ID's to increase performance
 */
$args2 = array(
    'posts_per_page'   => 2,
    'orderby'          => 'Rand',
    'suppress_filters' => true,
    'no_found_rows'    => true,
    'fields'           => 'ids',
    'meta_query'       => array(
        array(
            'key'   => 'custom-field-name',
            'value' => 'value-for-women',
        )
    )
);
$women = new WP_Query( $args2 );

/*
 * Merge the post id's from the two queries
 */
$merged_ids = array_merge( $women->posts, $men->posts );

/*
 * Use the merged array of post id's to get the complete posts. Use 'orderby' => 'post__in'
 * to keep shuffled order of the posts that will be returned
 */ 
$args3 = array( 
    'post__in' => shuffle( $merged_ids ),
    'orderby' => 'post__in'
);
$merged_queries = new WP_Query( $args3 ); 

?><pre><?php var_dump($merged_queries->posts); ?></pre><?php    
2
Pieter Goosen

Ich habe ein paar Anpassungen vorgenommen. Nachdem ich meine beiden Arrays erstellt hatte, habe ich sie auf diese Weise kombiniert

$merged_queries->posts = array_merge( $women->posts, $men->posts );
shuffle($merged_queries->posts);
$merged_queries->post_count = $women->post_count + $men->post_count;

while ( $merged_queries->have_posts() ) { $merged_queries->the_post();
// do stuff

Es scheint ein wenig langsam zu sein, daher kann es zu Redundanzen oder Ineffizienzen kommen, aber es liefert mir die Ergebnisse, die ich mir erhofft hatte.

2
Christina