web-dev-qa-db-ja.com

カテゴリーがランダムに混在する投稿を取得する

A、B、Cの3つのカテゴリがあります。Aには約1000の投稿があり、Bには約300の投稿があり、Cには50の投稿があります。 5件の投稿を検索した際に、ランダムに並べられました。私は主にAカテゴリから投稿を得ています。

Aから3、Bから1、Cから1のように、カテゴリが異なるランダムな投稿を取得するにはどうすればよいですか。

1
busyjax

私はこれをホイップアップしました:

echo '<ul>';
    the_random_posts();
echo '</ul>';

/**
 * Send random posts to the browser (STDOUT).
 */
function the_random_posts() {

    // Use your own category ids.
    $random_posts = array_merge(
        get_random_posts( 31, 3 ),
        get_random_posts( 11, 1 ),
        get_random_posts( 24, 1 )
    );

    foreach ( $random_posts as $post ) {
        // Change this line to code you want to output.
        printf( '<li><a href="%s">%s</a></li>', get_permalink( $post->ID ), get_the_title( $post->ID ) );
    }
}

/**
 * Get $post_count random posts from $category_id.
 *
 * @param int $post_count Number of random posts to retrieve.
 * @param int $category_id ID of the category.
 */
function get_random_posts( $category_id, $post_count ) {

    $posts = get_posts( array(
        'posts_per_page' => $post_count,
        'orderby'        => 'Rand',
        'cat'            => $category_id,
        'post_status'    => 'publish',
    ) );

    return $posts;
}

選択したカテゴリのうち2つ以上に投稿がある場合は、投稿が繰り返される可能性があります(カテゴリAとカテゴリBの両方にある投稿のように)。以前に検索された投稿の配列を持つ 静的変数 はそれを修正するかもしれません。

このアルゴリズムは、投稿された順番に投稿を表示します。

get_random_posts( 31, 3 ), // First, 3 random posts from Category A
get_random_posts( 11, 1 ), // Then,  1 random post  from Category B
get_random_posts( 24, 1 )  // Then,  1 random post  from Category C

ランダムなリストが欲しい場合は、 $random_posts をシャッフルします。

1