get_query_var('paged') siempre devuelve vacío
Publico esto después de haber golpeado un muro buscando posibles soluciones.
Tengo un sitio con varios tipos de contenido personalizados y taxonomías personalizadas asociadas. Para facilitar las cosas, estoy usando una plantilla unificada taxonomy.php
.
Dentro de esa plantilla hay tres bucles. Me gustaría que los tres se ejecuten en la primera página, y después de eso, solo el tercer bucle. Entiendo cómo hacer que funcione con is_paged()
pero hay un problema mayor que no puedo resolver.
En mis $args
incluí $paged
de:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
Pero $paged
siempre devuelve 1, sin importar en qué página esté. Si hago directamente:
get_query_var('paged')
Entonces no se devuelve nada, sin importar si estoy en la primera, segunda, tercera página, etc.
He leído que necesitas reiniciar cada bucle para que esto funcione, y esa es una práctica que siempre he seguido.
No incluiré toda la página aquí, ya que es una taxonomía bastante larga y compleja. En cambio, mostraré la configuración base de los dos bucles.
NOTA: No puedo usar pre_get_posts
para esta página ya que afecta a todos los bucles. Cada uno de estos bucles tiene requisitos separados de posts_per_page
y otros aspectos que deben mantenerse separados.
En la parte superior de la plantilla tengo:
//esto evita duplicación
$do_not_duplicate = array();
global $wp_query;
$term = $wp_query->queried_object;
Y configuro mi bucle después de mis args con:
while ($new_query->have_posts()) : $new_query->the_post();
El tercer bucle que quiero paginado tiene este código cercano:
$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,
)
)
);
// Volver a ejecutar la consulta con los nuevos argumentos
query_posts( $args );
He estado usando wp_query
en lugar de query_posts
, pero para mis últimos intentos eso es lo que he tenido allí. Preferiría cambiarlo de vuelta.
¿Alguna idea?

¿Tienes el parámetro "paged" en la URL de la(s) página(s) que estás intentando usar con get_query_var? Por lo que sé, get_query_var("paged") devuelve explícitamente el valor del parámetro de la URL, por lo que necesitas tener una URL como esta para que funcione:
/?paged=7
Alternativamente, podrías leer el parámetro de la URL usando PHP directamente:
$_GET['paged']

Tuve el mismo problema, específicamente al paginar usando AJAX. get_query_var('paged') devolvía una cadena vacía, por lo que $paged siempre se establecía en "1", y - aunque las páginas cambiaban - los enlaces de paginación siempre mostraban "1" como la página actual.
Para resolver mi problema, simplemente obtuve el valor de página pasado a mi archivo de funciones ($_POST['page']) mediante AJAX, lo llamé $pagination_no, y luego cambié la fórmula de $paged a:
$paged = ($pagination_no) ? $pagnination_no : 1;
Eso solucionó el problema.

Usa page
, no paged
, en la página de inicio estática
✅ La solución:
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
⭐️ Una sintaxis mejor (ver fuente):
$paged = get_query_var('page', 1);
Dentro del loop puedes usar directamente el valor global $page
(ver documentación):
global $page;
Si estás en una página de inicio estática debes usar la variable de consulta page
en lugar de paged
(ver documentación).
La variable global $page
siempre retorna un entero.
Un enfoque mejor:
$paged = 1;
if ( get_query_var('paged') ) $paged = get_query_var('paged');
if ( get_query_var('page') ) $paged = get_query_var('page');
Esto funcionará correctamente sin importar dónde uses el código.
Aquí una referencia antigua que intenta resolver el problema.
