¿paginate_links() no funciona correctamente en search.php?

1 sept 2012, 20:54:46
Vistas: 20.5K
Votos: 6

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
4
Comentarios

Muestra la consulta para esta solicitud.

kaiser kaiser
1 sept 2012 21:14:28

Actualicé mi pregunta con mi plantilla search.php. No hay ningún bucle dentro de search-result.php, solo HTML simple.

mathiregister mathiregister
1 sept 2012 21:27:28

¿Revisaste las preguntas anteriores relacionadas con paginate_links()?

Chip Bennett Chip Bennett
1 sept 2012 21:33:38

He leído y buscado en Google durante bastante tiempo pero no parece haber una solución. ¿Alguna idea?

mathiregister mathiregister
1 sept 2012 21:47:34
Todas las respuestas a la pregunta 2
6
11

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' => '&lt;&lt;',
        'next_text' => '&gt;&gt;'
    );

    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 );
}
2 sept 2012 00:34:18
Comentarios

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

mathiregister mathiregister
2 sept 2012 09:59:33

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.

Chip Bennett Chip Bennett
2 sept 2012 17:08:25

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.

Chip Bennett Chip Bennett
2 sept 2012 17:16:27

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.

mathiregister mathiregister
2 sept 2012 17:55:09

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

Chip Bennett Chip Bennett
3 sept 2012 21:23:14

Acabo de probar esto y get_query_var('paged') solo funciona bien. No hay necesidad de extraer esto del global.

kaiser kaiser
25 sept 2012 04:55:34
Mostrar los 1 comentarios restantes
1

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.

1 sept 2012 22:36:43
Comentarios

Gracias por tu respuesta. No es el get_template_part() porque también he intentado insertar el código de la plantilla directamente en el bucle. Y la técnica de paginación que publicaste en tu comentario no hace diferencia - el mismo efecto.

mathiregister mathiregister
1 sept 2012 22:50:13