Paginación con consulta personalizada

12 jul 2014, 19:37:34
Vistas: 25.3K
Votos: 3

Estoy tratando de crear una plantilla de página personalizada que muestre los posts más vistos. Puedo mostrar los posts pero estoy teniendo problemas para implementar la paginación. Esto es lo que tengo:

$args = array('orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
            $loop = new WP_Query( $args );
            while ( $loop->have_posts() ) : $loop->the_post();

Intenté esto:

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; 
            $args = array('paged' => $paged, 'orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
            $loop = new WP_Query( $args );
            while ( $loop->have_posts() ) : $loop->the_post();

pero mi paginación aún no aparece. Me pregunto si tiene que ver con mi función de paginación o con la forma en que estoy configurando mi consulta.

Simplemente llamo a mi función de paginación debajo de la consulta, todo se ve así:

<?php
            $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; 
            $args = array('paged' => $paged, 'orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
            $loop = new WP_Query( $args );
            while ( $loop->have_posts() ) : $loop->the_post();?>
                <?php get_template_part( 'content', get_post_format() ); ?>
            <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>

<?php pagination(); ?>

Esta es mi función de paginación:

if ( ! function_exists( 'pagination' ) ) :
    function pagination() {
        global $wp_query;

        $big = 999999999; // necesitamos un número entero improbable

        echo paginate_links( array(
            'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'format' => '?paged=%#%',
            'current' => max( 1, get_query_var('paged') ),
            'total' => $wp_query->max_num_pages,
            'mid_size' => 1,
            'prev_text'    => __('«'),
            'next_text'    => __('»'),
            'type'         => 'list'
        ) );
    }
endif;

Cualquier ayuda sería muy apreciada.

5
Comentarios

Parece que estás haciendo una consulta local, donde la paginación está usando una variable de consulta global. Reemplaza esta línea - $loop = new WP_Query( $args ); por query_posts( $args ). También reemplaza - $loop->have_posts() ) : $loop->the_post() por have_posts() ) : the_post(). Y no necesitas usar wp_reset_postdata().

Shazzad Shazzad
12 jul 2014 20:35:27

He escuchado que no deberías usar query_posts para generar un bucle personalizado.

justinw justinw
12 jul 2014 20:39:29

Esa es la mejor práctica. Usar paginación global (get_query_var('paged')) en una consulta personalizada tampoco es una buena práctica. Sin embargo, estoy escribiendo una respuesta en unos segundos.

Shazzad Shazzad
12 jul 2014 20:45:14

Encontré una publicación sobre esto. Usar ese método funciona bastante bien.

justinw justinw
12 jul 2014 20:46:35

Encontré la solución: Paginación de entradas en WordPress

Fefar Ravi Fefar Ravi
5 oct 2021 19:37:36
Todas las respuestas a la pregunta 3
1

Este es un problema de variable local/global. Se puede resolver cambiando la función de paginación para que trabaje con variables locales, o promoviendo la variable local a un ámbito global. Como estás usando wp_reset_postdata(), supongo que quieres mantener la consulta original.

Cambiar la función de paginación para aceptar argumentos -

if ( ! function_exists( 'pagination' ) ) :

    function pagination( $paged = '', $max_page = '' ) {
        $big = 999999999; // necesitamos un entero improbable
        if( ! $paged ) {
            $paged = get_query_var('paged');
        }

        if( ! $max_page ) {
            global $wp_query;
            $max_page = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
        }

        echo paginate_links( array(
            'base'       => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'format'     => '?paged=%#%',
            'current'    => max( 1, $paged ),
            'total'      => $max_page,
            'mid_size'   => 1,
            'prev_text'  => __( '«' ),
            'next_text'  => __( '»' ),
            'type'       => 'list'
        ) );
    }
endif;

Y el template del loop sería así -

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; 
$args = array(
    'paged'          => $paged, 
    'orderby'        => 'meta_value_num', 
    'meta_key'       => 'post_views_count', 
    'posts_per_page' => 36 
);
$loop = new WP_Query( $args );

if ( $loop->have_posts() ) :
    while ( $loop->have_posts() ) : 
        $loop->the_post();
        get_template_part( 'content', get_post_format() );
    endwhile;

    pagination( $paged, $loop->max_num_pages); // Función de Paginación
endif;

wp_reset_postdata();
12 jul 2014 20:49:22
Comentarios

Un montón de gracias

Muhammad Mehran Khan Attari Muhammad Mehran Khan Attari
11 sept 2020 14:26:41
1

Prueba esto...

$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
    'orderby' => 'meta_value_num',
    'meta_key' => 'post_views_count',
    'posts_per_page' => 36,
    'paged' => $paged
    );

$loop = new WP_Query( $args );
if ( $loop->have_posts() ) :
    while ( $loop->have_posts() ) : $loop->the_post();

            get_template_part( 'content', get_post_format() );

    endwhile;

    pagination(); // Función de Paginación

endif;
wp_reset_postdata();

La paginación debe agregarse antes del wp_reset_postdata();.

12 jul 2014 19:58:07
Comentarios

Desafortunadamente, no se paginó.

justinw justinw
12 jul 2014 20:21:25
0

También me encontré con ese problema y lo resolví de esta manera

Función de paginación

function post_pagination($paged = '', $max_page = '') {
    if (!$paged) {
        $paged = (get_query_var('paged')) ? get_query_var('paged') : ((get_query_var('page')) ? get_query_var('page') : 1;
    }

    if (!$max_page) {
        global $wp_query;
        $max_page = isset($wp_query->max_num_pages) ? $wp_query->max_num_pages : 1;
    }

    $big  = 999999999; // necesitamos un entero improbable

    $html = paginate_links(array(
        'base'       => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
        'format'     => '?paged=%#%',
        'current'    => max(1, $paged),
        'total'      => $max_page,
        'mid_size'   => 1,
        'prev_text'  => __('« Anterior'),
        'next_text'  => __('Siguiente »'),
    ));

    $html = "<div class='navigation pagination'>" . $html . "</div>";

    echo $html;
}

Consulta en la plantilla personalizada

$paged = (get_query_var('paged')) ? get_query_var('paged') : ((get_query_var('page')) ? get_query_var('page') : 1);

$args = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => get_option('posts_per_page'),
    'order' => 'DESC',
    'orderby' => 'date',
    'paged' => $paged
);

$loop = new WP_Query($args);
if ($loop->have_posts()) :
    while ($loop->have_posts()) :
        $loop->the_post();
        get_template_part('content', get_post_format());
    endwhile;

    post_pagination($paged, $loop->max_num_pages);
endif;

wp_reset_postdata();
3 mar 2022 22:18:27