web-dev-qa-db-fra.com

paginate_links ignore mon format

J'ai besoin de la pagination pour avoir l'URL, comme:

current_url?p-page=1
current_url?p-page=2
current_url?p-page=3

Et ainsi .. La raison pour laquelle j'ai besoin de cela est parce que j'ai d'autres paramètres dans la page.

le problème est que dans la documentation, il spécifie:

format

(chaîne) (facultatif) Utilisé pour la structure de pagination. La valeur par défaut est '? Page =% #%'. Si vous utilisez de jolis permaliens, ce serait '/ page /% #%', où '% #%' est remplacé par le numéro de page. Par défaut: '? Page =% #%'

Et j'ai une URL amicale activée,

Comment puis-je empêcher la valeur par défaut (BTW ignore mon p-page, toujours en utilisant page)

current_url/page/1
current_url/page/2
current_url/page/3

c'est mon code, maintenant:

echo paginate_links( array(
    'base'         => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),
    'total'        => $query->max_num_pages,
    'current'      => max( 1, get_query_var( 'p-page' ) ),
    'format'       => '?p-page=%#%',
    'show_all'     => false,
    'type'         => 'plain',
    'end_size'     => 2,
    'mid_size'     => 1,
    'prev_next'    => true,
    'prev_text'    => sprintf( '<i></i> %1$s', '<i class="icon-chevron-left"></i>' ),
    'next_text'    => sprintf( '%1$s <i></i>', '<i class="icon-chevron-right"></i>' ),
    'add_args'     => false,
    'add_fragment' => '',
) );

Comme solution temporaire, je le fais comme ceci:

if ($current_page > 1) {
    echo '<a href="?p-page='.($current_page-1).'" class="page-numbers prev"><i class="icon-chevron-left"></i></a>';
}
for ($i = 1; $i <= $query->max_num_pages; $i++) {
    echo '<a href="?p-page='.$i.'" class="page-numbers '.($current_page == $i ? 'current' : '').'">'.$i.'</a>';
}
if ($current_page < $query->max_num_pages) {
    echo '<a href="?p-page='.($current_page+1).'" class="page-numbers prev"><i class="icon-chevron-right"></i></a>';
}

Mais serait-il bien de tirer parti de la fonctionnalité des points et donc .. une idée?

3
Toni Michel Caubet

Cette partie:

'base' => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),

génère une pièce page comme celle-ci:

'base' => http://example.tld/page/%#%/

Si nous jetons un coup d'oeil dans paginate_links() nous voyons le défaut:

'base' => $pagenum_link, // http://example.com/all_posts.php%_% : 
                         // %_% is replaced by format (below)
'format' => $format,     // ?page=%#% : %#% is replaced by the page number

où le commentaire en ligne indique que %_% est remplacé par le format.

La documentation dit aussi:

Un exemple d'argument ‘base’ est "http://example.com/all_posts.php%_%" et le ‘%_%’ est requis. Le ‘%_%’ sera remplacé par le contenu de l'argument ‘format’. ‘format’ est un exemple de l’argument "?page=%#%". ‘% #%’ Est également requis. Le ‘%#%’ sera remplacé par le numéro de page.

Si on utilise ça:

'base' => '%_%'

alors, il deviendra le même que l'argument format.

Voici une modification de l'exemple d'OP:

echo paginate_links( 
    [
        'base'         => '%_%',
        'total'        => $query->max_num_pages,
        'current'      => $current,
        'format'       => '?p-page=%#%',
        'show_all'     => false,
        'type'         => 'plain',
        'end_size'     => 2,
        'mid_size'     => 1,
        'prev_next'    => true,
        'prev_text'    => '<i></i> <i class="icon-chevron-left"></i>',
        'next_text'    => '<i class="icon-chevron-right"></i> <i></i>',
        'add_args'     => false,
        'add_fragment' => '',
    ]
);

où nous utilisons:

$current   = max( 1, (int) filter_input( INPUT_GET, 'p-page' ) );

cela ira aussi dans l'argument WP_Query de $query:

'paged' => $current,

Exemple de sortie pour ?p-page=6:

<a class="prev page-numbers" href="?p-page=5"><i></i> <i class="icon-chevron-left"></i></a>
<a class='page-numbers' href=''>1</a>
<a class='page-numbers' href='?p-page=2'>2</a>
<span class="page-numbers dots">&hellip;</span>
<a class='page-numbers' href='?p-page=5'>5</a>
<span class='page-numbers current'>6</span>
<a class='page-numbers' href='?p-page=7'>7</a>
<span class="page-numbers dots">&hellip;</span>
<a class='page-numbers' href='?p-page=99'>99</a>
<a class='page-numbers' href='?p-page=100'>100</a>
<a class="next page-numbers" href="?p-page=7"><i class="icon-chevron-right"></i> <i></i></a>

ps: Il n'est pas nécessaire que sprintf associe deux chaînes statiques, comme nous le voyons dans l'OP pour prev_text et next_text. Actuellement, cette partie semble fausse dans l'extrait de code d'origine, je l'ai donc supprimée.


J'espère que ça aide!

4
birgire