Impossibile far funzionare paginate_links con una query personalizzata

5 apr 2014, 03:52:32
Visualizzazioni: 19.9K
Voti: 1

Ho creato una sezione news nel mio sito WordPress utilizzando i plugin Advanced Custom Fields e Custom Post Type UI. Nella pagina di panoramica delle news personalizzate (non i post WordPress standard) volevo limitare il numero di news per pagina a sei e fornire una navigazione con paginate_links. Ho creato il seguente snippet:

<section class="news-main" role="main">
    <?php
        // Definizione degli argomenti per la query
        $args = array(
            'post_type' => 'news',
            'posts_per_page' => '6'
        );
        $the_query = new WP_Query( $args );
        $temp_query = $wp_query;
        $wp_query = NULL;
        $wp_query = $the_query;
        $pagination = array(
            'base' => '%_%',
            'format' => '?page=%#%',
            'total' => $the_query->max_num_pages,
            'prev_next' => True,
            'prev_text' => __( '<< Precedente' ),
            'next_text' => __( 'Successivo >>' )
        );
        if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <article class="news-snippet">
            <header class="news-box">
                <h2 class="mus-hi slogan-head fancy"><span class="fancy-hook"><?php the_time( 'j. F Y' ); ?></span></h2>
                <a href="<?php the_permalink(); ?>"><p class="bran-hn slogan-state closure"><?php the_title(); ?></p></a>
            </header>
            <div class="news-wrap">
                <p class="news-excerpt"><?php echo acf_excerpt( 'news_post', 35, ' <span class="news-more-inbox">[...]</span>' ); ?></p>
                <p class="bran-hn news-more"><a href="<?php the_permalink(); ?>">Continua &rarr;</a></p>
            </div>
        </article>
    <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>
    <?php else: ?>
        <p>Nessun elemento</p>
    <?php endif; ?>
    <nav>
        <?php echo paginate_links( $pagination );
                $wp_query = NULL;
                $wp_query = $temp_query; ?>
    </nav>
</section>

Prima vengono definiti gli argomenti per wp_query, poi viene impostato $the_query con WP_Query, successivamente la variabile $wp_query viene salvata in una variabile temporanea, azzerata con NULL e poi impostata alla variabile $the_query. Nell'ultimo passaggio viene impostato l'array delle impostazioni per paginate_links. Poi c'è il loop per l'output dei post news. Dopo il loop viene chiamata la funzione paginate_links e infine $wp_query viene resettato e viene riscritto il contenuto della variabile temporanea $temp_query.

Se ho, per esempio, 15 post del blog, il mio output appare così:

layout di paginate_links

Se passo il mouse sul numero tre, la fine dello slug appare così:

slug per pagina 3

Il problema ora è che i link precedente e successivo non vengono mostrati anche se sono impostati. Mentre il problema principale è lo slug fornito - se clicco il numero tre attero su una pagina 404. "page 3" dove vengo reindirizzato è sconosciuto per WordPress. Grazie in anticipo Ralf

Aggiornamento:

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '1'
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $current_page = new WP_Query('post_type=news&posts_per_page=1&paged=' . $paged);
    $pagination = array(
        'base' => '%_%',
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $current_page,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Precedente' ),
        'next_text' => __( 'Successivo >>' )
    );
}

Aggiornamento 2:

Ok con le seguenti modifiche alla prima parte del codice ho fatto funzionare la navigazione

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '3',
    'paged' => get_query_var( 'paged' )
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $the_paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $pagination = array(
        'base' => @add_query_arg('paged','%#%'),
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $the_paged,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Precedente' ),
        'next_text' => __( 'Successivo >>' )
    );
}

L'unica domanda che mi rimane (l'unica cosa che ancora non funziona correttamente) è se è possibile che il primo link abbia link invece di link/?paged=1

1
Commenti

Perché stai usando il tag h2 per lo span della data?

ahmetlutfu ahmetlutfu
6 apr 2014 01:46:58
Tutte le risposte alla domanda 1
5

Per quanto riguarda il numero di pagine visualizzate, leggi gli argomenti per paginate_links, in particolare end_size e mid_size.

Per quanto riguarda l'errore 404 - Il problema è che non esiste una pagina 3. Che una pagina restituisca contenuti o carichi il template 404 dipende dai risultati della query principale, non dalla tua query personalizzata eseguita nel template. Se si tratta di un post type page, prova a impostare la variabile di query paged invece di page.

5 apr 2014 06:36:29
Commenti

Grazie, sì la numerazione ora funziona bene, serviva un po' di perfezionamento nelle impostazioni, così come per i link precedente e successivo. Quindi fondamentalmente la paginazione sembra già a posto ma non è affatto funzionale. Se clicco ora sui due arrivo a ?paged=2 e non c'è più il template 404. Ma il lato negativo è che vengono ancora mostrati gli articoli della pagina iniziale e il numero uno rimane con la classe current invece del paged 2 su cui mi trovo. Inoltre il link Precedente non viene visualizzato.

rkoller rkoller
6 apr 2014 01:29:36

E riguardo al tuo sospetto che tutto dipenda dalla query principale invece che dalla query personalizzata che eseguo - pensavo che con $wp_query = $the_query; avessi "trasferito" la mia query personalizzata alla query principale e resa accessibile alla funzione paginate_links.

rkoller rkoller
6 apr 2014 01:31:18

Ho aggiunto un aggiornamento al post iniziale con un frammento di codice aggiornato per le parti PHP relative a paginate_links (ho provato a includere paged - ma ancora non funziona :/ ).

rkoller rkoller
6 apr 2014 01:33:44

se viene restituito un errore 404 o meno è determinato prima che il tuo template venga caricato, quel codice non viene mai eseguito se le variabili della query non sono corrette. E stai vedendo i primi 6 post su ogni pagina perché non hai impostato paged nei tuoi argomenti di query personalizzati.

Milo Milo
6 apr 2014 01:33:56

ahhhhhhhhhhhh capisco. Sono stato un po' lento - non avevo capito e realizzato che si poteva già usare paged nella query personalizzata, ma ha perfettamente senso. Che stupido :( Ok ora la visualizzazione degli articoli funziona perfettamente. L'unica cosa che resta da sistemare è che la navigazione paginate_links rispecchi i cambiamenti. Ma dovrò provare e sperimentare domani mattina. Adesso è già tardi. Grazie!

rkoller rkoller
6 apr 2014 01:55:11