8 полезных сниппетов для поиска в WordPress

25 Мар 2023г. в 11:52

Не секрет, что стандартный поиск в WordPress не очень точный. Проблема заключается в том, что WordPress ищет термины в весьма широком диапазоне, подразумевая, что если вы написали в строке поиска "урок+CSS+меню", то нужно выдать каждую запись, где встречается хотя бы один из терминов, что приводит к большому объему найденных материалов. Поэтому, не смотря на большую кучу найденного, пользователь в действительности не получает то, что ему нужно. Такое положение необходимо исправить и улучшить.

В данной статье приводится 8 действительно полезных сниппетов, которые помогут улучшить функциональность поиска WordPress.

Как исключить записи и страницы из результатов поиска
Если вам действительно нужно управлять тем, какие записи и страницы будут исключаться из результатов поиска WordPress, скопируйте ниже приведенный код в файл functions.php

В данном сниппете записи с ID 0 и 1 будут исключаться из результатов поиска. Исправьте код так, как вам нужно.

1
function SearchFilter($query) {
2
if ($query->is_search) {
3
$query->set('cat','0,1');
4
}
5
return $query;
6
}
7

8
add_filter('pre_get_posts','SearchFilter');
Форма поиска WordPress с выпадающим списком категорий
Полезная функция, которую можно добавить к поиску WordPress - это дать возможность вашим читателям фильтровать результаты поиска с помощью указания определенной категории для проведения поиска. Такую функцию можно легко организовать с помощью выпадающего списка всех названий категорий.

Нужно заменить стандартную форму поиска WordPress (ее можно найти в файле searchform.php) ниже приведенным сниппетом:

1
<form role="search" method="get" id="searchform" action="<?php bloginfo('siteurl'); ?>">
2
<div>
3
<label class="screen-reader-text" for="s">Ищем:</label>
4
<input type="text" value="" name="s" id="s" />
5
in <?php wp_dropdown_categories( 'show_option_all=All Categories' ); ?>
6
<input type="submit" id="searchsubmit" value="Искать" />
7
</div>
8
</form>
Поиск только в определенной категории и ее категориях наследниках
Данная форма может быть полезна в архиве категорий, чтобы позволить читателям искать категории наследники для любой заданной родительской категории.

В приведенном сниппете будут просматриваться все категории наследники от категории с ID 1. Исправьте код так, как вам нужно.

<form method=”get” id=”searchform” action=”<?php bloginfo(‘home’); ?>/”>
<div id=”search”>
<input type=”text” value=”Ищем… ” onclick=”this.value=”;” name=”s” id=”s” />
<?php $categories = get_categories(‘child_of=1′);
$catlist = ”;
foreach ($categories as $cat) {
$catlist.= $cat->cat_ID.’,';
}
$catlist.’5′;
?>
<input type=”hidden” name=”cat” value=”<?php echo “$catlist”?>” />
<input name=”" type=”image” src=”<?php bloginfo(‘stylesheet_directory’); ?>/styles/<?php echo “$style_path”; ?>/search.gif” value=”Искать” class=”btn” />
</div><!–/search –>
</form>
Поиск определенного типа записей
WordPress позволяет организовать поиск определенного типа записей с помощью небольшого сниппета.

Нужно скопировать ниже приведенный код в файл functions.php.

function SearchFilter($query) {
if ($query->is_search) {
// Вставьте определенный тип записей, который нужно искать
$query->set('post_type', 'feeds');
}
return $query;
}

// Данный фильтр будет встроен в цикл и будет сортировать результат поиска перед выводом

add_filter('pre_get_posts','SearchFilter');

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

Откройте файл search.php и найдите следующую строку:

<h2 class="pagetitle">Search Results</h2>
И замените ее кодом:

<h2 class="pagetitle">Результат поиска <?php /* Search Count */ $allsearch = &new WP_Query("s=$s&showposts=-1"); $key = wp_specialchars($s, 1); $count = $allsearch->post_count; _e(''); _e('<span class="search-terms">'); echo $key; _e('</span>'); _e(' &mdash; '); echo $count . ' '; _e('articles'); wp_reset_query(); ?></h2>
Подсвечиваем термин поиска WordPress с помощью jQuery
Чтобы сделать поиск для ваших читателей более удобным, можно использовать ниже приведенный сниппет, который будет подсвечивать термины поиска в найденных материалах.

Скопируйте следующий код в файл functions.php:

function hls_set_query() {
$query = attribute_escape(get_search_query());

if(strlen($query) > 0){
echo '
<script type="text/javascript">
var hls_query = "'.$query.'";
</script>
';
}
}
function hls_init_jquery() {
wp_enqueue_script('jquery');
}

add_action('init', 'hls_init_jquery');
add_action('wp_print_scripts', 'hls_set_query');
А следующий код добавьте в файл header.php перед тегом /head:

<style type="text/css" media="screen">
.hls { background: #D3E18A; }
</style>
<script type="text/javascript">
jQuery.fn.extend({
highlight: function(search, insensitive, hls_class){
var regex = new RegExp("(<[^>]*>)|(\\b"+ search.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1") +")", insensitive ? "ig" : "g");
return this.html(this.html().replace(regex, function(a, b, c){
return (a.charAt(0) == "<") ? a : "<strong class=\""+ hls_class +"\">" + c + "</strong>";
}));
}
});
jQuery(document).ready(function($){
if(typeof(hls_query) != 'undefined'){
$("#post-area").highlight(hls_query, 1, "hls");
}
});
</script>
Отключаем поиск 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;

// Ошибка
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
Иногда нужно, чтобы результаты поиска не имели стандартных ограничений цикла поиска WordPress. Данный сниппет позволяет получать неограниченное количество материалов в результате поиска.

В файле search.php вы можете добавить следующий код выше цикла, чтобы он работал.

Сначала найдите следующие строки в файле 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(); ?>