Вордпресс, почему не выводится пагинация на странице поиска?

Ссылка скопирована
PHP
1 ответ

На странице поиска Search - есть две ошибки.
Объясняю: всего на сайте три способа поиска.
Первый - форма поиска на главной странице (реализована через ivory search)
Вторая - форма поиска на странице Search.
Третья - древовидная форма поиска по таксономиям.

Запускаю цикл, в аргументах s.
В вордпрессе админке выставил 4 поста на странице.

Сейчас у меня пагинация выводится только когда я ввожу запрос на главной странице и он находит его на странице search.php
Но в других двух случаях - пагинация не выводится.

И ещё, мне нужно чтобы когда с главной при нажатии на ссылку человек переходил страницу поиска (search.php), то тоже выводилась пагинация.

Вот сайт, который я разрабатывал - https://trophy.fishing
И вот страница поиска. На неё также можно перейти нажав на карточку "Fish species"
https://trophy.fishing/search/

И ещё, на всякий случай скажу что у меня страница поиска с Template Name: Search. Мне это нужно было раньше, но сейчас уже нет, так что темлейт нэйм могу убрать.

Вордпресс, почему не выводится пагинация на странице поиска?

Дополнительно:

Ответы:

Пагинация на Вашей статической странице /search/ не выводится потому, что функция the_posts_pagination() работает с изначальной выборкой (у статической страницы это всегда только одна запись) и ничего не знает о том, какие WP_Query имеют место в шаблоне. Для пагинации произвольных выборок больше подходит функция paginate_links(), которой можно передать total и current из кастомной выборки.

Вордпресс, почему не выводится пагинация на странице поиска?

Правильное использование структуры шаблонов WP не нуждается в получении данных в коде страницы.
Я предлагаю сначала почитать документацию и навсегда (в 99% ситуаций) избавиться от WP_Query в шаблонах.
Сейчас получается так что поиск и так обрабатывает запрос, а после этого ты делаешь тоже самое но только у тебя это не работает как надо.

убери шаблон. Что значит три способа поиска? Три формы поиска? Если 3 формы, то из 3х сделай одну. Что даёт использование ivory search? Если в ivory нужды нет, старайся использовать форму поиска wrdpress.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

Пагинация на странице поиска в WordPress чаще всего не выводится или даёт неправильные ссылки из-за двух причин: используется отдельный WP_Query без передачи paged, либо пагинация строится по глобальному запросу, а записи выводятся из другого запроса.

Для обычной страницы поиска лучше использовать основной query WordPress. В search.php достаточно:

if (have_posts()) {
    while (have_posts()) {
        the_post();
        get_template_part('template-parts/content', 'search');
    }
 
    the_posts_pagination();
}

if (have_posts()) { while (have_posts()) { the_post(); get_template_part('template-parts/content', 'search'); } the_posts_pagination(); }

Если Вы делаете свой запрос, обязательно передайте текущую страницу:

$paged = max(1, get_query_var('paged'), get_query_var('page'));
 
$query = new WP_Query([
    's' => get_search_query(),
    'post_type' => 'post',
    'posts_per_page' => 10,
    'paged' => $paged,
]);

$paged = max(1, get_query_var('paged'), get_query_var('page')); $query = new WP_Query([ 's' => get_search_query(), 'post_type' => 'post', 'posts_per_page' => 10, 'paged' => $paged, ]);

И пагинацию строите по этому объекту:

echo paginate_links([
    'total' => $query->max_num_pages,
    'current' => $paged,
]);

echo paginate_links([ 'total' => $query->max_num_pages, 'current' => $paged, ]);

После кастомного цикла не забудьте:

wp_reset_postdata();

wp_reset_postdata();

Если поиск расположен на обычной странице, а не на search.php, URL пагинации может отличаться. Тогда нужно явно указать base и сохранять параметр s. Но лучше не превращать обычную страницу в самодельный поиск, если можно использовать стандартный search endpoint.

Для древовидной формы по таксономиям проблема похожая: выбранные параметры должны сохраняться в ссылках пагинации. Используйте add_args:

echo paginate_links([
    'total' => $query->max_num_pages,
    'current' => $paged,
    'add_args' => array_filter([
        's' => get_search_query(),
        'category' => $_GET['category'] ?? null,
    ]),
]);

echo paginate_links([ 'total' => $query->max_num_pages, 'current' => $paged, 'add_args' => array_filter([ 's' => get_search_query(), 'category' => $_GET['category'] ?? null, ]), ]);

И не используйте query_posts(). Он ломает глобальный запрос и часто именно из-за него пагинация ведёт себя непредсказуемо.

Итог: один запрос — одна пагинация. Либо используйте основной поиск WordPress, либо аккуратно передавайте paged, total, current и сохраняйте GET-параметры фильтра.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно