Несколько способов улучшить поиск в WordPress
Встроенный поисковый движок WordPress — не самая сильная сторона этой популярной системы управления сайтом. В этой статье собраны несколько сниппетов, которые помогут улучшить поиск в WordPress.
Редирект на страницу поста, если только один найден
Начнем с небольшого сниппета, который автоматически перенаправляет пользователя на первую найденную запись, если найден только один пост . Вставьте код в файл functions.php.
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
WordPress не возвращает количество найденных постов в результатах поиска, хотя эта информация может быть полезна для посетителя.
Для отображения количества найденных постов, откройте файл our search.php. Найдите строку:
<h2>Search Results</h2>
Замените её этим:
<h2>Search Results for <?php
/* Search Count */
$allsearch = &new WP_Query("s=$s&showposts=-1");
$key = wp_specialchars($s, 1);
$count = $allsearch->post_count; _e('');
_e('<span>');
echo $key; _e('</span>'); _e(' — ');
echo $count . ' '; _e('articles');
wp_reset_query(); ?></h2>
Подсветка искомого текста в результатах поиска WordPress
Один из способов сделать поиск в WordPress более приятным и понятным — подсветка текста, который искал посетитель.
Для подсветки текста в поиске, откройте файл search.php найдите функцию the_title(). Замените её на строку:
echo $title;
И добавьте следующий код прямо перед этой строкой
<?php
$title = get_the_title();
$keys= explode(" ",$s);
$title = preg_replace('/('.implode('|', $keys) .')/iu',
'<strong>\0</strong>',
$title);
?>
Сохраните файл search.php и откройте style.css. Добавьте в него строку:
strong.search-excerpt { background: yellow; }
Теперь поиск выглядит гораздо лучше 🙂
Изменение количества постов на странице
По — умолчанию WordPress выводит по 10 записей на страницу. Если вы хотите изменить это число, просто вставьте следующий код в файл functions.php. Измените число в 3 строке на число постов, которое хотите видеть на странице.
function limit_posts_per_search_page() {
if ( is_search() )
set_query_var('posts_per_archive_page', 20);
}
add_filter('pre_get_posts', 'limit_posts_per_search_page');
Искать только в записях определенного типа
Если вы хотите искать только в постах определенного типа, просто вставьте код в файл functions.php и измените тип записей в 3 строке.
function SearchFilter($query) {
if ($query->is_search) {
$query->set('post_type', 'feeds');
}
return $query;
}
add_filter('pre_get_posts','SearchFilter');
Поиск по определенным категориям в WordPress
Если, по каким-то причинам, вы хотите исключить некоторые категории из результатов поиска, измените номера категорий в 3 строке и вставьте следующий код в шаблон search.php вашей темы:
<?php if( is_search() ) :
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts("s=$s&paged=$paged&cat=1,2,3");
endif; ?>
Отключение поиска в WordPress
Конечно, поиск — это очень важная функция для сайта, но в некоторых случаях, поиск не нужен. Функционал WordPress позволяет полностью отключить поиск на сайте. Просто добавьте эту функцию в файл functions.php:
function fb_filter_query( $query, $error = true ) {
if ( is_search() ) {
$query->is_search = false;
$query->query_vars[s] = false;
$query->query[s] = false;
// to error
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 по-умолчанию отображает по 10 записей на страницу в поиске. Если вы хотите показывать все показать все результаты поиска на одной странице, найдите в файле search.php такой код:
<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?>
И замените его:
<?php $posts=query_posts($query_string . '&posts_per_page=-1'); ?> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?>
На этом все!






Здравствуйте,
Замечательная статья. Но у меня есть вопрос, как исключить определенные страницы из поиска?
Огромное спасибо за статью!
Насколько я понимаю, код для подсветки выделяет искомое только в заголовках постов?
Во втором примере:
post_count отображает сколько показано на страницу, чтобы показать сколько найдено всего, надо использовать found_posts