web-dev-qa-db-fra.com

Afficher 4 messages chronologiques commençant par un message aléatoire

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?

2
Adam Lobo

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
] );

Exemple:

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 );
2
birgire

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();
2
Pieter Goosen