web-dev-qa-db-ja.com

ランダムな投稿から始めて4つの年代順の投稿を表示する

次のようにすると、4つのランダムな投稿を表示できることがわかりました。

get_posts('orderby=Rand&numberposts=4');

私が達成しようとしているのは、ランダムなアイテムから始めて、それから年代順になっている次の3つの投稿を表示することです。

私はこれに沿って何かを考えています:

$posts = get_posts('orderby=Rand&numberposts=1'); 

foreach($posts as $post) { 
    the_title();

    //get next 3 chronological posts and loop
} 

'offset'パラメータのようなものを使用する必要があると思いますが、位置ではなく投稿IDを使用します。

2
Adam Lobo

ランダムなオフセットのために我々は試みるかもしれません:

$ppp    = 4;  
$total  = wp_count_posts()->publish;    

$offset = $total < $ppp ? 0 : Rand( 0, $total - $ppp );

$posts = get_posts( [
    'posts_per_page' => $ppp,
    'offset'         => $offset
] );

例:

$pppを4とし、$totalが6であるとしましょう。

$offsetには、0、1、2の3つの可能性があります。

Nr  Offset Selections
1   0      x
2   1      x x
3   2      x x x
4   3      x x x
5   4        x x
6   5          x

そう

$offset = $total < $ppp ? 0 : Rand( 0, $total - $ppp );

与えるだろう:

$offset = Rand( 0, 6 - 4 );

あるいは単に

$offset = Rand( 0, 2 );
2
birgire

これはdate_queryを使った別のアプローチです。

  • ランダムな投稿を1つ取得します

  • それからdate_queryを使用して、その1つのランダムな投稿に隣接する他の3つの投稿を取得します。

これが私たちが使う関数です:(注:わかりやすくするためにコードにコメントを追加しました。コードにはPHP 5.4 +が必要です

function get_random_posts( $args = [], $direction = 'after' )
{
    /**
     * Lets first get our random post, then work from there. We will be using the same 
     * exact arguments for all our queries we need to run. We do however need to modify
     * some a bit. We will save the default args to a another variable and then modify
     * the args to pass to the first query.
     *
     * We will let WP_Query handle the sanitation and validation from the
     * array of arguments.  
     */
    $random_args                   = $args;
    $random_args['orderby']        = 'Rand';
    $random_args['posts_per_page'] = 1;

    $random_post = get_posts( $random_args );

    /**
     * We will o get the adjacent posts from the random one. We will be 
     * using the default $args again
     *
     * We will need to sort out the amount of posts to get from the adjacent
     * post query first before  we go along. We need to deduct one from the amount
     * of posts to adjust for the random post
     */
    if ( isset( $args['posts_per_page'] ) ) {
        $args['posts_per_page'] = ( $args['posts_per_page'] - 1 );
    } else {
        $args['posts_per_page'] = ( get_option( 'posts_per_page' ) - 1 );
    }

    // Create our date query to get the adjacent posts  
    $date_query = [
        [
            $direction  => $random_post[0]->post_date,
            'inclusive' => false
        ]
    ];
    $args['date_query'] = $date_query;

    // Set the order parameter according to direction
    if ( $direction === 'after' ) {
        $args['order'] = 'ASC';
    } else {
        $args['order'] = 'DESC';
    }

    $adjacent_query = get_posts( $args );   

    // Merge and return the posts
    return array_merge( $random_post, $adjacent_query );
}

ご覧のとおり、関数の最初のパラメータは$argsです。これは通常WP_Queryに渡す引数の配列です。 2番目のパラメータ$directionは、必要に応じてbeforeまたはafterのいずれかの隣接する投稿の方向になります。

あなたは次のように関数を使用するでしょう:

$args = [
    'posts_per_page' => 4 // The amount of posts to get
    // Any other arguments you might need
];
$q = get_random_posts( $args );

foreach ( $q as $post ) {
    setup_postdata( $post );

    the_title();

}
wp_reset_postdata();
2
Pieter Goosen