Exibe várias mensagens aleatórias, mas garante que uma condição seja atendida

4

Eu tenho um tipo de postagem personalizado para um grupo de pessoas (funcionários). No começo, eu precisava exibir 7 funcionários aleatórios. Isso foi fácil

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

?>

Mas agora me pediram para garantir que pelo menos uma das sete seja sempre uma mulher. A razão homem para mulher na empresa é de 4 para 1.

Eu defini uma caixa de seleção que posso testar:

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

Preciso de ajuda para juntar tudo. Eu suponho que preciso acompanhar se qualquer uma das postagens exibidas é de mulheres. Quando eu chegar na 7ª posição se uma mulher não estiver listada, eu preciso continuar iterando até encontrar uma.

Alguma sugestão?

    
por Christina 22.03.2015 / 02:49

2 respostas

2

Acho que a melhor maneira aqui é executar três loops separados aqui ( você também pode fazer dois loops, mas você precisa obter posts completos nas consultas de homens e mulheres, combiná-los e embaralhá-los ), os dois primeiros serão usados para obter 5 homens e o segundo loop terá 2 mulheres. Você pode ajustar isso conforme necessário. O terceiro loop usará as informações dos dois primeiros loops para obter as postagens completas.

Aqui aceito que você está usando um campo personalizado que tem dois valores separados, um para homens e outro para mulheres. Além disso, aceito que você não precise paginar essa consulta.

Você pode tentar algo assim

/*
 * 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    
    
por Pieter Goosen 22.03.2015 / 13:17
2

Eu fiz alguns ajustes. Depois de criar meus dois arrays, eu os combinei dessa maneira

$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

Parece um pouco lento, então eu posso ter alguma redundância ou ineficiência, mas isso está me dando os resultados que eu esperava.

    
por Christina 24.03.2015 / 03:36