paginate_links() non funziona correttamente in search.php?

1 set 2012, 20:54:46
Visualizzazioni: 20.5K
Voti: 6

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
4
Commenti

Mostra la query per questa richiesta.

kaiser kaiser
1 set 2012 21:14:28

Ho aggiornato la mia domanda con il mio template search.php. Non c'è alcun loop all'interno di search-result.php, solo HTML semplice.

mathiregister mathiregister
1 set 2012 21:27:28

Hai esaminato le domande precedenti relative a paginate_links()?

Chip Bennett Chip Bennett
1 set 2012 21:33:38

Ho letto e cercato su Google a lungo ma non riesco a trovare una soluzione. Qualche idea?

mathiregister mathiregister
1 set 2012 21:47:34
Tutte le risposte alla domanda 2
6
11

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' => '&lt;&lt;',
        'next_text' => '&gt;&gt;'
    );

    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 );
}
2 set 2012 00:34:18
Commenti

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

mathiregister mathiregister
2 set 2012 09:59:33

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.

Chip Bennett Chip Bennett
2 set 2012 17:08:25

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.

Chip Bennett Chip Bennett
2 set 2012 17:16:27

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.

mathiregister mathiregister
2 set 2012 17:55:09

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

Chip Bennett Chip Bennett
3 set 2012 21:23:14

Ho appena provato e get_query_var('paged') da solo funziona bene. Non c'è bisogno di estrarlo dal globale.

kaiser kaiser
25 set 2012 04:55:34
Mostra i restanti 1 commenti
1

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

1 set 2012 22:36:43
Commenti

Grazie per la tua risposta. Non è il get_template_part() perché ho anche provato a inserire il codice del template direttamente nel loop. E la tecnica di paginazione che hai postato nel tuo commento non fa differenza - stesso effetto.

mathiregister mathiregister
1 set 2012 22:50:13