Содержание
- 1 Исключить из поиска страницы
- 2 Исключить из поиска все записи
- 3 Поиск только в указанных записях
- 4 Исключить из поиска страницы вложений (attachment)
- 5 Включить в поиск произвольные типы записей
- 6 Исключить из поиска определенные рубрики
- 7 Поиск только в указанных рубриках
- 8 Перенаправить к странице, содержащей поисковый запрос
- 9 Увеличить число результатов поиска на странице
- 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, не стесняйтесь написать об этом в комментариях. Попробуем разобраться с Вашей проблемой коллективно!
Как сделать поиск только по первому слову. Например:"Петров" выводит Петров - это правильно,но выводит и Трапезников Иван Петрович - это уже не нужно. В слове Петрович программа нашла Петров
Хотелось бы сделать такой поиск, чтобы без нажатия на него показывался заголовок и картинка, .а лучше,чтобы много похожих вариантов показывалось сразу.
Проблема в том, что можно придумывать всякие вариации с контентом целиком. Т.е. включать/исключать целиком страницы/записи/архивы по определенным параметрам: автор, дата, id, тип публикации и т.д.
Меня интересует следующее: возможно ли сделать какую- нибудь функцию (тот же шорт код), оборачивая в который часть текста, заставить эту часть текста не участвовать в поиске. Например: у меня есть спойлер, который выполняет роль меню в мобильной версии (не суть важно). Допустим, название спойлера "канцелярия", содержимое: "карандаш / ручка / бумага". Этот спойлер находится у меня на страницах "Карандаш", "Ручка", "Бумага". Если Я ввожу в поиск "карандаш", я хочу в результатах видеть страницу "Карандаш" и всех других, в которых "карандаш" упоминается помимо спойлера. Но не хочу видеть страницы "Ручка" и "Бумага", хотя я понимаю, что поиск работает правильно, поскольку на этих страницах у меня "карандаш" под спойлером. Вывод такой - обернуть спойлер тегами, которые исключали бы его из поиска. Если на странице встречается "карандаш" вне шорткода (спойдера), страница выводится в результатах поиска. Если только в спойлере - не выводится.
Подобной фильтрации не могу найти на просторах. Хотя, предполагаю, что реализовать теоретически возможно.
Если будут идеи, поделитесь пжл! :)
Здравствуйте. Спасибо за интересную статью. Я искал по всему интернету как сделать результаты поиска с совпадениями в названии, но нигде не смог этого найти. К примеру, человек ошибся на одну букву в названии и в результатах ничего не находит, хотелось, бы чтобы в таком случает предлагались похожие результаты.
А как сделать поиск только по произвольным типам записей?
Сделано) Теперь все ОК!