get_query_var('paged') restituisce sempre vuoto
Sto pubblicando questo dopo aver sbattuto contro un muro nel cercare possibili soluzioni.
Ho un sito con diversi custom post type e relative tassonomie personalizzate. Per semplificare, sto usando un template unificato taxonomy.php
.
All'interno di questo template ci sono tre loop. Vorrei che tutti e tre venissero eseguiti nella prima pagina, mentre dalle pagine successive solo il terzo loop. Capisco come farlo funzionare con is_paged()
ma c'è un problema più grande che non riesco a risolvere.
Nei miei $args
ho incluso $paged
da
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
Ma $paged
restituisce sempre 1, indipendentemente dalla pagina in cui mi trovo. Se faccio direttamente
get_query_var('paged')
Non viene restituito nulla, sia che io sia nella prima, seconda, terza o qualsiasi altra pagina.
Ho letto che è necessario resettare ogni loop per far funzionare questo, e questa è una pratica che ho sempre seguito.
Non includerò l'intera pagina qui, dato che si tratta di una tassonomia piuttosto lunga e complessa. Mostrerò invece la struttura base dei due loop.
NOTA: Non posso usare pre_get_posts
per questa pagina perché influisce su tutti i loop. Ognuno di questi loop ha requisiti diversi per posts_per_page
e altri aspetti che devono rimanere separati.
In cima al template ho
//questo previene duplicazioni
$do_not_duplicate = array();
global $wp_query;
$term = $wp_query->queried_object;
E configuro il mio loop dopo gli args con
while ($new_query->have_posts()) : $new_query->the_post();
Il terzo loop che voglio paginato ha questo codice nelle vicinanze
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args=array(
'posts_per_page' => $total_posts,
'post__not_in' => array_merge($do_not_duplicate, $unwanted_post_ids ),
'paged' => $paged,
'tax_query' => array(
array(
'taxonomy' => $term->taxonomy,
'field' => 'slug',
'terms' => $term->slug,
)
)
);
// Rieseguo la query con i nuovi argomenti
query_posts( $args );
Ho sempre usato wp_query
invece di query_posts
, ma nei miei ultimi tentativi ho provato così. Preferirei tornare alla versione precedente.
Qualche idea?

Hai il parametro "paged" nell'URL della pagina che stai cercando di utilizzare con get_query_var? Per quanto ne so, get_query_var("paged") restituisce esplicitamente il valore del parametro nell'URL, quindi devi avere un URL simile a questo per farlo funzionare:
/?paged=7
In alternativa, potresti leggere il parametro dall'URL utilizzando direttamente PHP:
$_GET['paged']

Dovresti essere in grado di ottenere queste informazioni direttamente dalla variabile principale $wp_query
, potresti fare un print_r()
e controllare i vari argomenti di cui hai bisogno, come paged, posts_per_page, ecc. ecc. Quali informazioni riesci a vedere nel tuo template quando fai questo?

Ho avuto lo stesso problema, anche se specificamente riguardava la paginazione con AJAX. get_query_var('paged') restituiva una stringa vuota, quindi $paged veniva sempre impostato su "1", e - nonostante le pagine cambiavano - i link di paginazione mostravano sempre "1" come pagina corrente.
Per risolvere il mio problema, ho semplicemente preso il valore della pagina passato al mio file di funzioni ($_POST['page']) tramite AJAX, l'ho chiamato $pagination_no, poi ho modificato la formula di $paged in:
$paged = ($pagination_no) ? $pagnination_no : 1;
Questo ha risolto il problema.

Usa page
, non paged
, nella pagina frontale statica
✅ La soluzione:
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
⭐️ Una sintassi migliore (vedi fonte):
$paged = get_query_var('page', 1);
All'interno del loop puoi usare direttamente il valore globale $page
(vedi documentazione):
global $page;
Se sei su una pagina frontale statica devi usare la variabile di query page
invece di paged
(vedi documentazione).
La variabile globale $page
restituisce sempre un intero.
Un approccio migliore:
$paged = 1;
if ( get_query_var('paged') ) $paged = get_query_var('paged');
if ( get_query_var('page') ) $paged = get_query_var('page');
Questo fornirà un fallback elegante indipendentemente da dove usi il codice.
Ecco un vecchio riferimento che cerca di risolvere il problema.
