Muestra 4 publicaciones cronológicas comenzando con una publicación aleatoria

2

Sé que puedo mostrar 4 publicaciones aleatorias haciendo algo como:

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

Lo que estoy tratando de lograr es comenzar con un elemento aleatorio, pero luego mostrar las siguientes 3 publicaciones en orden cronológico.

Estoy pensando en algo como esto:

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

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

    //get next 3 chronological posts and loop
} 

Supongo que necesito usar algo como el parámetro 'offset', pero con un ID de publicación en lugar de una posición?

    
pregunta Adam Lobo 26.10.2015 - 16:38

2 respuestas

2

Para un desplazamiento aleatorio podríamos intentar:

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

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

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

Ejemplo:

Tomemos $ppp como 4 y asumamos que $total es 6.

Entonces hay tres posibilidades para el $offset , a saber 0, 1 y 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

entonces

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

daría:

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

o simplemente

$offset = rand( 0, 2 );
    
respondido por el birgire 26.10.2015 - 17:24
2

Aquí hay otro enfoque usando un date_query .

  • Obtendremos la única publicación aleatoria

  • Luego usaremos date_query para obtener las otras 3 publicaciones adyacentes a esa publicación aleatoria

Aquí está la función que usaremos: ( NOTA: he comentado el código para facilitar su seguimiento, y el código requiere 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 );
}

Como puede ver, el primer parámetro en la función es $args . Esta será una matriz de argumentos que normalmente pasaría a WP_Query . El segundo parámetro, $direction será la dirección de las publicaciones adyacentes, ya sea before o after según las necesidades.

Deberías usar la función de la siguiente manera:

$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();
    
respondido por el Pieter Goosen 26.10.2015 - 18:14

Lea otras preguntas en las etiquetas