La función de paginación se basa en $wp_query->max_num_pages
(es decir, el número máximo de páginas para la consulta principal), por lo que la función no funcionará con consultas personalizadas:
function understrap_pagination( $args = array(), $class="pagination" ) {
if ( $GLOBALS['wp_query']->max_num_pages <= 1 ) {
return;
}
...
}
Y si bien su enfoque funciona, realmente no es una buena idea alterar el panorama global. $wp_query
porque hacerlo es esencialmente lo mismo que usar query_posts()
que no se recomienda en absoluto; puede ver por qué consultando los documentos aquí.
Sin embargo, si no desea editar la función de paginación (o crear una propia), entonces una solución alternativa menos riesgosa para que la paginación funcione con su consulta personalizada es cambiar temporalmente el — y Solo el — $wp_query->max_num_pages
:
$orig_max_num_pages = $wp_query->max_num_pages; // backup
// Change it just for the pagination.
// and $latestArticles is your custom WP_Query instance.
$wp_query->max_num_pages = $latestArticles->max_num_pages;
$paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 );
understrap_pagination( [
'current' => $paged,
] );
$wp_query->max_num_pages = $orig_max_num_pages; // restore
Plantilla de página de muestra basada en su código original.
Una mejor práctica: copiar/editar la paginación función.
Ya que estás usando un tema infantily que Understrap usa locate_template()
para cargar el archivo (inc/pagination.php
) que define la función de paginación, simplemente puede copiar el archivo en el tema secundario (your-theme/inc/pagination.php
) y edite la función para que funcione con custom WP_Query
consultas O ya que la función es conectable (es decir, definida con un if ( ! function_exists() )
bloque), simplemente puede copiar el código en el tema de su hijo functions.php
archivo.
Puede usar esta función modificada (que funciona bien para mí) o usarla como referencia para crear la suya propia:
function understrap_pagination( $args = array(), $class="pagination" ) { $args = wp_parse_args( $args, array( 'mid_size' => 2, 'prev_next' => true, 'prev_text' => __( '«', 'understrap' ), 'next_text' => __( '»', 'understrap' ), 'screen_reader_text' => __( 'Posts navigation', 'understrap' ), 'type' => 'array', 'current' => max( 1, get_query_var( 'paged' ) ), 'total' => $GLOBALS['wp_query']->max_num_pages, ) ); // Nothing to paginate, so let's bail. if ( ! $links = paginate_links( $args ) ) { return; } ?> <nav aria-label="<?php echo $args['screen_reader_text']; ?>"> <ul class="pagination"> <?php foreach ( $links as $key => $link ) { ?> <li class="page-item <?php echo strpos( $link, 'current' ) ? 'active' : ''; ?>"> <?php echo str_replace( 'page-numbers', 'page-link', $link ); ?> </li> <?php } ?> </ul> </nav> <?php }
Luego, en su plantilla, llame a la función así:
$paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 ); understrap_pagination( [ 'current' => $paged, 'total' => $latestArticles->max_num_pages, ] );
Plantilla de página de muestra basada en su código original.
paged
contra page
paged
y page
son los dos número de la página actualsin embargo:
paged
se utiliza con solicitudes/URL basadas en archivos, como archivos de categorías y páginas de resultados de búsqueda. Sobre estas solicitudes,page
no está configurado de forma predeterminada. También hay que señalar quepaged
se usa conis_paged()
.page
se utiliza con solicitudes/URL singulares, como páginas de publicación y página únicas. Sobre estas solicitudes,paged
no está configurado de forma predeterminada.
Y el Códice recomienda el siguiente enfoque para obtener el número de página adecuado en solicitudes/URL singulares:
if ( get_query_var( 'paged' ) ) { $paged = get_query_var( 'paged' ); }
elseif ( get_query_var( 'page' ) ) { $paged = get_query_var( 'page' ); }
else { $paged = 1; }
O una versión más simple: $paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 );
NB: ese artículo del Codex se refiere a la portada estática, pero la información también se aplica a cualquier página/publicación.
Y por último pero no menos importante… con secundaria WP_Query
llamadas (como su $latestArticles = new WP_Query( $args )
), solo tienes que llamar wp_reset_postdata()
y sin necesidad de llamar wp_reset_query()
. 🙂
.