次のようにすると、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を使用します。
ランダムなオフセットのために我々は試みるかもしれません:
$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 );
これは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();