Post paginati - come usare numeri e link precedente/successivo?

24 dic 2011, 21:04:23
Visualizzazioni: 18.8K
Voti: 17

Voglio che wp_link_pages (per post multi-pagina) visualizzi i numeri di pagina, la parola "precedente" prima di questi numeri e un "successivo" dopo. Dovrebbe apparire così:

Prec 1, 2, 3, 4 Succ

Sto cercando di farlo senza usare plugin. Ecco cosa ho provato finora, ma non funziona, mostra solo i numeri.

<?php wp_link_pages(array(
    'before' => '<span style="clear:both; display:block">Pagine',  // Testo prima della paginazione
    'after'  => '</span>',  // Chiusura del contenitore 
    'next_or_number'=>'number',  // Mostra solo numeri
    'previouspagelink' => 'Precedente',  // Testo link pagina precedente
    'nextpagelink'=> 'Successivo'  // Testo link pagina successiva
)); ?>
0
Tutte le risposte alla domanda 6
5
14

La funzione che stai utilizzando, wp_link_pages­Codex, non ha la funzionalità che cerchi di default.

Tuttavia puoi facilmente estenderla utilizzando una funzione di callback, registrata come filtro sugli argomenti di quella funzione:

add_filter('wp_link_pages_args', 'wp_link_pages_args_prevnext_add');

Il filtro modificherà quindi i parametri utilizzati in quella funzione al volo e inserirà i link mancanti agli argomenti prev e next che vengono visualizzati rispettivamente a sinistra e a destra della lista numerata di link (next_or_number' => 'number'):

/**
 * Aggiunge link prev e next a una lista numerata di pagine
 */
function wp_link_pages_args_prevnext_add($args)
{
    global $page, $numpages, $more, $pagenow;

    if ($args['next_or_number'] !== 'next_and_number') 
        return $args; # uscita anticipata

    $args['next_or_number'] = 'number'; # mantiene la numerazione per la parte principale
    if (!$more)
        return $args; # uscita anticipata

    if ($page - 1) # c'è una pagina precedente
        $args['before'] .= _wp_link_page($page-1)
            . $args['link_before']. $args['previouspagelink'] . $args['link_after'] . '</a>'
        ;

    if ($page < $numpages) # c'è una pagina successiva
        $args['after'] = _wp_link_page($page+1)
            . $args['link_before'] . ' ' . $args['nextpagelink'] . $args['link_after'] . '</a>'
            . $args['after']
        ;

    return $args;
}

Utilizzo:

wp_link_pages(array(
    'before' => '<p>' . __('Pagine:'),
    'after' => '</p>',
    'next_or_number' => 'next_and_number', # attiva l'overload del parametro
    'nextpagelink' => __('Successiva'),
    'previouspagelink' => __('Precedente'),
    'pagelink' => '%',
    'echo' => 1 )
);

Se il tuo tema utilizza sempre i link prev e next, potresti modificare leggermente la funzione per renderlo il comportamento predefinito ogni volta che viene usato number (il default), così da dover scrivere meno nel tuo tema.

Questa è un'implementazione leggermente diversa da quella suggerita da Velvet Blues.

31 dic 2011 19:54:21
Commenti

A parte qualche commento e return anticipati, l'implementazione, il nome dell'opzione e la spiegazione sono esattamente uguali ai miei. Sto tralasciando qualcosa? Quale vantaggio offre la tua soluzione? Grazie.

Velvet Blues Velvet Blues
31 dic 2011 20:26:19

Probabilmente quando confronto il codice.

hakre hakre
31 dic 2011 20:34:55

La soluzione di Hakre è disponibile finché la domanda è qui. Risposte complete (= comprensibili senza fare affidamento a fonti esterne) sono sempre preferite su StackExchange.

fuxia fuxia
31 dic 2011 20:40:37

La differenza è che @hakre ha introdotto un errore. In questa riga di codice: if (!$args['next_or_number'] == 'next_and_number') mancano le parentesi, quindi $args viene negato prima della valutazione logica, dovrebbe essere: if (!($args['next_or_number'] == 'next_and_number')) o meglio ancora if($args['next_or_number']!='next_and_number')

deviato deviato
1 apr 2021 19:53:22

@deviato: grazie per la segnalazione, adottato, anche con confronto stretto.

hakre hakre
2 apr 2021 10:37:05
1

La funzione wp_link_pages() mostra solo o testo o numeri, mai entrambi. Se dai un'occhiata al codice della funzione, vedrai che non c'è alcuna opzione per modificarne il comportamento passando parametri.

Detto questo, ci sono tre modi per farlo senza un plugin:

  1. Creare una propria funzione nel file functions.php del tema. Funziona, ma avresti una nuova funzione.
  2. Utilizzare 2-3 istanze di wp_link_pages(). Un hack molto inefficiente.
  3. Utilizzare un filtro. Metodo Preferito. Vedi sotto.

Ho scritto un articolo su come farlo nel mio blog. In sostanza, utilizzo il filtro wp_link_pages_args e aggiungo una funzione nel file functions.php che introduce una nuova opzione 'next_and_number'.

Hack WordPress: Mostra Numeri e Link Successivo/Precedente con wp_link_pages()

30 dic 2011 16:14:22
Commenti

Grande... Stavo pensando a qualcosa che utilizzasse i 4 valori globali, ma non sono mai riuscito a trovare una soluzione... +1!

Rutwick Gangurde Rutwick Gangurde
30 dic 2011 18:59:58
1

Prova questo, puoi personalizzarlo ulteriormente. Ma dovrebbe fare quello che vuoi :-)

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

    echo paginate_links( array(
        'format' => get_permalink() . '%#%/',
        'current' => $page,
        'total' => $numpages
    ) );
}
30 dic 2011 19:01:43
Commenti

come possiamo gestire? https://wordpress.org/support/topic/how-to-manage-wp_link_pages-number-to-own-custom-url?replies=2

o come aggiungere un titolo-personalizzato-dinamico prima del numero di pagina.

Ravi Patel Ravi Patel
7 lug 2016 14:53:48
3

Non capisco qual è il problema... Hai qualche errore?

Questo dovrebbe funzionare:

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

wp_link_pages($args);
?> 

Non hai bisogno di aggiungere next_or_number poiché number è già il valore predefinito.

25 dic 2011 23:06:46
Commenti

Per qualche motivo non funziona, ma a me sembra corretto. Mi chiedo se ci sia stato un cambiamento nella 3.3 o se devo incollare qualcosa in functions.php?

AndrettiMilas AndrettiMilas
28 dic 2011 16:55:14

Sì, ho provato anche questo, funziona quando imposti next_or_number a next. Ma mostra solo i link 'Avanti' e 'Indietro', non i numeri!

Rutwick Gangurde Rutwick Gangurde
28 dic 2011 18:53:09

Mi servono entrambi, come mostrato nell'esempio.

AndrettiMilas AndrettiMilas
28 dic 2011 19:20:06
3

Questo codice è nel loop dei post? La codifica mi sembra corretta. Ecco l'esempio del Codex su come utilizzarlo:

<?php

wp_link_pages(array(
    'before' => '<p>' . __('Pagine:'),
    'after' => '</p>',
    'next_or_number' => 'number',
    'nextpagelink' => __('Pagina successiva'),
    'previouspagelink' => __('Pagina precedente'),
    'pagelink' => '%',
    'echo' => 1 )
);

?>
28 dic 2011 17:35:10
Commenti

Questo codice non funziona.

AndrettiMilas AndrettiMilas
28 dic 2011 19:19:37

Codice corretto. Scusate. Alcuni attributi non avevano un valore.

Caio Alves Caio Alves
28 dic 2011 21:41:33

Questo non ottiene i risultati che cercavo nella mia domanda, mostra solo numeri.

AndrettiMilas AndrettiMilas
29 dic 2011 16:07:17
0

La risposta è diversa, ma è stata ispirata da @荒野无灯 che ha deciso di eliminare la sua risposta. A mio parere è la migliore, in quanto la soluzione più semplice e flessibile:

La soluzione si basa su paginate_links(). L'unica cosa da sapere è che base sarà l'URL di partenza, a cui viene aggiunto %_%, che verrà poi sostituito da format. Quindi finché utilizziamo get_permalink().'%_%';, sappiamo che resteremo in ogni caso sul post corrente. All'interno di format, il # viene sostituito dal numero di pagina:

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; '.__( 'Prec', 'your_textdomain' )
        ,'next_text' => __( 'Succ', 'your_textdomain' ).' &raquo;'

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

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

    echo "<div class='pagination-container'>{$paginate_links}</div>";
}
12 ott 2012 14:44:09