Paginación con consulta personalizada
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.

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

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();
.

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