it-swarm.com.ru

Показать несколько случайных сообщений, но убедитесь, что условие выполнено

У меня есть пользовательский тип сообщения для группы людей (сотрудников). Сначала мне нужно было отобразить 7 случайных сотрудников. Это было просто

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

?>

Но теперь меня попросили убедиться, что хотя бы одна из семи всегда женщина. Соотношение мужчин и женщин в компании составляет 4 к 1.

Я установил флажок, который я могу проверить:

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

Мне нужна помощь, чтобы собрать все это вместе. Я предполагаю, что мне нужно следить за тем, отображаются ли какие-либо сообщения женщины. Как только я попадаю на 7-ю позицию, если женщины нет в списке, мне нужно продолжать итерацию, пока не найду одну.

Какие-либо предложения?

4
Christina

Я думаю, что лучшим способом здесь было бы запустить три отдельных цикла ( вы также можете сделать два цикла, но тогда вам нужно получить полные сообщения в запросах мужчин и женщин, объединить их и перемешать их ), первый два будут использованы для получения 5 мужчин, а второй цикл получит 2 женщины. Вы можете настроить это по мере необходимости. Третий цикл будет использовать информацию из первых двух циклов, чтобы получить полные сообщения.

Здесь я принимаю, что вы используете настраиваемое поле, которое имеет два отдельных значения: одно для мужчин и одно для женщин. Кроме того, я принимаю, что вам не нужно разбивать этот запрос на страницы.

Вы можете попробовать что-то вроде этого

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

Я сделал несколько корректировок. Создав два массива, я объединил их таким образом

$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

Это кажется немного медленным, поэтому у меня может быть некоторая избыточность или неэффективность, но это дает мне результаты, на которые я надеялся.

2
Christina