Impossibile far funzionare paginate_links con una query personalizzata
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 →</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ì:
Se passo il mouse sul numero tre, la fine dello slug appare così:
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

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
.

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.

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.

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 :/ ).

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.

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!
