По умолчанию функционал поиска в WordPress показывает в результатах все типы записей и страниц. Вы можете захотеть убрать из поиска страницы, категорию, таксономию или записи конкретного автора.
Чтобы это осуществить нам нужно поправить основной запрос is_search()
на хуке pre_get_posts
. Рассмотрим примеры.
Как скрыть из поиска страницы
Вы можете использовать следующий код, чтобы оставить в результатах поиска только тип поста post
.
add_action( 'pre_get_posts', 'skill_search_filter' );
function skill_search_filter( $query ){
if( ! is_admin() && $query->is_main_query() && $query->is_search ){
$query->set( 'post_type', 'post' );
}
}
Т.к. здесь нет такого метода как unset
, мы можем только переназначить переменные методом set
.
Что касается условий, то мы проверяем, что находимся не в админке, что это основной запрос и что это запрос поисковый.
Будьте аккуратнее, этим кодом вы исключите из поиска не только стандартные страницы, но и все записи пользовательского типа.
Как скрыть из поиска категорию
Чтобы исключить посты определенной категории из результатов поиска воспользуйтесь следующим примером:
add_action( 'pre_get_posts', 'skill_search_filter' );
function skill_search_filter( $query ){
if( ! is_admin() && $query->is_main_query() && $query->is_search ){
$query->set( 'cat','-2,-3' );
}
}
В результате работы этого фильтра будут исключены посты, которые находятся в категориях 2 и 3 из результатов поиска.
Если пост прикреплен одновременно к категориям 3 и 4, он не будет исключен из результатов поиска этим фильтром.
Как скрыть из поиска кастомный тип записи
Для исключения из поиска результатов произвольного типа записей достаточно установить аргумент 'public' = 'false'
при регистрации (функция register_post_type()
), но если такой возможности нет, вы также можете воспользоваться этим хуком.
Здесь нам понадобится модификация первого примера: нам нужно передать в $query
только те типы постов, которые мы хотим оставить в результатах поиска.
add_action( 'pre_get_posts', 'skill_search_filter' );
function skill_search_filter( $query ){
if( ! is_admin() && $query->is_main_query() && $query->is_search ){
$query->set('post_type', array( 'post', 'portfolio', 'service' ) );
}
}
Например, этот код оставит в результатах поиска только посты, страницы портфолио и услуги.
Как скрыть из поиска записи автора
Чтобы скрыть записи определенного автора используйте следующий код:
add_action( 'pre_get_posts', 'skill_search_filter' );
function skill_search_filter( $query ){
if( ! is_admin() && $query->is_main_query() && $query->is_search ){
$query->set ( 'author','-8, -10, -12' );
}
}
В результате его выполнения будут исключены записи авторов, имеющих ID 8, 10 и 12.
С помощью плагина
Если вы по каким-то причинам не хотите править код вашего сайта, вы можете воспользоваться бесплатным плагином Search Exclude. Там достаточно простые и интуитивно понятные настройки.