Точное соответствие поискового запроса в WP Query

5 февр. 2015 г., 15:23:44
Просмотры: 31.6K
Голосов: 5

Я использую WP Query, и результаты, которые возвращаются при использовании поискового запроса, работают не так, как я хочу. Например, поиск слова 'art' также возвращает результаты для слов, содержащих 'art', таких как 'part'. Как можно этого избежать и получать результаты только для точного слова 'art'?

1
Комментарии

возможный дубликат Точное совпадение в поиске Wordpress

RRikesh RRikesh
5 февр. 2015 г. 16:30:27
Все ответы на вопрос 2
1
12

Кажется, кто-то уже отвечал на этот вопрос: Посмотрите этот ответ от @Sunyatasattva

Но, судя по всему, WP_Query поддерживает некоторые дополнительные параметры поиска:

's' => $s, //(строка) - Передает строку запроса из поиска.

'exact' => true, //(булево) - флаг для поиска только точных совпадений заголовков/записей - По умолчанию false.

'sentence' => true, //(булево) - флаг для поиска по точной фразе - По умолчанию false.

Подробнее здесь: https://gist.github.com/luetkemj/2023628

Надеюсь, это поможет,

5 февр. 2015 г. 15:43:07
Комментарии

К сожалению, параметр sentence => true не делает то, что хочет пользователь. Вместо этого он означает, что WordPress будет возвращать только посты, где часть предложения существует, тогда как обычно он возвращал бы совпадения для часть OR или OR предложение. В обоих случаях результаты не будут соответствовать требованиям, если был выполнен поиск по слову art.

David Gard David Gard
5 февр. 2015 г. 17:20:29
2
11

Это действительно сложный вопрос, так как под словом точный можно понимать два варианта интерпретации вашего запроса:

  1. Найти только те записи, где заголовок или содержание полностью совпадают. Например, если вы ищете Мой пост супер, то запись с заголовком Мой пост супер крутой не будет найдена.
  2. Найти записи, где точная фраза присутствует, а не просто часть фразы. Например, если вы ищете его дом, то запись с заголовком Я люблю этот дом не будет найдена, а вот запись с заголовком Я иду к его дому — будет (примеры не самые удачные, но надеюсь, суть ясна).

К счастью, можно реализовать оба варианта, но первый способ гораздо проще. Добавьте один из этих примеров в файл functions.php:


Способ 1

add_action('pre_get_posts', 'my_make_search_exact', 10);
function my_make_search_exact($query){

    if(!is_admin() && $query->is_main_query() && $query->is_search) :
        $query->set('exact', true);
    endif;

}

Функция my_make_search_exact() будет вызываться при каждом выполнении запроса через хук pre_get_posts.

Чтобы не вмешиваться в запрос без необходимости, внутри функции проверяется, что мы НЕ находимся в админке, что это ОСНОВНОЙ запрос и что это именно ПОИСК.


Способ 2

add_filter('posts_search', 'my_search_is_exact', 20, 2);
function my_search_is_exact($search, $wp_query){

    global $wpdb;

    if(empty($search))
        return $search;

    $q = $wp_query->query_vars;
    $n = !empty($q['exact']) ? '' : '%';

    $search = $searchand = '';

    foreach((array)$q['search_terms'] as $term) :

        $term = esc_sql(like_escape($term));

        $search.= "{$searchand}($wpdb->posts.post_title REGEXP '[[:<:]]{$term}[[:>:]]') OR ($wpdb->posts.post_content REGEXP '[[:<:]]{$term}[[:>:]]')";

        $searchand = ' AND ';

    endforeach;

    if(!empty($search)) :
        $search = " AND ({$search}) ";
        if(!is_user_logged_in())
            $search .= " AND ($wpdb->posts.post_password = '') ";
    endif;

    return $search;

}

Автор решения — tinyGod: http://tinygod.pt/make-wordpress-search-exact/

5 февр. 2015 г. 17:12:05
Комментарии

спасибо, мы сами разобрались с этим, но у вас получилось хорошее описание.

Andrew Welch Andrew Welch
6 февр. 2015 г. 01:36:09

@David Gard Большое спасибо. Я получил именно тот результат, который хотел. :)

Ravi Ravi
9 мая 2019 г. 18:24:23