Messages paginés - comment utiliser les numéros et les liens suivants / précédents?

17

Je veux que wp_link_pages (messages multi-pages) 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 le faire sans plugin. Voici ce que j'ai essayé jusqu'à présent, mais cela ne fonctionne pas, il affiche uniquement 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'
)); ?>
AndrettiMilas
la source

Réponses:

12

La fonction que vous utilisez, wp_link_pagesCodex , n'a 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 aux arguments prevet nextqui sont affichés à gauche et à droite de la liste des liens numérotés ( 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 utilise toujours les liens précédent et suivant, vous pouvez modifier légèrement la fonction pour en faire le comportement par défaut chaque fois que number(par défaut) est utilisé, vous devez donc écrire moins dans vos thèmes.

Il s'agit d'une implémentation légèrement différente comme suggéré par Velvet Blues .

hakre
la source
À l'exception de quelques commentaires et des premiers retours, l'implémentation, le nom de l'option et l'explication sont exactement les mêmes que les miens. Suis-je en train d'oublier quelque chose? Quel est l'avantage de votre solution? Merci.
Velvet Blues
Probablement quand je compare le code.
hakre
La solution d'Hakre est disponible tant que la question est là. Les réponses complètes (= compréhensibles sans dépendre de sources externes) sont toujours préférées sur StackExchange.
fuxia
6

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

Cela étant dit, il existe trois façons de le faire sans plug-in:

  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(). Hack très inefficace.
  3. Utilisez un filtre. Méthode préférée . Voir ci-dessous.

J'ai écrit un article sur la façon de procéder sur mon blog. Fondamentalement, j'utilise le filtre wp_link_pages_args et j'ajoute une fonction dans le fichier functions.php qui ajoute une nouvelle option 'next_and_number'.

Hack WordPress: Afficher le numéro et les liens suivants / précédents avec wp_link_pages ()

Velvet Blues
la source
Cool man ... Je pensais à quelque chose utilisant les 4 valeurs globales, mais je n'ai jamais vraiment trouvé de solution ... +1!
Rutwick Gangurde
3

Essayez ceci, vous pouvez le personnaliser davantage. Mais cela devrait faire ce que vous vouliez :-)

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

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
Tareq
la source
comment pouvons-nous gérer? wordpress.org/support/topic/… ou comment ajouter un titre dynamique personnalisé avant le numéro de page.
ravi patel
1

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.

Tapis_
la source
Pour une raison quelconque, cela ne fonctionne pas, mais cela me semble juste. Je me demande s'il y a eu un changement en 3.3 ou si j'ai besoin de coller quelque chose dans functions.php?
AndrettiMilas
2
Oui , j'ai essayé cela aussi, il fonctionne lorsque vous définissez next_or_numberà next. Mais il ne montre que les liens «Suivant» et «Précédent», pas les chiffres!
Rutwick Gangurde
1
J'ai besoin des deux, comme indiqué dans l'exemple.
AndrettiMilas
1

Ce code est sur la boucle des 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 )
);

?>
Caio Alves
la source
Ce code ne fonctionne pas.
AndrettiMilas
Code fixe. Pardon. Certains attributs sont sans valeur.
Caio Alves
1
Cela n'atteint pas les résultats que je cherchais dans ma question, cela montre simplement des chiffres.
AndrettiMilas
0

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

La solution dépend paginate_links(). La seule chose à savoir est que ce basesera l'URl dès le début, ajouté par %_%, qui sera ensuite remplacé par format. Donc, tant que nous utilisons get_permalink().'%_%';, nous savons que nous resterons en tout cas sur le poste actuel. A l'intérieur 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>";
}
kaiser
la source