web-dev-qa-db-ja.com

ランダムな投稿をいくつか表示しますが、条件が満たされていることを確認します

私は人々のグループ(従業員)のためのカスタム投稿タイプを持っています。最初は、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(); 

?>

しかし今、私は7人のうちの少なくとも1人が常に女性であることを確認するように頼まれました。会社の男女比は4対1です。

テストできるチェックボックスを設定しました。

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

私はそれをすべてまとめる手助けが必要です。表示されている記事のいずれかが女性である場合は、追跡する必要があると思います。女性がリストに載っていない場合は、7番目の位置に到達したら、それが見つかるまで繰り返し続ける必要があります。

助言がありますか?

4
Christina

ここでの最良の方法は、ここで3つの別々のループを実行することです( 2つのループを実行することもできますが、男性と女性のクエリで完全な投稿を取得し、それらを組み合わせてシャッフルする必要があります )。最初の2つは5人の男性を取得するために使用され、2番目のループは2人の女性を取得します。必要に応じて調整できます。 3番目のループは最初の2つのループからの情報を使用して完全な投稿を取得します。

ここでは、男性用と女性用の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

私はいくつか調整を加えました。 2つの配列を作成したら、このように組み合わせました

$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