Как на одной из страниц исключить из поиска все рубрики категории, кроме одной?
Здравствуйте
У меня на всех страницах выведена форма поиска методом :
<?php get_search_form(); ?>
Поиск ищет по всем рубрикам (категориям), кроме тех, которые я исключил добавив в файл functions.php такой код:
function skill_search_filter( $query ){ if( ! is_admin() && $query->is_main_query() && $query->is_search ){ $query->set( 'cat','-5,-7,-11,-13,-30,-31,-35' ); } |
function skill_search_filter( $query ){ if( ! is_admin() && $query->is_main_query() && $query->is_search ){ $query->set( 'cat','-5,-7,-11,-13,-30,-31,-35' ); }
Но на одной странице сайта, я хочу сделать поиск только по одной категории, а по другим категориям чтобы записи не искались.
Подскажите код который задаст параметры поиска только для определённой страницы на сайте.
Или как сделать отдельный поиск для отдельной страницы сайта?
Дополнительно:
А тег js здесь при чем?
Ответы:
Можно использовать функцию is_page()
Создаете условие под нужную страницу и выводите все что хотите
- Я вот чувствую тоже, что алгоритм должен быть каким-то таким: если страница такая-то или для этой страницы, то искать только записи такой то категории, ну либо выводить результаты в поиске только записи такой то категории. Но я новичок в этом и не знаю как это прописать в виде кода, пробовал всякое но что-то не так, либо ничего не найдено, либо найдены все записи из всех категорий всё равно
- Евгений, https://wp-kama.ru/function/wp_query#categories
Пример функции
page_id - идентификатор страницы, на которой нужен кастомный вывод
cat_id - идентификатор нужной категорииfunction custom_search_filter( $query ){ if( is_page (page_id)) { // задаем нужные нам критерии выборки данных из БД $args = array( 'cat' => cat_id ); $query = new WP_Query( $args ); // Цикл if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); ?> <li><?php the_title() ?></li> <?php } } else { // Постов не найдено } // Возвращаем оригинальные данные поста. Сбрасываем $post. wp_reset_postdata(); } else { // задаем нужные нам критерии выборки данных из БД $args = array( // другие нужные параметры ); $query = new WP_Query( $args ); // Цикл if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); ?> <li><?php the_title() ?></li> <?php } } else { // Постов не найдено } // Возвращаем оригинальные данные поста. Сбрасываем $post. wp_reset_postdata(); } }
function custom_search_filter( $query ){ if( is_page (page_id)) { // задаем нужные нам критерии выборки данных из БД $args = array( 'cat' => cat_id ); $query = new WP_Query( $args ); // Цикл if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); ?> <li><?php the_title() ?></li> <?php } } else { // Постов не найдено } // Возвращаем оригинальные данные поста. Сбрасываем $post. wp_reset_postdata(); } else { // задаем нужные нам критерии выборки данных из БД $args = array( // другие нужные параметры ); $query = new WP_Query( $args ); // Цикл if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); ?> <li><?php the_title() ?></li> <?php } } else { // Постов не найдено } // Возвращаем оригинальные данные поста. Сбрасываем $post. wp_reset_postdata(); } }
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для отдельной страницы лучше сделать отдельную форму поиска и передавать в неё скрытый параметр категории. Тогда общий поиск сайта останется как есть, а специальный поиск будет явно ограничен нужной рубрикой.
Пример формы на нужной странице:
<form role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>"> <input type="search" name="s" value="<?php echo esc_attr(get_search_query()); ?>"> <input type="hidden" name="search_cat" value="12"> <button type="submit">Найти</button> </form>
А в
functions.phpдочерней темы обработайте этот параметр черезpre_get_posts:add_action('pre_get_posts', function ($query) { if (is_admin() || ! $query->is_main_query() || ! $query->is_search()) { return; } if (! empty($_GET['search_cat'])) { $query->set('cat', absint($_GET['search_cat'])); return; } $query->set('cat', '-5,-7,-11,-13,-30,-31,-35'); });
Условие
is_page()на странице результатов поиска обычно уже не сработает, потому что после отправки формы WordPress открывает страницу поиска, а не исходную страницу. Поэтому надежнее передавать маркер формы через hidden input.Если нужна красивая отдельная страница результатов, можно сделать свою страницу с шаблоном и обрабатывать запрос там через
WP_Query, но для начала скрытого поля достаточно.Перед внедрением на рабочем сайте проверьте решение на копии или хотя бы сделайте резервную копию изменяемого файла. После правки включите отображение ошибок, откройте проблемную страницу в обычном и приватном окне, проверьте консоль браузера и логи PHP. Если задача связана с WordPress, WooCommerce или ACF, дополнительно проверьте поведение после очистки кэша и после выхода из админки: часть ошибок видна только для незалогиненного пользователя.
Если код работает только в одном шаблоне, лучше не оставлять его разрозненно в нескольких файлах. Вынесите повторяемую логику в функцию, небольшой плагин или template part, а в шаблоне оставьте только вызов. Так проще поддерживать решение после обновления темы, плагинов и PHP.