Как на одной из страниц исключить из поиска все рубрики категории, кроме одной?

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

Здравствуйте

У меня на всех страницах выведена форма поиска методом :

<?php get_search_form(); ?>

Поиск ищет по всем рубрикам (категориям), кроме тех, которые я исключил добавив в файл functions.php такой код:

function skill_search_filter( $query ){ 	if( ! is_admin() &amp;&amp; $query-&gt;is_main_query() &amp;&amp; $query-&gt;is_search ){ 		$query-&gt;set( 'cat','-5,-7,-11,-13,-30,-31,-35' ); 	}

function skill_search_filter( $query ){ if( ! is_admin() &amp;&amp; $query-&gt;is_main_query() &amp;&amp; $query-&gt;is_search ){ $query-&gt;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' =&gt; cat_id         );          $query = new WP_Query( $args );          // Цикл         if ( $query-&gt;have_posts() ) {             while ( $query-&gt;have_posts() ) {                 $query-&gt;the_post();                 ?&gt;                 &lt;li&gt;&lt;?php the_title() ?&gt;&lt;/li&gt;                 &lt;?php             }         }         else {             // Постов не найдено         }          // Возвращаем оригинальные данные поста. Сбрасываем $post.         wp_reset_postdata();     } else {         // задаем нужные нам критерии выборки данных из БД         $args = array(             // другие нужные параметры         );          $query = new WP_Query( $args );          // Цикл         if ( $query-&gt;have_posts() ) {             while ( $query-&gt;have_posts() ) {                 $query-&gt;the_post();                 ?&gt;                 &lt;li&gt;&lt;?php the_title() ?&gt;&lt;/li&gt;                 &lt;?php             }         }         else {             // Постов не найдено         }          // Возвращаем оригинальные данные поста. Сбрасываем $post.         wp_reset_postdata();     } }

    function custom_search_filter( $query ){ if( is_page (page_id)) { // задаем нужные нам критерии выборки данных из БД $args = array( 'cat' =&gt; cat_id ); $query = new WP_Query( $args ); // Цикл if ( $query-&gt;have_posts() ) { while ( $query-&gt;have_posts() ) { $query-&gt;the_post(); ?&gt; &lt;li&gt;&lt;?php the_title() ?&gt;&lt;/li&gt; &lt;?php } } else { // Постов не найдено } // Возвращаем оригинальные данные поста. Сбрасываем $post. wp_reset_postdata(); } else { // задаем нужные нам критерии выборки данных из БД $args = array( // другие нужные параметры ); $query = new WP_Query( $args ); // Цикл if ( $query-&gt;have_posts() ) { while ( $query-&gt;have_posts() ) { $query-&gt;the_post(); ?&gt; &lt;li&gt;&lt;?php the_title() ?&gt;&lt;/li&gt; &lt;?php } } else { // Постов не найдено } // Возвращаем оригинальные данные поста. Сбрасываем $post. wp_reset_postdata(); } }

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

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

Заказать помощь
Лучший ответ
1
Frontend-редакция Ответ

Для отдельной страницы лучше сделать отдельную форму поиска и передавать в неё скрытый параметр категории. Тогда общий поиск сайта останется как есть, а специальный поиск будет явно ограничен нужной рубрикой.

Пример формы на нужной странице:

&lt;form role="search" method="get" action="&lt;?php echo esc_url(home_url('/')); ?&gt;"&gt;
    &lt;input type="search" name="s" value="&lt;?php echo esc_attr(get_search_query()); ?&gt;"&gt;
    &lt;input type="hidden" name="search_cat" value="12"&gt;
    &lt;button type="submit"&gt;Найти&lt;/button&gt;
&lt;/form&gt;

&lt;form role="search" method="get" action="&lt;?php echo esc_url(home_url('/')); ?&gt;"&gt; &lt;input type="search" name="s" value="&lt;?php echo esc_attr(get_search_query()); ?&gt;"&gt; &lt;input type="hidden" name="search_cat" value="12"&gt; &lt;button type="submit"&gt;Найти&lt;/button&gt; &lt;/form&gt;

А в functions.php дочерней темы обработайте этот параметр через pre_get_posts:

add_action('pre_get_posts', function ($query) {
    if (is_admin() || ! $query-&gt;is_main_query() || ! $query-&gt;is_search()) {
        return;
    }
 
    if (! empty($_GET['search_cat'])) {
        $query-&gt;set('cat', absint($_GET['search_cat']));
        return;
    }
 
    $query-&gt;set('cat', '-5,-7,-11,-13,-30,-31,-35');
});

add_action('pre_get_posts', function ($query) { if (is_admin() || ! $query-&gt;is_main_query() || ! $query-&gt;is_search()) { return; } if (! empty($_GET['search_cat'])) { $query-&gt;set('cat', absint($_GET['search_cat'])); return; } $query-&gt;set('cat', '-5,-7,-11,-13,-30,-31,-35'); });

Условие is_page() на странице результатов поиска обычно уже не сработает, потому что после отправки формы WordPress открывает страницу поиска, а не исходную страницу. Поэтому надежнее передавать маркер формы через hidden input.

Если нужна красивая отдельная страница результатов, можно сделать свою страницу с шаблоном и обрабатывать запрос там через WP_Query, но для начала скрытого поля достаточно.

Перед внедрением на рабочем сайте проверьте решение на копии или хотя бы сделайте резервную копию изменяемого файла. После правки включите отображение ошибок, откройте проблемную страницу в обычном и приватном окне, проверьте консоль браузера и логи PHP. Если задача связана с WordPress, WooCommerce или ACF, дополнительно проверьте поведение после очистки кэша и после выхода из админки: часть ошибок видна только для незалогиненного пользователя.

Если код работает только в одном шаблоне, лучше не оставлять его разрозненно в нескольких файлах. Вынесите повторяемую логику в функцию, небольшой плагин или template part, а в шаблоне оставьте только вызов. Так проще поддерживать решение после обновления темы, плагинов и PHP.

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

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

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

комментарий

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

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