Хаки для поиска по WordPress категориям, исключение страниц из результатов и не только

Click here to view original web page at wordpressinside.ru
исключение страниц в результатах

О некоторых особенностях работы стандартного поиска в вордпресс я уже писал ранее. Например, статья про улучшение страницы результатов поиска рассказывает как выводить информацию о количестве найденных записей и подсвечивать искомую фразу. Сегодня опубликую еще парочку полезных хаков (сниппетов), позволяющих улучшить работу системы — попробуем убрать из результатов нежелательные посты и выполнить что-то вроде поиска по категориям. Данные задачи могут показаться несколько специфичными, и пригодятся далеко не каждому пользователю 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 как было показано выше. Для отображения в результатах только постов блога без страниц, применяйте решение из первого хака. В принципе, ничего сложного нет. В будущем, возможно, добавлю еще парочку хаков для поиска в эту или другие статьи.