Хаки для поиска по WordPress категориям, исключение страниц из результатов и не только
О некоторых особенностях работы стандартного поиска в вордпресс я уже писал ранее. Например, статья про улучшение страницы результатов поиска рассказывает как выводить информацию о количестве найденных записей и подсвечивать искомую фразу. Сегодня опубликую еще парочку полезных хаков (сниппетов), позволяющих улучшить работу системы — попробуем убрать из результатов нежелательные посты и выполнить что-то вроде поиска по категориям. Данные задачи могут показаться несколько специфичными, и пригодятся далеко не каждому пользователю 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:
add_action( 'init', 'update_my_custom_type', 99 ); /** * update_my_custom_type * * @author Joe Sexton <joe@webtipblog.com> */ function update_my_custom_type() { global $wp_post_types; if ( post_type_exists( 'my-custom-type' ) ) { // exclude from search results $wp_post_types['my-custom-type']->exclude_from_search = true; } } |
Внимание! Здесь вместо my-custom-type (встречается в коде дважды) вставляете название нужного вам кастомного типа. Например, в случае с упомянутым выше модулем это «timeline_post». Посмотреть соответствующее значение можно, зайдя в раздел с этими записями и обратив внимание на URL страницы админки, где будет указана переменная post_type=…
Второй вариант решения. Если внедрение подобных полей производится в файлах шаблона (используется функция register_post_type), то вам надо добавить один-единственный параметр exclude_from_search в список аргументов перед регистрированием Custom Post Type:
$labels = array( // ... ); $args = array( 'labels' => $labels // ... 'exclude_from_search' => true, // ... ); register_post_type( 'my-custom-type', $args ); |
Поиск в 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'); |
Значения 1 и 84 — это ID разделов. Кстати, если нужно использовать только одно значение, третья строка будет выглядеть так:
$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'); |
Как и в предыдущем случае, вместо 1 и 84 подставляете ID нужных разделов. Если требуется исключить только одну категорию, удаляете конструкцию array как было показано выше. Для отображения в результатах только постов блога без страниц, применяйте решение из первого хака. В принципе, ничего сложного нет. В будущем, возможно, добавлю еще парочку хаков для поиска в эту или другие статьи.
комментариев 11 к статье “Хаки для поиска по WordPress категориям, исключение страниц из результатов и не только”
Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!
Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:
- Як сховати відсутні товари в Woocommerce шорткодах та схожих товарах
- Сервіс AdMaven + плагін для монетизації трафіка на WordPress сайтах
- Плагіни для створення стрічки новин з біжучим рядком в WordPress
- Як змінити розміщення кнопки оформлення замовлення в WooCommerce
- Плагін WHWS Display In Stock Products First – відображення товарів в наявності першими
- Підписка MonsterONE: чи варто використовувати цей сервіс у 2023 році? (+5 продуктів, які треба скачати в першу чергу)
- Онлайн генератор ссылок на мессенджеры для WordPress и не только
- WooCommerce (46)
- Безопасность (12)
- Видео (6)
- Виджеты (28)
- Возможности (141)
- Вопрос-ответ (6)
- Начинающим (52)
- Новости (46)
- Оптимизация (23)
- Плагины (246)
- Сервисы (87)
- Хаки и секреты (87)
- Шаблоны (45)
- Оптимизируем WordPress header и удаляем лишний код (5,19 из 7, голосов - 43)
- Как создать пункт меню без ссылки в wordpress (6,39 из 7, голосов - 23)
- Добавление кнопки Вконтакте, Facebook и Twitter в wordpress блог (6,14 из 7, голосов - 21)
- Выполнение jQuery скриптов при выборе вариаций товаров в WooCommerce (3,96 из 7, голосов - 26)
- Хаки для вариаций товаров в WooCommerce (5,00 из 7, голосов - 20)
- Вывод текста в блоге только на главной (6,85 из 7, голосов - 13)
- Как убрать category в WordPress категориях — зачем это делать, плагины для реализации (5,31 из 7, голосов - 16)
- Дизайн Мания - о веб-дизайне и не только.
- Tod's Blog - все про заработок онлайн.
- Вебдванольные заметки - обзоры веб-сервисов.
- Советы по выбору холодильника LG с технологией No Frost
- Зачем нужны Wi-Fi ретрансляторы и как выбрать подходящую модель
- Введение в онлайн-казино Slotor777: многообразие игр и привлекательные бонусы
- Необходимость использования облачного хранилища в наше время, что важно и как выгодно?
- Спрощення процесу звітності за допомогою програми BAS Бухгалтерія
- Технологія підключення інтернету GPON та її переваги
- За що гравці найбільше цінують Lineage 2
- Для каких проектов нужна аренда виртуального сервера и что такое VPS
Сначала подумал что статья про Хакеров :)
Хд, я тоже так подумал
Вот если бы еще узнать, как выводить на странице поиска только ту часть текста страницы, в которой содержится ключевое поле, а то стандартная функция вывода, выводит только первые слова, хотя ключевое слово может находится и внизу страницы.
Artem, возможно, есть и такая опция — надо изучать функцию поиска, я не разбирался в этом.
Спасибо, статья оказалась весьма кстати.
Есть ли смысл оставлять поиск на вордпресс стандартный или может установить поиск от гугл? хоть копеечка будет падать
Olunka, местами поиск от гугла мне больше нравится чем стандартный, поэтому даже не ради копеечки я бы его ставил.
Не совсем верно работает исключение нескольких категорий.
Работает нормально с таким кодом
$query->set(‘category__not_in’,array(10,11,12));
Интересно есть какие то хаки для интернет магазинов. Стандартный поиск как то слабоватый
Вот ищу некоторое время уже, так не хочется писать самостоятельно..
День добрый, ни как немогу найти как сделать поиск с помощью селектора, к примеру.
У меня на сайте стоит плагин вукомерс, так же доска обьявлений awpcp, форум, и новостной блог (Знаю что все в перемешку, но заказчик платит — я делаю=)), вот и мне нужно сделать поиск по этим разделам.
Есть поле ввода , потом селектор, потом кнопка отправить.
Когда Пользователь выбирает раздел Маркет, то поиск будет осуществлятся по вукомерсу, если он выбирает обьявления, то по awpcp, если выбирает в селекторе Новости, то по записям вордпрес, если форум то по постам форума. Направьте плз хоть на мысль правильную…
Дмитрий, возможно, есть какой-то плагин, позволяющий выбирать конкретную «область» для поиска, но я такой не встречал. Скорее всего, без дополнительного программирования тут не обойтись — либо доработка существующего модуля поиска, либо написание своего с нуля.
А есть ли какое нибудь решение для поиска по категориям с использованием Sphinx, у меня стоит плагин WordPress Sphinx Search возможно ли его как то доработать чтобы он искал по категориям?