¿paginate_links() no funciona correctamente en search.php?
Estoy usando esto en mi plantilla search.php...
<div class="pagination">
<?php echo get_pagination_links(); ?>
</div>
Y esta es la función...
function get_pagination_links() {
global $wp_query;
$big = 999999999;
return 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,
'prev_next' => false
) );
}
-
La salida funciona: Si busco "test" y hay más de 10 resultados, la paginación muestra 1 2
donde 2
es un enlace. Al hacer clic en la página 2
, la barra de direcciones se actualiza correctamente a mysite.com/search/test/page/2
pero la página resultante sigue siendo la número 1
.
Siguen apareciendo los mismos resultados que en la página número 1
y los enlaces de paginación siguen siendo los mismos - 2
sigue siendo el enlace y 1
es la página actual.
¿Alguna idea de por qué podría suceder esto?
Actualización
Aquí es donde se llama la función personalizada en la plantilla:
<?php
/**
* La plantilla para mostrar páginas de Resultados de Búsqueda
*/
get_header(); ?>
<?php if ( have_posts() ) : ?>
<hgroup class="section-heading wrapper">
<h1>Resultados</h1>
</hgroup>
<section id="results">
<?php while ( have_posts() ) : the_post(); ?>
<ul class="event-items">
<?php get_template_part( 'inc/search', 'result' ); ?>
</ul>
<?php endwhile; ?>
</section>
<div class="pagination tiny wrapper">
<?php echo get_pagination_links(); ?>
</div>
<?php else : ?>
<div class="wrapper">
<h2>No se encontró nada</h2>
</div>
<?php endif; ?>
<?php get_footer(); ?>
Edición
Usando el código recomendado de la respuesta de abajo:
/**
* Enlaces de paginación para búsqueda y archivos
*/
function get_pagination_links() {
global $wp_query;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
$big = 999999999;
return paginate_links( array(
'base' => @add_query_arg('paged','%#%'),
'format' => '?paged=%#%',
'current' => $current,
'total' => $wp_query->max_num_pages,
'prev_next' => false
) );
}
La paginación funciona ahora, sin embargo, los "permalinks" no son exactamente como quiero que sean. Uso custom_pagination_base()
para tener esta estructura de permalinks:
mypage.com/search/term/seite/2
(donde "seite" es la palabra alemana para "página").
¿Es posible mantener los permalinks funcionando así? La paginación funciona con tu código, solo que los permalinks se ven así:
mypage.com/search/term?paged=2

Estoy bastante seguro de que esto ya está respondido en otro lugar, pero lo agregaré aquí nuevamente.
Creo que tu problema está aquí:
'current' => max( 1, get_query_var('paged') ),
Prueba esto en su lugar:
global $wp_query;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
...y luego:
'current' => $current;
Tu 'base'
también puede ser un problema. En lugar de esto:
$big = 999999999;
//...
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) )
Yo uso esto:
'base' => @add_query_arg('paged','%#%')
Edición
Por si es útil, aquí está mi función completa de envoltura para paginate_links()
:
/**
* Paginación de enlaces de página de índice de archivo
*/
function oenology_get_paginate_archive_page_links( $type = 'plain', $endsize = 1, $midsize = 1 ) {
global $wp_query, $wp_rewrite;
$current = get_query_var( 'paged' ) > 1 ? get_query_var('paged') : 1;
// Sanitizar valores de argumentos de entrada
if ( ! in_array( $type, array( 'plain', 'list', 'array' ) ) $type = 'plain';
$endsize = absint( $endsize );
$midsize = absint( $midsize );
// Configurar array de argumentos para paginate_links()
$pagination = array(
'base' => @add_query_arg( 'paged', '%#%' ),
'format' => '',
'total' => $wp_query->max_num_pages,
'current' => $current,
'show_all' => false,
'end_size' => $endsize,
'mid_size' => $midsize,
'type' => $type,
'prev_text' => '<<',
'next_text' => '>>'
);
if ( $wp_rewrite->using_permalinks() )
$pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ).'page/%#%/', 'paged' );
if ( ! empty( $wp_query->query_vars['s'] ) )
$pagination['add_args'] = array( 's' => get_query_var( 's' ) );
return paginate_links( $pagination );
}

Gracias señor. Perfecto, pero un último detalle. Actualicé mi pregunta arriba con tu código. La paginación ahora funciona pero los "permalinks" no son exactamente como los quiero. Uso custom_pagination_base()
para tener esta estructura de permalink mipagina.com/buscar/termino/pagina/2
donde pagina
es la palabra en español para page. ¿Es posible mantener los permalinks funcionando así? La paginación funciona con tu código, solo que los permalinks se ven así: mipagina.com/buscar/termino?paged=2

Mira la respuesta actualizada. He añadido mi función completa. También: ten cuidado con cómo editas tu pregunta. Si sobrescribes tu código original, es difícil para lectores posteriores seguir el flujo pregunta-respuesta. Usualmente es mejor conservar el código original y luego agregar nuevo código a la pregunta. Editaré tu pregunta para darte una idea de lo que quiero decir.

Para abordar tu pregunta específica de seguimiento, revisa el ternario $pagination['base']
cerca del final de la función. Creo que deberías poder adaptar esa línea para satisfacer tus necesidades.

Gracias. Sin embargo, parece que tengo un problema en otro lugar. Al usar tu código, la paginación no funciona nuevamente - el mismo comportamiento exacto mencionado en mi pregunta anterior. El enlace clickeado no actualiza la vista y la paginación no funciona. Si descomento tus últimos dos bloques if
en tu función (las líneas relacionadas con los permalinks) tu función funciona bien nuevamente. Así que todo funciona bien excepto por la parte con la reescritura de ?paged
en la URL misma. ¿Alguna otra idea de dónde podría venir esto? Gracias nuevamente por tu increíble ayuda hasta ahora.

Sospecho que el problema son tus reglas de reescritura personalizadas. Esa es la parte de mi función que has modificado...

Aunque esta no es una solución que use exactamente tu código, quizás puedas intentar utilizar esta técnica de paginación en lugar del ejemplo que has utilizado del WordPress Codex.
Supongo que el problema podría estar en que obtienes la parte de la plantilla con esta línea de código:
<?php get_template_part( 'inc/search', 'result' ); ?>
Si esto no resuelve tu problema, recomendaría traer el contenido de 'inc/search' e incluirlo directamente en tu página de resultados de búsqueda sin usar <?php get_template_part(); ?>
- podría ayudarte a detectar cualquier anomalía.
