Post paginati - come usare numeri e link precedente/successivo?
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
)); ?>

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.

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.

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

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')

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:
- Creare una propria funzione nel file functions.php del tema. Funziona, ma avresti una nuova funzione.
- Utilizzare 2-3 istanze di
wp_link_pages()
. Un hack molto inefficiente. - 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()

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.

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.

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?

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

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 )
);
?>

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' => '« '.__( 'Prec', 'your_textdomain' )
,'next_text' => __( 'Succ', 'your_textdomain' ).' »'
,'base' => get_permalink().'%_%'
,'format' => user_trailingslashit( '%#%' )
,'current' => $GLOBALS['page']
) ) )
return;
echo "<div class='pagination-container'>{$paginate_links}</div>";
}
