Поисковая строка для страницы, которая ищет только определённые ID страниц.

Вопрос или проблема

Как я могу создать строку поиска для страницы, которая будет искать только по определённым идентификаторам страниц? Это не должно влиять на строку поиска на других страницах.

Я попробовал следующее:

 add_filter( 'pre_get_posts', 'pregetposts_forspecificpage' );

    function pregetposts_forspecificpage($query){
       if ($query->is_search) {
       $query->set('post_type', 'page');
       $query->set('post__in', array(22103,22121));
       }
       return $query;
    }

Но это влияет на строки поиска, используемые на других страницах.

Вы можете попробовать изменить свой фильтр следующим образом

function pregetposts_forspecificpage($query){
   if(!is_admin() && $query->is_main_query() && is_search())
   {
     $query->set('post_type', 'page');
     $query->set('post__in', array(22103,22121));
   }
}

Редактирование: добавлено !is_admin(), потому что мы хотим изменить запрос только на фронте. $query->is_main_query() для того, чтобы убедиться, что мы изменяем основной запрос. Заменено $query->is_search на is_search()

Кроме того, вам не нужно возвращать $query.

Ответ или решение

Создание поисковой строки для страницы, которая будет осуществлять поиск только по определённым идентификаторам страниц, — задача, требующая внимания к деталям и понимания работы с запросами в WordPress. Рассмотрим, как правильно реализовать данную функциональность, не затрагивая другие страницы с поисковыми строками.

Описание проблемы

Ваша цель — создать поисковую строку на одной конкретной странице, чтобы искать только по определённым идентификаторам страниц (например, 22103 и 22121). Важно, чтобы это изменение не влияло на другие страницы, имеющие свои собственные функции поиска.

Решение

Использование фильтра pre_get_posts

WordPress предоставляет возможность изменять параметры запросов через фильтр pre_get_posts. Вам нужно убедиться, что изменения применяются исключительно для главного запроса на правильной странице:

add_filter('pre_get_posts', 'pregetposts_forspecificpage');

function pregetposts_forspecificpage($query) {
    if (!is_admin() && $query->is_main_query() && is_search() && is_page('your-page-slug')) {
        // Здесь указываем, что мы ищем только страницы, соответствующие определённым ID
        $query->set('post_type', 'page');
        $query->set('post__in', array(22103, 22121));
    }
}

Подробное объяснение кода

  1. Проверка на админке: !is_admin() – это условие гарантирует, что изменения будут применены только к пользовательскому интерфейсу, а не к административной панели WordPress.

  2. Главный запрос: $query->is_main_query() – этот метод позволяет увериться, что мы работаем именно с основным запросом для страницы и не вмешиваемся в другие запросы, например, виджетов или секций с пагинацией.

  3. Проверка на страницу поиска: is_search() – позволяет нам удостовериться, что мы обрабатываем именно запрос поиска.

  4. Ограничение на конкретную страницу: is_page('your-page-slug') – здесь укажите слаг вашей страницы или используйте соответствующий ID, чтобы уточнить, что изменения касаются именно этой страницы.

  5. Фильтрация по определённым ID: $query->set('post__in', array(22103, 22121)); устанавливает ограничение на поиск только для указанных идентификаторов страниц.

Заключение

Эта реализация обеспечит работу поисковой строки на одной странице с ограничением по идентификаторам, не влияя на другие страницы. Убедитесь, что вы изменили заместо your-page-slug соответствующий слаг вашей страницы, чтобы код работал корректно. Это решение является оптимальным, так как оно не затрагивает глобальные настройки поиска и позволяет вам точно контролировать, где и как применяется ваш код.

Таким образом, вы сможете гарантировать, что поиск будет всегда соответствовать вашим потребностям, сохраняя эффективность и настраиваемость вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...