Несколько способов улучшить поиск в WordPress

13-04-20 Php, WordPress PHP, WordPress 3

Встроенный поисковый движок 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(); ?>

На этом все!

Хочешь получать статьи на почту?

Подпишись на обновления!
* Ваш email не будет разглашен/продан. Вы сможете отписаться в любое время.

3 Комментария

  1. Oksana:

    Здравствуйте,
    Замечательная статья. Но у меня есть вопрос, как исключить определенные страницы из поиска?

  2. Евгений:

    Огромное спасибо за статью!

    Насколько я понимаю, код для подсветки выделяет искомое только в заголовках постов?

  3. Дженни:

    Во втором примере:
    post_count отображает сколько показано на страницу, чтобы показать сколько найдено всего, надо использовать found_posts

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *