Comportamiento extraño de paginate_links. El enlace de la primera página es siempre la página en la que estoy, todos los demás enlaces son correctos

2

Estoy usando el siguiente código para generar una paginación:

$wp_query = new WP_Query();
$wp_query->query('posts_per_page=5'.'&paged='.$paged);
$big = 999999999;
echo '<div class="pagination">';
echo paginate_links(array(  'base' => '%_%',
                            'format' => str_replace($big, '%#%', esc_url(get_pagenum_link( $big ))),
                            'current' => max( 1, get_query_var('paged') ),
                            'total' => $wp_query->max_num_pages,
                            'end_size' =>4,
                            'type' => 'list'));     
    echo '</div>';

Está generando mis enlaces correctamente en la primera página, pero si voy a cualquier otra página, todo sigue siendo correcto, excepto que el enlace para la página 1 siempre es la URL de cualquier página en la que esté. Parece que me estoy perdiendo algo simple, ¿alguien sabe una solución?

    
pregunta John B 18.02.2013 - 23:21

3 respuestas

3

Respuesta corta:

Probar

'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',

Respuesta larga:

Eché un vistazo al código fuente paginate_links() ( v3.5.1 ) y existe esta línea ( # )

$link = str_replace('%_%', 1 == $n ? '' : $format, $base);

que te da el enlace de la primera página vacía.

Con tu configuración tienes $base = "%_%" y $format = "http://example.com/page/%#%/" por lo que esto se convierte en:

$link = str_replace('%_%', 1 == $n ? '' : "http://example.com/page/%#%/", "%_%");

donde tenemos dos casos:

n=1:     $link = str_replace('%_%', '', "%_%");

n>1:     $link = str_replace('%_%', "http://example.com/page/%#%/", "%_%");

y después del reemplazo:

n=1:     $link = '';

n>1:     $link = "http://example.com/page/%#%/";

Aquí hay un ejemplo de la salida de paginate_links() :

<ul class='page-numbers'>
    <li><a class="prev page-numbers" href="http://example.com/page/2/">&laquo; Previous</a></li>
    <li><a class='page-numbers' href=''>1</a></li>
    <li><a class='page-numbers' href='http://example.com/page/2/'>2</a></li>
    <li><span class='page-numbers current'>3</span></li>
    <li><a class='page-numbers' href='http://example.com/page/4/'>4</a></li>
    <li><a class='page-numbers' href='http://example.com/page/5/'>5</a></li>
    <li><a class='page-numbers' href='http://example.com/page/6/'>6</a></li>
    <li><a class="next page-numbers" href="http://example.com/page/4/">Next &raquo;</a></li>
</ul>

Si usa en su lugar ( # ):

'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',

entonces obtienes:

$link = str_replace('%_%', 1 == $n ? '' : "?paged=%#%", "http://example.com/page/%#%"); 

Dado que no se realizará ninguna sustitución

$link = "http://example.com/page/%#%";  

en ambos casos (n = 1 y n > 1) y tiene un enlace de primera página no vacío con la salida de paginate_links() :

<ul class='page-numbers'>
    <li><a class="prev page-numbers" href="http://example.com/page/2/">&laquo; Previous</a></li>
    <li><a class='page-numbers' href='http://example.com/page/1/'>1</a></li>
    <li><a class='page-numbers' href='http://example.com/page/2/'>2</a></li>
    <li><span class='page-numbers current'>3</span></li>
    <li><a class='page-numbers' href='http://example.com/page/4/'>4</a></li>
    <li><a class='page-numbers' href='http://example.com/page/5/'>5</a></li>
    <li><a class='page-numbers' href='http://example.com/page/6/'>6</a></li>
    <li><a class="next page-numbers" href="http://example.com/page/4/">Next &raquo;</a></li>
</ul>

Para tener un enlace de primera página que no esté vacío, parece que $format puede ser cualquier cadena siempre y cuando $base no incluya la cadena "%_%" , es decir, estas deberían funcionar bien:

'format' => '?paged=%#%',
'format' => 'page/%#%',
'format' => 'asdfasdfasdfasdfasdf',

Si no usa los enlaces permanentes, entonces el ejemplo en ( # ) también le dejará vacío. enlace de la primera página desde

$link = str_replace('%_%', 1 == $n ? '' : "?paged=%#%", "http://example.com/?paged=%#%");   

con reemplazos.

    
respondido por el birgire 19.02.2013 - 03:27
1

Gracias a Birgire por su ayuda. Estoy compartiendo el resultado de mis paginate_links () que trabajan con páginas de taxonomía personalizadas exactamente como lo necesito.

Espero que esto ayude a alguien a arreglarlo lo más rápido posible.

Así que aquí está:

if (empty($pagerange)) {
    $pagerange = 2;
}
global $paged;
if (empty($paged)) {
    $paged = 1;
}
if ($numpages == '') {
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if(!$numpages) {
        $numpages = 1;
    }
}        
    $pagination_args = array(
     'base'            => str_replace('%_%', 1 == $paged ? '' : "?page=%#%", "?page=%#%"),
     'format'          => '?page=%#%',
     'total'           => $numpages,
     'current'         => $paged,
     'show_all'        => False,
     'end_size'        => 1,
     'mid_size'        => $pagerange,
     'prev_next'       => True,
     'prev_text'       => __('<i class="fa fa-angle-left"></i>'),
     'next_text'       => __('<i class="fa fa-angle-right"></i>'),
     'type'            => 'list',
     'add_args'        => false,
     'add_fragment'    => ''
    );

$paginate_links = paginate_links($pagination_args);

if ($paginate_links) {
    echo "<nav class='custom-pagination'><ul>";
    echo $paginate_links;
    echo "</ul></nav>";
}
    
respondido por el PapaSoft 23.06.2016 - 11:44
0

Me encontré con un mismo problema y descubrí que puedo reemplazarlo:

'current' => max( 1, get_query_var('paged') ),

con:

'current' => max( 1, get_query_var('page') ),

Así que solo cambié el nombre de 'paginado' > 'página' en la consulta var y funciona.

    
respondido por el Bobz 30.06.2016 - 10:48

Lea otras preguntas en las etiquetas