Вопрос или проблема
Как я могу создать строку поиска для страницы, которая будет искать только по определённым идентификаторам страниц? Это не должно влиять на строку поиска на других страницах.
Я попробовал следующее:
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));
}
}
Подробное объяснение кода
-
Проверка на админке:
!is_admin()
– это условие гарантирует, что изменения будут применены только к пользовательскому интерфейсу, а не к административной панели WordPress. -
Главный запрос:
$query->is_main_query()
– этот метод позволяет увериться, что мы работаем именно с основным запросом для страницы и не вмешиваемся в другие запросы, например, виджетов или секций с пагинацией. -
Проверка на страницу поиска:
is_search()
– позволяет нам удостовериться, что мы обрабатываем именно запрос поиска. -
Ограничение на конкретную страницу:
is_page('your-page-slug')
– здесь укажите слаг вашей страницы или используйте соответствующий ID, чтобы уточнить, что изменения касаются именно этой страницы. -
Фильтрация по определённым ID:
$query->set('post__in', array(22103, 22121));
устанавливает ограничение на поиск только для указанных идентификаторов страниц.
Заключение
Эта реализация обеспечит работу поисковой строки на одной странице с ограничением по идентификаторам, не влияя на другие страницы. Убедитесь, что вы изменили заместо your-page-slug
соответствующий слаг вашей страницы, чтобы код работал корректно. Это решение является оптимальным, так как оно не затрагивает глобальные настройки поиска и позволяет вам точно контролировать, где и как применяется ваш код.
Таким образом, вы сможете гарантировать, что поиск будет всегда соответствовать вашим потребностям, сохраняя эффективность и настраиваемость вашего сайта.