get_query_var('paged') всегда возвращает пустое значение
Публикую этот вопрос после того, как перепробовал все возможные решения безрезультатно.
У меня есть сайт с несколькими пользовательскими типами записей и связанными с ними таксономиями. Для удобства использую единый шаблон taxonomy.php
.
В этом шаблоне три цикла. Я хочу, чтобы все они работали на первой странице, а на последующих - только третий цикл. Я понимаю, как это сделать с помощью is_paged()
, но есть более серьезная проблема, которую я не могу решить.
В моих $args
я включаю $paged
из
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
Но $paged
всегда возвращает 1, независимо от того, на какой странице я нахожусь. Если я использую просто
get_query_var('paged')
то ничего не возвращается, ни на первой, ни на второй, ни на последующих страницах.
Я читал, что для работы этого функционала нужно сбрасывать каждый цикл, и я всегда следовал этой практике.
Не буду приводить здесь весь код страницы, так как это довольно длинная и сложная таксономия. Вместо этого покажу базовую структуру двух циклов.
ПРИМЕЧАНИЕ: Я не могу использовать pre_get_posts
для этой страницы, так как это влияет на все циклы. У каждого из этих циклов свои требования к posts_per_page
и другие параметры, которые должны оставаться раздельными.
В начале шаблона у меня есть
//это предотвращает дублирование
$do_not_duplicate = array();
global $wp_query;
$term = $wp_query->queried_object;
И я настраиваю свой цикл после аргументов с помощью
while ($new_query->have_posts()) : $new_query->the_post();
Третий цикл, который я хочу разбить на страницы, имеет следующий код:
$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,
)
)
);
// Повторно запускаем запрос с новыми аргументами
query_posts( $args );
Обычно я использую wp_query
вместо query_posts
, но в последних попытках использовал именно это. Предпочел бы вернуть обратно.
Есть идеи?

Есть ли у вас параметр "paged" в URL страницы(ниц), которые вы пытаетесь использовать с get_query_var? Насколько я знаю, get_query_var("paged") явно возвращает значение параметра из URL, поэтому для его работы вам нужен URL такого вида:
/?paged=7
Альтернативно вы можете прочитать параметр из URL напрямую с помощью PHP:
$_GET['paged']

У меня была такая же проблема, особенно при пагинации с использованием AJAX. get_query_var('paged') возвращал пустую строку, поэтому $paged всегда устанавливался в "1", и — несмотря на то, что страницы менялись — ссылки пагинации всегда показывали "1" как текущую страницу.
Чтобы решить эту проблему, я просто взял значение страницы, переданное в мой файл функций ($_POST['page']) через AJAX, назвал его $pagination_no, а затем изменил формулу для $paged на:
$paged = ($pagination_no) ? $pagnination_no : 1;
Это сработало.

Используйте page
, а не paged
, для статической главной страницы
✅ Решение:
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
⭐️ Более лаконичный синтаксис (см. источник):
$paged = get_query_var('page', 1);
Внутри цикла можно напрямую использовать глобальную переменную $page
(см. документацию):
global $page;
Если вы работаете со статической главной страницей, необходимо использовать параметр запроса page
вместо paged
(см. документацию).
Глобальная переменная $page
всегда возвращает целое число.
Более универсальный подход:
$paged = 1;
if ( get_query_var('paged') ) $paged = get_query_var('paged');
if ( get_query_var('page') ) $paged = get_query_var('page');
Это решение будет корректно работать в любом контексте.
Вот старая статья, в которой предпринималась попытка решить эту проблему.
