Je sais que je peux afficher 4 messages aléatoires en faisant quelque chose comme:
get_posts('orderby=Rand&numberposts=4');
Ce que j'essaie de réaliser, c'est de commencer avec un élément aléatoire, puis d'afficher les 3 prochains articles classés par ordre chronologique.
Je pense à quelque chose dans le sens de ceci:
$posts = get_posts('orderby=Rand&numberposts=1');
foreach($posts as $post) {
the_title();
//get next 3 chronological posts and loop
}
Je suppose que j'ai besoin d'utiliser quelque chose comme le paramètre 'offset', mais avec un post id au lieu d'une position?
Pour un décalage aléatoire, nous pourrions essayer:
$ppp = 4;
$total = wp_count_posts()->publish;
$offset = $total < $ppp ? 0 : Rand( 0, $total - $ppp );
$posts = get_posts( [
'posts_per_page' => $ppp,
'offset' => $offset
] );
Prenons $ppp
comme 4 et supposons que $total
vaut 6.
Il y a ensuite trois possibilités pour le $offset
, à savoir 0, 1 et 2:
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
alors
$offset = $total < $ppp ? 0 : Rand( 0, $total - $ppp );
donnerait:
$offset = Rand( 0, 6 - 4 );
ou juste
$offset = Rand( 0, 2 );
Voici une autre approche utilisant un date_query
.
Nous aurons le message aléatoire
Nous utiliserons ensuite un date_query
pour obtenir les 3 autres posts adjacents à celui-ci au hasard.
Voici la fonction que nous allons utiliser: ( NOTE: J'ai a commenté le code pour le rendre facile à suivre, et le code nécessite 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 );
}
Comme vous pouvez le constater, le premier paramètre de la fonction est $args
. Ce sera un tableau d'arguments que vous transmettriez normalement à WP_Query
. Le deuxième paramètre, $direction
, indiquera la direction des publications adjacentes, soit before
ou after
en fonction des besoins.
Vous utiliseriez la fonction comme suit:
$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();