get_query_var('paged') всегда возвращает пустое значение

18 дек. 2012 г., 14:21:56
Просмотры: 13.6K
Голосов: 7

Публикую этот вопрос после того, как перепробовал все возможные решения безрезультатно.

У меня есть сайт с несколькими пользовательскими типами записей и связанными с ними таксономиями. Для удобства использую единый шаблон 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, но в последних попытках использовал именно это. Предпочел бы вернуть обратно.

Есть идеи?

3
Комментарии

можешь выложить весь свой код целиком? Сложновато следить за отдельными фрагментами в текстовом виде, полный код позволит гораздо лучше понять суть

Tom J Nowell Tom J Nowell
18 дек. 2012 г. 14:43:08

также имей в виду, что query_posts в любом случае использует WP_Query на низком уровне, поэтому нет смысла применять его как универсальный инструмент для запросов

Tom J Nowell Tom J Nowell
18 дек. 2012 г. 14:43:50

Попробуй использовать это: $paged = (get_query_var('page')) ? get_query_var('page') : 1; Не знаю точной причины, но у меня это однажды сработало.

Rohit Pande Rohit Pande
15 июн. 2013 г. 09:28:10
Все ответы на вопрос 5
1

Попробуйте использовать следующее:

$paged = (get_query_var('page')) ? get_query_var('page') : 1;

Вместо использования:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

У меня была такая же проблема, и это сработало.

25 февр. 2022 г. 20:52:05
Комментарии

'page' используется только для статической главной страницы. В остальных случаях необходимо использовать 'paged'.

JohnG JohnG
1 авг. 2022 г. 14:15:23
0

Есть ли у вас параметр "paged" в URL страницы(ниц), которые вы пытаетесь использовать с get_query_var? Насколько я знаю, get_query_var("paged") явно возвращает значение параметра из URL, поэтому для его работы вам нужен URL такого вида:

/?paged=7

Альтернативно вы можете прочитать параметр из URL напрямую с помощью PHP:

$_GET['paged']
18 дек. 2012 г. 15:52:18
0

Вы можете получить эту информацию напрямую из основной переменной $wp_query. Вы можете использовать print_r() и проверить различные необходимые аргументы, такие как paged, posts_per_page и т.д. Какую информацию вы видите в своем шаблоне при выполнении этого?

23 авг. 2013 г. 18:27:56
0

У меня была такая же проблема, особенно при пагинации с использованием AJAX. get_query_var('paged') возвращал пустую строку, поэтому $paged всегда устанавливался в "1", и — несмотря на то, что страницы менялись — ссылки пагинации всегда показывали "1" как текущую страницу.

Чтобы решить эту проблему, я просто взял значение страницы, переданное в мой файл функций ($_POST['page']) через AJAX, назвал его $pagination_no, а затем изменил формулу для $paged на:

$paged = ($pagination_no) ? $pagnination_no : 1;

Это сработало.

1 авг. 2022 г. 16:03:00
0

Используйте 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');

Это решение будет корректно работать в любом контексте.

Вот старая статья, в которой предпринималась попытка решить эту проблему.

6 окт. 2022 г. 11:22:11