Главная Новости

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


Опубликовано: 24.08.2018

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

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 заметок, которые исключаются из поиска. Поставьте вместо них свои значения.

Поиск в WordPress по категории

Не смотря на название хака данное решение очень похоже на предыдущие. Мы используем тот же прием с классом WP_Query и фильтром pre_get_posts для правки результатов поиска. Однако в этот раз отобразим на странице только те посты, которые будут принадлежать заданным категориями. Если не смотреть на саму реализацию, то фактически у нас получается поиск по рубрикам.

Перед размещением кода в файле функций function.php узнайте ID категорий, участвующих в поиске. Сниппет имеет вид:

function searchcategory ( $query ) { if ( $query -> is_search ) { $query -> set ( category__in , array ( 1 , 84 ) ) ; } return $query ; } add_filter ( 'pre_get_posts' , 'searchcategory' ) ;

function searchcategory($query) { if ($query->is_search) { $query->set(category__in, array(1,84)); } return $query; } add_filter('pre_get_posts','searchcategory');

Значения 1 и 84 — это ID разделов. Кстати, если нужно использовать только одно значение, третья строка будет выглядеть так:

$query -> set ( category__in , 84 ) ;

$query->set(category__in, 84);

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

Исключение категорий из результатов поиска

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

Код аналогичный за исключением использования другой функции выборки — category__not_in. Размещаете его в файле function.php:

function mysearchexclude ( $query ) { if ( $query -> is_search ) { $query -> set ( 'category__not_in' , array ( 1 , 84 ) ) ; } return $query ; } add_filter ( 'pre_get_posts' , 'mysearchexclude' ) ;

function mysearchexclude($query) { if ($query->is_search) { $query->set('category__not_in', array(1,84)); } return $query; } add_filter('pre_get_posts','mysearchexclude');

Как и в предыдущем случае, вместо 1 и 84 подставляете ID нужных разделов. Если требуется исключить только одну категорию, удаляете конструкцию array как было показано выше. Для отображения в результатах только постов блога без страниц, применяйте решение из первого хака. В принципе, ничего сложного нет. В будущем, возможно, добавлю еще парочку хаков для поиска в эту или другие статьи.

rss