О некоторых особенностях работы стандартного поиска в вордпресс я уже писал ранее. Например, статья про улучшение страницы результатов поиска рассказывает как выводить информацию о количестве найденных записей и подсвечивать искомую фразу. Сегодня опубликую еще парочку полезных хаков (сниппетов), позволяющих улучшить работу системы — попробуем убрать из результатов нежелательные посты и выполнить что-то вроде поиска по категориям. Данные задачи могут показаться несколько специфичными, и пригодятся далеко не каждому пользователю WP, но ситуации бывают разные (как минимум, хаки будут полезны тем, кто зарабатывает на биржах ссылок GoGetLinks и других). Итак, поехали…
Исключаем все страницы из поиска
По умолчанию в WordPress при поиске отображаются не только ссылки на найденные посты (post), но и страницы (page). Если ваш сайт использует формат страниц достаточно активно, убирать эту опцию не желательно. С другой стороны, когда они выполняют второстепенную роль (содержат контакты, описание проекта, карту сайта или рекламные публикации), имеет смысл их исключить.
Для этого заходим в function.php, где и размещаем код:
function searchExcludePages($query) { if ($query->is_search) { $query->set('post_type', 'post'); } return $query; } add_filter('pre_get_posts','searchExcludePages'); |
Сохраняем его и проверяем корректность работы. Почитать о том как правильно добавлять код сниппетов в файл function.php можно тут. Либо используйте модуль Code Snippets.
Хак исключения из поиска записей по ID
Допустим, вам нужно убрать из результатов поиска не все страницы, а лишь некоторые конкретные записи. Следующий хак поможет это сделать. Причем он срабатывает не только для элементов типа Page, но и подходит для обычных постов блога (Post). Перед добавлением кода узнайте в админке ID соответствующих публикаций. Хак размещаете в function.php.
function myexclude_search_filter( $query ) { if ( ! $query->is_admin && $query->is_search && $query->is_main_query() ) { $query->set( 'post__not_in', array( 1042, 756 ) ); } } add_action( 'pre_get_posts', 'myexclude_search_filter' ); |
Здесь числа 1042 и 756 — ID заметок, которые исключаются из поиска. Поставьте вместо них свои значения.
Убираем кастомные типы записей из поиска
Некоторые плагины/разработчики добавляют на сайт новые кастомные типы записей (Custom Post Type): работы потфолио, сотрудники, кинофильмы и т.п. Это удобно, т.к. позволяет хранить и редактировать соответствующий контент отдельно от классических постов.
Однако, бывает, встречаются достаточно оригинальные кастомные объекты, например, элементы плагина таймлайна TM Timeline. Каждый из них – определенное событие на общей временной шкале, и хранятся они как раз с помощью Custom Post Type. При этом выводить подобные материалы в поиске нет особого смысла.
Чтобы убрать определенные типы полей из результатов можно использовать следующий сниппет в functions.php:
Внимание! Здесь вместо my-custom-type (встречается в коде дважды) вставляете название нужного вам кастомного типа. Например, в случае с упомянутым выше модулем это «timeline_post». Посмотреть соответствующее значение можно, зайдя в раздел с этими записями и обратив внимание на URL страницы админки, где будет указана переменная post_type=…
Второй вариант решения. Если внедрение подобных полей производится в файлах шаблона (используется функция register_post_type), то вам надо добавить один-единственный параметр exclude_from_search в список аргументов перед регистрированием Custom Post Type:
Поиск в WordPress по категории
Не смотря на название хака данное решение очень похоже на предыдущие. Мы используем тот же прием с классом WP_Query и фильтром pre_get_posts для правки результатов поиска. Однако в этот раз отобразим на странице только те посты, которые будут принадлежать заданным категориями. Если не смотреть на саму реализацию, то фактически у нас получается поиск по рубрикам.
Перед размещением кода в файле функций function.php узнайте ID категорий, участвующих в поиске. Сниппет имеет вид:
Значения 1 и 84 — это ID разделов. Кстати, если нужно использовать только одно значение, третья строка будет выглядеть так:
Кроме того, вы можете дополнить форму поиска опцией выбора раздела блога, а затем подставлять в код соответствующий параметр в качестве ID. Таким образом, получится полноценный WordPress поиск по категории.
Исключение категорий из результатов поиска
Рассмотрим обратную ситуацию. Пару лет назад я публиковал пост с рекомендациями для вебмастеров, торгующих ссылками в GoGetLinks на WordPress сайтах, где рассказывал как исключить платные заметки из RSS, главной страницы, навигации и т.п. С помощью хака ниже вы сможете также убрать лишнюю информацию из результатов поиска.
Код аналогичный за исключением использования другой функции выборки — category__not_in. Размещаете его в файле function.php:
Как и в предыдущем случае, вместо 1 и 84 подставляете ID нужных разделов. Если требуется исключить только одну категорию, удаляете конструкцию array как было показано выше. Для отображения в результатах только постов блога без страниц, применяйте решение из первого хака. В принципе, ничего сложного нет. В будущем, возможно, добавлю еще парочку хаков для поиска в эту или другие статьи.