web-dev-qa-db-fra.com

paginate_links () ajoute un href vide à la première page et au lien précédent

C'est vraiment bizarre. En essayant de résoudre ce problème i, je me suis retrouvé avec une utilisation presque parfaite de paginate_links () au lieu d’une fonction de pagination personnalisée:

$myquery = new WP_Query($args);

$paged = get_query_var('page');
($paged == 0 ? $paged = 1 : $paged = $paged);

    $pagination = paginate_links(array(

    'total'     => $myquery->max_num_pages,
    'current'   => $paged,
    'show_all'  => true,
    'type'      => 'list',
));

Cela semblait bien fonctionner. Jusqu'à ce que je découvre que peu importe ce que je fais, chaque fois que je suis après la page 1, la fonction affiche un href="" vide sur mes premiers liens.

Donc, je reçois ces balises:

<!-- base page - example.com/parent-page/child-page/ -->
<!-- same for page 1 - example.com/parent-page/child-page/?page=1 -->
<ul class="page-numbers">
<li><span class="page-numbers current">1</span></li>
<li><a class="page-numbers" href="?page=2">2</li>
<li><a class="page-numbers" href="?page=3">3</li>
<li><a class="page-numbers" href="?page=4">4</li>
<li><a class="next page-numbers" href="?page=2">Next</li>
</ul>

<!-- page 2 - example.com/parent-page/child-page/?page=2 -->
<ul class="page-numbers">
<li><a class="prev page-numbers" href="">Previous</a></li> <!-- empty href="" -->
<li><a class="page-numbers" href="">1</li><!-- empty href="" -->
<li><span class="page-numbers current">2</span></li>
<li><a class="page-numbers" href="?page=3">3</li>
<li><a class="page-numbers" href="?page=4">4</li>
<li><a class="next page-numbers" href="?page=2">Next</li>
</ul>

<!-- page 3 and onwards - example.com/parent-page/child-page/?page=3 -->
<ul class="page-numbers">
<li><a class="prev page-numbers" href="?page=2">Previous</a></li> <!-- correct -->
<li><a class="page-numbers" href="">1</li><!-- empty href="" -->    
<li><a class="page-numbers" href="?page=2">2</li>
<li><span class="page-numbers current">3</span></li>
<li><a class="page-numbers" href="?page=4">4</li>
<li><a class="next page-numbers" href="?page=2"></li>
</ul>

En fouillant dans paginate_links () sur wp-includes/general-template.php (vers la ligne 1954), j’ai constaté que, pour une raison quelconque, il passe explicitement des arguments de liens vides au lien Précédent lorsque vous êtes à la page 2:

if ( $prev_next && $current && 1 < $current ) :
        $link = str_replace('%_%', 2 == $current ? '' : $format, $base);

et au premier lien (ligne 1968)

if ( $show_all || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :
                $link = str_replace('%_%', 1 == $n ? '' : $format, $base);

vous ne pensez pas pourquoi, et s’il est possible de l’éviter sans créer une autre fonction de pagination?

3
moraleida

Avez-vous essayé de spécifier les arguments base et format pour paginate_links()? Il assume les valeurs par défaut de:

    'base' => '%_%',  
    'format' => '?page=%#%',  

Votre base devrait être quelque chose comme /parent-page/child-page/%_%; alors le lien de première page sera vers /parent-page/child-page/, et les liens suivants suivront le format /parent-page/child-page/?page=3 (exemple pour la page 3).

Dans base, le %_% est remplacé par l'argument format.
Dans format, le %#% est remplacé par le numéro de page.

http://codex.wordpress.org/Function_Reference/paginate_links

3
jmdodd

Pour ceux qui sont intéressés, voici le code qui a fonctionné pour moi:

 echo paginate_links( array(
    'current' => max(1, get_query_var('paged')),
    'total' => $wp_query->max_num_pages,
    'base' => get_pagenum_link(1) . '%_%',  
        'format' => 'page/%#%',
) );
7
Dennis

C’est horriblement démodé, mais j’ai eu des problèmes avec ça et j’ai eu les choses suivantes à travailler -

echo paginate_links(array(
    'base'      => remove_query_arg('page', get_pagenum_link(1)).'%_%',
    'current'   => max(1, get_query_var('page')),
    'end_size'  => 2,
    'total'     => $this->items->max_num_pages,
));
2
David Gard