Несколько способов улучшить поиск в 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