web-dev-qa-db-fra.com

Afficher plusieurs messages, mais assurez-vous qu'une condition est remplie

J'ai un type de message personnalisé pour un groupe de personnes (employés). Au début, je devais afficher 7 employés au hasard. C'était facile

<?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(); 

?>

Mais maintenant, on m'a demandé de veiller à ce qu'au moins l'une des sept soit toujours une femme. Le ratio homme/femme dans l'entreprise est de 4 pour 1.

J'ai mis une case à cocher que je peux tester:

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

J'ai besoin d'aide pour tout mettre en place. Je suppose que je dois garder la trace si l'un des messages affichés est une femme. Une fois en 7ème position, si une femme ne figure pas sur la liste, je dois continuer à itérer jusqu'à en trouver une.

Aucune suggestion?

4
Christina

Je pense que le meilleur moyen ici serait de faire trois boucles séparées ici ( vous pouvez aussi faire deux boucles, mais vous devez ensuite avoir les posts complets dans les requêtes des hommes et des femmes, les combiner et les mélanger ), le premier. deux seront utilisés pour avoir 5 hommes et la deuxième boucle aura 2 femmes. Vous pouvez ajuster cela si nécessaire. La troisième boucle utilisera les informations des deux premières boucles pour obtenir les posts complets.

Ici, je reconnais que vous utilisez un champ personnalisé qui a deux valeurs distinctes, une pour les hommes et une pour les femmes. De plus, j'accepte le fait que vous n'avez pas besoin de paginer cette requête.

Vous pouvez essayer quelque chose comme ça

/*
 * 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

J'ai fait quelques ajustements. Une fois que j'ai créé mes deux tableaux, je les ai combinés de cette façon

$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

Cela semble un peu lent, alors je risque d’être redondant ou inefficace, mais cela me donne les résultats que j’espérais.

2
Christina