@Darklez

Как сделать поиск по разным ключевым словам?

Добрый день,
Имеются две записи одна с ключевым словом: Рыба; вторая с ключевым словом: Печенье.
Как сделать запрос поиска чтобы выводил записи рыба и печенье?

Пробовал сделать:
?s=рыба+печенье
?s=рыба&печенье
?s=рыба&s=печенье
Не получилось.

Помогите пожалуйста.
  • Вопрос задан
  • 422 просмотра
Пригласить эксперта
Ответы на вопрос 2
trampick
@trampick
Веб-разработчик
Если писать
?s=рыба+печенье, то wp воспримет как s='рыба печенье'
?s=рыба&печенье, то wp воспримет как s='рыба'
?s=рыба&s=печенье, то wp воспримет как s='печенье'
Как видите ничего не подходит.
Если вам нужно искать по фразе 'рыба печенье', то ?s=рыба+печенье подойдет.

Но я подразумеваю вам нужно что бы в поиске выводились записи если в них присутствуют то или то слово или вместе.
Если так, то Вам надо писать самостоятельно SQL запрос используя условие LIKE и шаблон(регулярное выражение для него). Так же Вам потребуется занести из массива $_GET все ключевые слова. Для этого можно использовать конструкцию ?s=рыба+печенье и функцию explode.
Ответ написан
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Стандартный поиск в WordPress весьма простой. Вот пример непосредственно SQL-запроса из вашего случая (первого, остальные некорректны изначально):
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts 
WHERE 1=1 
AND (((wp_posts.post_title LIKE '%рыба%')
OR (wp_posts.post_excerpt LIKE '%рыба%')
OR (wp_posts.post_content LIKE '%рыба%'))
AND ((wp_posts.post_title LIKE '%печенье%') // Вот тут оператор AND, то есть WP смотрит вхождение обеих слов
OR (wp_posts.post_excerpt LIKE '%печенье%')
OR (wp_posts.post_content LIKE '%печенье%'))) 
AND wp_posts.post_type IN ('post', 'page', 'attachment')
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_author = 1
AND wp_posts.post_status = 'private') 
ORDER BY (CASE
WHEN wp_posts.post_title LIKE '%рыба печенье%'
THEN 1
WHEN wp_posts.post_title LIKE '%рыба%'
AND wp_posts.post_title LIKE '%печенье%'
THEN 2
WHEN wp_posts.post_title LIKE '%рыба%'
OR wp_posts.post_title LIKE '%печенье%'
THEN 3
WHEN wp_posts.post_excerpt LIKE '%рыба печенье%'
THEN 4
WHEN wp_posts.post_content LIKE '%рыба печенье%'
THEN 5
ELSE 6 END), wp_posts.post_date DESC
LIMIT 0, 10

Если в поиске вводить "рыба -печенье", то будут выведены результаты где есть "рыба" и нету "печенье". Это по сути единственный оператор, который есть в стандартном поиске.

Сам код, который формирует WHERE часть запроса, смотрите тут.

Как видно по коду (и задокументировано в этом файле в комментах выше), есть переменная $sentence, которая отвечает за поиск фразы целиком, есть переменная $exact. Фильтров там не густо. В общем, изучайте код. Возможно, проще будет написать свой запрос. Возможно, удастся модифицировать стандартный через фильтр posts_search. Впрочем, найти по нему документацию задачка еще та :) Возможно, найдете что-то полезное тут:

wordpress.stackexchange.com/questions/112723/exten...
https://gist.github.com/mbijon/4979627
stackoverflow.com/questions/9221604/how-to-use-cus...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы