paginate_links() non funziona correttamente in search.php?
Sto usando questo nel mio template search.php ...
<div class="pagination">
<?php echo get_pagination_links(); ?>
</div>
E questa è la funzione ...
function get_pagination_links() {
global $wp_query;
$big = 999999999;
return paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'prev_next' => false
) );
}
-
L'output funziona: quindi se cerco "test" e ci sono più di 10 risultati, la paginazione mostra 1 2
dove 2
è un link. Quando clicco sulla pagina 2
la barra degli indirizzi si aggiorna correttamente a mysite.com/search/test/page/2
ma la pagina risultante è ancora la numero 1
.
Ci sono ancora gli stessi risultati come nella pagina numero 1
e i link di paginazione sono ancora gli stessi - 2
è ancora il link e 1
è la pagina corrente.
Qualche idea sul perché potrebbe succedere?
Aggiornamento
Ecco dove viene chiamata la funzione personalizzata nel template:
<?php
/**
* Il template per visualizzare le pagine dei Risultati di Ricerca
*/
get_header(); ?>
<?php if ( have_posts() ) : ?>
<hgroup class="section-heading wrapper">
<h1>Risultati</h1>
</hgroup>
<section id="results">
<?php while ( have_posts() ) : the_post(); ?>
<ul class="event-items">
<?php get_template_part( 'inc/search', 'result' ); ?>
</ul>
<?php endwhile; ?>
</section>
<div class="pagination tiny wrapper">
<?php echo get_pagination_links(); ?>
</div>
<?php else : ?>
<div class="wrapper">
<h2>Nessun risultato trovato</h2>
</div>
<?php endif; ?>
<?php get_footer(); ?>
Modifica
Usando il codice consigliato dalla risposta qui sotto:
/**
* Link di paginazione per ricerca e archivi
*/
function get_pagination_links() {
global $wp_query;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
$big = 999999999;
return paginate_links( array(
'base' => @add_query_arg('paged','%#%'),
'format' => '?paged=%#%',
'current' => $current,
'total' => $wp_query->max_num_pages,
'prev_next' => false
) );
}
La paginazione ora funziona, tuttavia i "permalink" non sono esattamente come li vorrei. Uso custom_pagination_base()
per avere questa struttura di permalink:
mypage.com/search/term/seite/2
(dove seite è la parola tedesca per pagina).
È possibile mantenere i permalink funzionanti in questo modo? La paginazione funziona con il tuo codice, solo che i permalink appaiono così:
mypage.com/search/term?paged=2

Credo che questo sia già stato risposto altrove, ma lo ripeterò qui.
Penso che il tuo problema sia qui:
'current' => max( 1, get_query_var('paged') ),
Prova invece questo:
global $wp_query;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
...poi:
'current' => $current;
Anche il tuo 'base'
potrebbe essere un problema. Invece di questo:
$big = 999999999;
//...
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) )
Io uso questo:
'base' => @add_query_arg('paged','%#%')
Modifica
Nel caso possa essere utile, ecco la mia intera funzione wrapper per paginate_links()
:
/**
* Pagina i link dell'indice dell'archivio
*/
function oenology_get_paginate_archive_page_links( $type = 'plain', $endsize = 1, $midsize = 1 ) {
global $wp_query, $wp_rewrite;
$current = get_query_var( 'paged' ) > 1 ? get_query_var('paged') : 1;
// Sanifica i valori degli argomenti di input
if ( ! in_array( $type, array( 'plain', 'list', 'array' ) ) $type = 'plain';
$endsize = absint( $endsize );
$midsize = absint( $midsize );
// Imposta l'array di argomenti per paginate_links()
$pagination = array(
'base' => @add_query_arg( 'paged', '%#%' ),
'format' => '',
'total' => $wp_query->max_num_pages,
'current' => $current,
'show_all' => false,
'end_size' => $endsize,
'mid_size' => $midsize,
'type' => $type,
'prev_text' => '<<',
'next_text' => '>>'
);
if ( $wp_rewrite->using_permalinks() )
$pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ).'page/%#%/', 'paged' );
if ( ! empty( $wp_query->query_vars['s'] ) )
$pagination['add_args'] = array( 's' => get_query_var( 's' ) );
return paginate_links( $pagination );
}

Grazie Signore. Perfetto, ma un'ultima piccola cosa. Ho aggiornato la mia domanda sopra con il tuo codice. La paginazione ora funziona, tuttavia i "permalink" non sono esattamente come vorrei che fossero. Uso custom_pagination_base()
per avere questa struttura di permalink miosito.com/ricerca/termine/pagina/2
dove pagina
è la parola italiana per page. È possibile mantenere i permalink funzionanti in quel modo? La paginazione funziona con il tuo codice, solo che i permalink appaiono così: miosito.com/ricerca/termine?paged=2

Vedi la risposta aggiornata. Ho aggiunto la mia intera funzione. Inoltre: fai attenzione a come modifichi la tua domanda. Se sovrascrivi il codice originale, è difficile per i lettori successivi seguire il flusso domanda-risposta. Di solito è meglio conservare il codice originale e poi aggiungere nuovo codice alla domanda. Modificherò la tua domanda per darti un'idea di cosa intendo.

Per rispondere alla tua specifica domanda di follow-up, fai riferimento al ternario $pagination['base']
verso la fine della funzione. Penso che tu dovrebbe essere in grado di adattare quella riga per soddisfare le tue esigenze.

Grazie, tuttavia sembra che io abbia un problema altrove. Quando utilizzo il tuo codice, la paginazione non funziona di nuovo - lo stesso identico comportamento menzionato nella mia domanda sopra. Il link cliccato non aggiorna la visualizzazione e la paginazione non funziona. Se rimuovo il commento ai tuoi ultimi due blocchi if
nella tua funzione (le righe relative ai permalink) la tua funzione funziona di nuovo bene. Quindi tutto funziona bene tranne la parte che riguarda la riscrittura di ?paged
nell'URL stesso. Hai altre idee su da cosa potrebbe derivare? Grazie ancora per il tuo fantastico aiuto finora.

Sospetto che il problema siano le tue regole di riscrittura personalizzate. Questa è la parte della mia funzione che hai modificato...

Anche se questa non è una soluzione che utilizza esattamente il tuo codice, potresti provare a usare questa tecnica di paginazione invece dell'esempio che hai preso dal WordPress Codex.
A naso direi che il problema risiede nel recupero del template part con questa riga di codice:
<?php get_template_part( 'inc/search', 'result' ); ?>
Se questo non risolve il tuo problema, valuterei di portare il contenuto da 'inc/search' e includerlo direttamente nella tua pagina dei risultati di ricerca senza usare <?php get_template_part(); ?>
- potrebbe aiutarti a individuare eventuali stranezze
