Вопрос или проблема
это мой запрос:
$p_query = new WP_Query(array(
'post_type' => $post_type
,'post_status' => 'publish'
,'posts_per_page' => $per_page // 6
,'paged' => $page // 2
,'post__not_in' => array($first_post) // ID
,'tax_query' => array(
array(
'taxonomy' => $data['tax'] // слаг таксономии
,'field' => 'slug'
,'terms' => $data['term'] // слаг термина
)
)
));
Пагинация работает правильно без tax_query. Как только я добавляю его, на странице 2 происходит что-то странное:
-
возвращается правильное количество элементов (оставшееся количество элементов)
-
элементы неверные: они снова исходные.
Другими словами, если элементов per_page
6, а всего 8, на странице 2 я получу 2 элемента, но вместо того, чтобы это были элементы 7,8, они будут 1,2.
Почему? Что не так?
Я сам нашел решение. Кратко: используйте 'order' => 'DESC'
Длинная история:
Поскольку я делал запрос для первой страницы через php (стандартный цикл), а вышеуказанное выполняется через ajax, передавая пагинацию (так что страница 1 – это php, а следующие – ajax), произошло несоответствие по порядку.
Я по-прежнему получал то, что казалось постами страницы 1, потому что запрос выполнялся с умолчательным порядком ASC
, в то время как стандартный цикл работает с порядком DESC по умолчанию (по дате). Таким образом, посты, полученные через ajax, на самом деле были постами страницы 2!
Поменяв порядок, я теперь получаю правильные посты.
Ответ или решение
Пагинация является важным аспектом работы с запросами в WordPress, особенно когда речь идет о выводе постов с учетом параметров таксономии. В вашем случае проблема с пагинацией при использовании параметра tax_query
требует более глубокого анализа. Давайте рассмотрим все возможные аспекты, которые могут влиять на решение этой задачи.
Проблема
Вы описали ситуацию, когда пагинация не работает должным образом, когда вы добавляете параметр tax_query
. Запрос возвращает ожидаемое количество элементов, но вместо правильных постов возвращает повторно элементы первой страницы. Это может происходить из-за того, что порядок сортировки не совпадает с ожидаемым.
Анализ
-
Сортировка постов:
При выполнении запросов к базе данных WordPress будет возвращен набор результатов, который может быть отсортирован по умолчанию в порядке возрастания (ASC
). В то же время стандартный цикл WordPress часто использует сортировку по убыванию (DESC
), основываясь прежде всего на дате публикации постов. Это различие в сортировке может привести к тому, что ваши ajax-запросы будут пытаться получить данные, которые не соответствуют ожидаемым. -
Параметры запроса:
Ваш код выглядит корректно, но отсутствие явного указания порядка сортировки может вызвать путаницу. Например, если первый набор постов был получен с использованиемDESC
, а затем вы выполняете новый запрос с использованиемASC
, это может привести к тому, что вы получите посты, которые не соответствуют ожидаемой странице результатов. -
Взаимодействие AJAX и PHP:
Ещё одно важное замечание: если часть вашего кода выполняется через стандартный PHP-цикл, а последующие запросы через AJAX, это может создавать несоответствие в контексте пейджинга. Каждый следующий запрос должен учитывать, что он продолжает набор данных, а не начинает новый.
Решение
Ваше решение заключается в добавлении параметра 'order' => 'DESC'
в массив аргументов для WP_Query
. Это однозначно указало бы WordPress, что вы хотите получить посты в порядке убывания, что соответствует ожидаемому поведению стандартного цикла.
Пример обновленного запроса будет выглядеть так:
$p_query = new WP_Query(array(
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => $per_page, // 6
'paged' => $page, // 2
'post__not_in' => array($first_post), // an ID
'tax_query' => array(
array(
'taxonomy' => $data['tax'], // tax slug
'field' => 'slug',
'terms' => $data['term'], // term slug
)
),
'order' => 'DESC', // добавлен параметр сортировки
));
Заключение
При работе с запросами в WordPress, особенно когда используются параметры фильтрации, такие как tax_query
, обязательно учитывайте порядок сортировки. Приведение его к единообразию с имеющимся кодом (например, стандартным циклом) поможет избежать путаницы. Ваша находка оказалась правильной, и это решение позволило вам добиться правильной работы пагинации в сочетании с фильтрацией по таксономии.