web-dev-qa-db-fra.com

Articles paginés - comment utiliser les nombres et les liens suivants/précédents?

Je veux que wp_link_pages (messages multiples) affiche les numéros de page, le mot "précédent" avant ces numéros et un "suivant" après ces numéros. Cela ressemblerait à ceci:

Précédent 1, 2, 3, 4 Suivant

J'essaie de faire ceci sans un plugin. Voici ce que j'ai essayé jusqu'à présent, mais ça ne marche pas, c'est seulement d'afficher des chiffres.

<?php wp_link_pages(array(
    'before' => '<span style="clear:both; display:block">Pages', 
    'after'  => '</span>',
    'next_or_number'=>'number',
    'previouspagelink' => 'previous',
    'nextpagelink'=> 'Next'
)); ?>
17
AndrettiMilas

La fonction que vous utilisez, wp_link_pages Codex   , ne possède pas la fonctionnalité que vous recherchez par défaut.

Cependant, vous pouvez facilement l'étendre en utilisant une fonction de rappel enregistrée en tant que filtre sur les arguments de cette fonction:

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

Le filtre modifiera ensuite les paramètres utilisés dans cette fonction à la volée et injectera les liens manquants dans les arguments prev et next qui sont affichés à gauche et à droite du numéroté. liste de liens (next_or_number' => 'number'):

/**
 * Add prev and next links to a numbered page link list
 */
function wp_link_pages_args_prevnext_add($args)
{
    global $page, $numpages, $more, $pagenow;

    if (!$args['next_or_number'] == 'next_and_number') 
        return $args; # exit early

    $args['next_or_number'] = 'number'; # keep numbering for the main part
    if (!$more)
        return $args; # exit early

    if($page-1) # there is a previous page
        $args['before'] .= _wp_link_page($page-1)
            . $args['link_before']. $args['previouspagelink'] . $args['link_after'] . '</a>'
        ;

    if ($page<$numpages) # there is a next page
        $args['after'] = _wp_link_page($page+1)
            . $args['link_before'] . ' ' . $args['nextpagelink'] . $args['link_after'] . '</a>'
            . $args['after']
        ;

    return $args;
}

Usage:

wp_link_pages(array(
    'before' => '<p>' . __('Pages:'),
    'after' => '</p>',
    'next_or_number' => 'next_and_number', # activate parameter overloading
    'nextpagelink' => __('Next'),
    'previouspagelink' => __('Previous'),
    'pagelink' => '%',
    'echo' => 1 )
);

Si votre thème always utilise les liens prev et next, vous pouvez alors modifier légèrement la fonction pour en faire le comportement par défaut à chaque fois que number (la valeur par défaut) est utilisée. Vous devez donc écrire moins dans vos thèmes.

Ceci est une implémentation légèrement différente de suggérée par Velvet Blues .

12
hakre

La fonction wp_link_pages() n'affiche que soit texte ou nombre, jamais les deux. Si vous regardez le code de la fonction, vous verrez qu'il n'y a pas d'option pour la faire se comporter différemment en passant des paramètres.

Cela étant dit, il y a trois façons de faire cela sans plugin:

  1. Créez votre propre fonction dans le fichier functions.php de votre thème. Fonctionne, mais vous auriez alors une nouvelle fonction.
  2. Utilisez 2-3 instances de wp_link_pages(). bidouille très inefficace.
  3. Utilisez un filtre. Méthode préférée . Voir ci-dessous.

J'ai écrit un article sur comment faire cela sur mon blog. Fondamentalement, j'utilise le wp_link_pages_args filter et ajoute une fonction dans le fichier functions.php qui ajoute une nouvelle option, "next_and_number".

WordPress Hack: Numéro d'affichage & liens suivant/précédent avec wp_link_pages ()

6
Velvet Blues

Essayez ceci, vous pouvez plus le personnaliser. Mais ça devrait faire ce que tu voulais :-)

function tp_link_pages() {
    global $page, $numpages;

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
3
Tareq

Ce code est sur la boucle de messages? Le codage me convient. Voici l'exemple du Codex sur la façon d'utiliser:

<?php

wp_link_pages(array(
    'before' => '<p>' . __('Pages:'),
    'after' => '</p>',
    'next_or_number' => 'number',
    'nextpagelink' => __('Next page'),
    'previouspagelink' => __('Previous page'),
    'pagelink' => '%',
    'echo' => 1 )
);

?>
1
Caio Alves

Je ne comprends pas quel est le problème ... Avez-vous une erreur?

Cela devrait fonctionner:

<?php $args = array(
    'before'           => '<span style="clear:both; display:block">Pages',
    'after'            => '</span>',
    'nextpagelink'     => __('Next'),
    'previouspagelink' => __('Previous')
); 

wp_link_pages($args);
?> 

Vous n'avez pas besoin d'ajouter next_or_number car number est déjà la valeur par défaut.

1
Mat_

La réponse est différente, mais cela a été inspiré par @ 无 灯 qui a décidé de supprimer sa réponse. A mon avis, c'est la meilleure solution, la plus simple et la plus flexible:

La solution dépend de paginate_links() . La seule chose à savoir est que base sera l'URL du début, ajoutée par %_%, qui sera ensuite remplacée par format. Donc, tant que nous utilisons get_permalink().'%_%';, nous savons que nous resterons dans tous les cas sur le poste en cours. Dans format, le # est remplacé par le numéro de page:

function wpse37256_paginate_paged()
{
    if ( ! $paginate_links = paginate_links( array(
         'type'      => 'array'

        ,'total'     => $GLOBALS['numpages']
        ,'mid_size'  => 1
        ,'end_size'  => 1

        #,'prev_next' => false
        ,'prev_text' => '&laquo; '.__( 'Prev', 'your_textdomain' )
        ,'next_text' => __( 'Next', 'your_textdomain' ).' &raquo;'

        ,'base'      => get_permalink().'%_%'
        ,'format'    => user_trailingslashit( '%#%' )

        ,'current'   => $GLOBALS['page']
    ) ) )
        return;

    echo "<div class='pagination-container'>{$paginate_links}</div>";
}
0
kaiser