10 хаков для улучшения поиска на WordPress

Поиск на сайтах под управлением WordPress достаточно самодостаточен, но есть специфические ситуации, когда требуется вмешательство в его работу. Можно заручиться работой плагинов, а можно и обойтись парой строчек кода в файл function.php Вашей текущей темы. В каких ситуациях нам может потребоваться вмешательство в работу поиска и как сделать поиск на сайте WordPress управляемым?

Я собрал 10 самых популярных хаков для тонких настроек поиска WP, с которыми мне пришлось столкнутся на практике! Уверен, они Вам пригодятся, поэтому записываем:

Исключить из поиска страницы

Для того, чтобы исключить из результатов поиска все имеющиеся у Вас на сайте статические страницы (настройки - страницы - все страницы), надо добавить в function.php следующий код:

function SearchFilter($query) {
if(!is_admin()){
if ($query->is_search) {
$query->set('post_type', 'post');
}
}
return $query;
}
add_filter('pre_get_posts','SearchFilter');

Код выше, разрешает поиск исключительно по записях, исключив страницы.

Исключить из поиска все записи

Как исключить из результатов поиска записи, оставив лишь для поиска страницы? Код следующий:

function SearchFilter($query) {
if(!is_admin()){
if ($query->is_search) {
$query->set('post_type', 'page');
}
}
return $query;
}
add_filter('pre_get_posts','SearchFilter');

Поиск только в указанных записях

Если необходим поиск лишь по некоторым записям, в файл function.php следующий код, в котором перечисляем id этих записей:

function my_search_filter($query) {
if ($query->is_search) {
$query->set('post__in',array(1,2,3,4,5,6)); //id постов перечислены через запятую
}
return $query;
}
add_filter('pre_get_posts','my_search_filter');

Исключить из поиска страницы вложений (attachment)

Страницы вложений (attachment) могут появится в результатах поиска на WP, а поскольку они не представляют никакого интереса для Ваших читателей, их нужно и можно исключить из поиска нижеследующим кодом:

add_action( 'init', 'exclude_images_from_search_results' );
function exclude_images_from_search_results() {
global $wp_post_types;
$wp_post_types['attachment']->exclude_from_search = true;
}

Включить в поиск произвольные типы записей

Если на Вашем сайте используются произвольные типы записей, то они могут не появится в результатах поиска, их нужно включать в поиск принудительно.  Используйте такой код (где video - название ваших произвольных типов):

function search_filter($query) {
if ( !is_admin() && $query->is_main_query() ) {
if ($query->is_search) {
$query->set('post_type', array( 'post', 'video' ) );
}}}
add_action('pre_get_posts','search_filter');

Исключить из поиска определенные рубрики

Нижеследующим кодом мы исключим из результатов поиска рубрики с id 1 и 2 (через запятую вы можете перечислить больше рубрик, впереди цифры должен стоять "-" (минус):

function search_filter ($query) {
if ($query->is_search)
$query->set('cat', '-1, -2');
return $query;
}
add_filter('pre_get_posts', 'search_filter');

Поиск только в указанных рубриках

Что заставить WordPress искать только в указанных рубриках, код остается такой же, но перечисляем рубрики без знака "-":

function search_filter ($query) {
if ($query->is_search)
$query->set('cat', '1, 2');
return $query;
}
add_filter('pre_get_posts', 'search_filter');

Перенаправить к странице, содержащей поисковый запрос

Представим себе ситуацию, что в результатах поиска у нас появилась одна запись. Соответственно, у пользователя не осталось выбора и мы можем перенаправить пользователя непосредственно к этой странице автоматически. Это очень удобно!

add_action('template_redirect', 'redirect_single_post');
function redirect_single_post() {
if (is_search()) {
global $wp_query;
if ($wp_query->post_count == 1) {
wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
}}}

Код будет автоматически перенаправлять читателя на найденную в результате поиска запись, при условии, что найдена всего одна такая запись.

Увеличить число результатов поиска на странице

По умолчанию в WordPress выводится 10 сообщений на странице результатов поиска (или ваше число в зависимости от  настроек вывода числа записей в рубриках). Если вам необходимо изменить это число для результатов поиска, используйте такой хак (где число 40 - число найденных результатов поиска на одной странице):

function limit_posts_per_search_page() {
if ( is_search() )
set_query_var('posts_per_archive_page', 40);
}
add_filter('pre_get_posts', 'limit_posts_per_search_page');

Выключить функционал поиска на WordPress

Иногда возникает необходимость выключить поиск на сайте. Даже если убрать саму форму поиска, сам функционал будет доступен по ссылке /?s=поиск
Как выключить функционал поиска на WordPress целиком? Нижеследующих код прекрасно справится с этой задачей, а все запросы к поиску на сайте будут переадресованы на 404 страницу.

function fb_filter_query ($query, $error = true) {
if (is_search()) {
$query->is_search = false;
$query->query_vars[s] = false;
$query->query[s] = false;
if ($error == true)
$query->is_404 = true;
}}
add_action('parse_query', 'fb_filter_query');
add_filter('get_search_form', create_function ('$a', "return null;"));

Надеюсь, хаки из моей скромной коллекции сделают Ваш поиск на WordPress более точным и, соответственно, полезным для Ваших посетителей! Если у Вас возникла нетривиальная ситуация с поиском на WordPress, не стесняйтесь написать об этом в комментариях. Попробуем разобраться с Вашей проблемой коллективно!

Оцените материал:
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (9 голоса, рейтинг: 4,33 из 5)
Загрузка...

Вячеслав - типичный интернетчикВячеслав Скоблей (ака files) - типичный интернетчик. Скитаюсь интернетом, пишу на PHP, увлекаюсь созданием веб-сайтов на Wordpress, решаю многочисленные проблемы, которые до появления интернета не существовали...

Специализируюсь на безопасности сайтов: защищаю сайты от атак и взломов, занимаюсь лечением вирусов на сайтах и профилактикой...

Наверняка у Вас есть вопросы, просьбы или пожелания. Не стесняйтесь спросить, я отвечаю всегда быстро...

6 комментарий

  1. Сергей says:

    Как сделать поиск только по первому слову. Например:"Петров" выводит Петров - это правильно,но выводит и Трапезников Иван Петрович - это уже не нужно. В слове Петрович программа нашла Петров

  2. Я тут says:

    Хотелось бы сделать такой поиск, чтобы без нажатия на него показывался заголовок и картинка, .а лучше,чтобы много похожих вариантов показывалось сразу.

  3. Артем says:

    Проблема в том, что можно придумывать всякие вариации с контентом целиком. Т.е. включать/исключать целиком страницы/записи/архивы по определенным параметрам: автор, дата, id, тип публикации и т.д.
    Меня интересует следующее: возможно ли сделать какую- нибудь функцию (тот же шорт код), оборачивая в который часть текста, заставить эту часть текста не участвовать в поиске. Например: у меня есть спойлер, который выполняет роль меню в мобильной версии (не суть важно). Допустим, название спойлера "канцелярия", содержимое: "карандаш / ручка / бумага". Этот спойлер находится у меня на страницах "Карандаш", "Ручка", "Бумага". Если Я ввожу в поиск "карандаш", я хочу в результатах видеть страницу "Карандаш" и всех других, в которых "карандаш" упоминается помимо спойлера. Но не хочу видеть страницы "Ручка" и "Бумага", хотя я понимаю, что поиск работает правильно, поскольку на этих страницах у меня "карандаш" под спойлером. Вывод такой - обернуть спойлер тегами, которые исключали бы его из поиска. Если на странице встречается "карандаш" вне шорткода (спойдера), страница выводится в результатах поиска. Если только в спойлере - не выводится.
    Подобной фильтрации не могу найти на просторах. Хотя, предполагаю, что реализовать теоретически возможно.
    Если будут идеи, поделитесь пжл! :)

  4. Здравствуйте. Спасибо за интересную статью. Я искал по всему интернету как сделать результаты поиска с совпадениями в названии, но нигде не смог этого найти. К примеру, человек ошибся на одну букву в названии и в результатах ничего не находит, хотелось, бы чтобы в таком случает предлагались похожие результаты.

  5. says:

    А как сделать поиск только по произвольным типам записей?

  6. says:

    Сделано) Теперь все ОК!

Добавить комментарий

Ваш адрес email не будет опубликован.