Янв
16
11

Хаки для поиска по 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, средний балл: 5,55 из 7)
Загрузка...

категория Категории: Хаки и секреты;
теги Теги: , , , , , , .

комментариев 11 к статье “Хаки для поиска по WordPress категориям, исключение страниц из результатов и не только”

  • blogrub.ru   08.08.2012

    Сначала подумал что статья про Хакеров :)

  • personNet   13.08.2012

    Хд, я тоже так подумал

  • Artem   27.09.2012

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

  • Tod   28.09.2012

    Artem, возможно, есть и такая опция — надо изучать функцию поиска, я не разбирался в этом.

  • Olunka   25.10.2012

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

  • Tod   26.10.2012

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

  • Denis   27.09.2014

    Не совсем верно работает исключение нескольких категорий.
    Работает нормально с таким кодом
    $query->set(‘category__not_in’,array(10,11,12));

  • beklem25   11.11.2016

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

  • Дмитрий   17.06.2018

    День добрый, ни как немогу найти как сделать поиск с помощью селектора, к примеру.
    У меня на сайте стоит плагин вукомерс, так же доска обьявлений awpcp, форум, и новостной блог (Знаю что все в перемешку, но заказчик платит — я делаю=)), вот и мне нужно сделать поиск по этим разделам.

    Есть поле ввода , потом селектор, потом кнопка отправить.

    Когда Пользователь выбирает раздел Маркет, то поиск будет осуществлятся по вукомерсу, если он выбирает обьявления, то по awpcp, если выбирает в селекторе Новости, то по записям вордпрес, если форум то по постам форума. Направьте плз хоть на мысль правильную…

  • Tod   17.06.2018

    Дмитрий, возможно, есть какой-то плагин, позволяющий выбирать конкретную «область» для поиска, но я такой не встречал. Скорее всего, без дополнительного программирования тут не обойтись — либо доработка существующего модуля поиска, либо написание своего с нуля.

  • Dmitrii77   09.05.2021

    А есть ли какое нибудь решение для поиска по категориям с использованием Sphinx, у меня стоит плагин WordPress Sphinx Search возможно ли его как то доработать чтобы он искал по категориям?

Оставить комментарий


Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!

Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:

Поиск:
Последние посты
Лучшее в категории

Облако тегов
Скажи свое мнение!

В чем основные плюсы Wordpress?

Посмотреть результаты

Загрузка ... Загрузка ...
Друзья проекта
Последние новости