Поиск по произвольным полям Ads-WordPress 4

В версии плагина 4.x коротко о новых возможностях:

  • поиск простой: равенство перемененная = значение*
  • поиск с условием: больше, меньше, больше или равно, меньше или равно, не равно.
  • поиск в интервале: например переменная должна быть от 4 и до 23 MySQL оператор BETWEEN
  • поиск по заданному множеству: IN
  • и долго думал, но все таки добавил поиск подстроки в тексте регулярным выражением rlike
  • сортировка результата (туда\обратно) простая и сортировка с конвертацией значения в число CAST($sqlNameVar AS SIGNED)

Я рассчитываю на аудиторию, которая уже понимает как работают выше перечисленные операторы, объяснять основы SQL здесь я не буду.
Прежде чем начинать начинать работать с поиском его надо включить в админке плагина есть галочка. В качестве рабочих примеров я буду использовать свой новый проект каталог ссылок он очень показателен так как задействует практически все возможности плагина, здесь много полей данных и собственно говоря новая версия была написана специально для него.

Поиск можно осуществлять либо через GET запрос, то есть сформировать соответствующий URL (ссылку), либо по средствам POST отправив данные через форму поиска.
Простейший пример:
http://loadmen.ru/?ads_quality=HDRip
Найти записи в которых ads_quality (качество видео) равно HDRip.
Однако след пример сработает не совсем так как вы ожидаете:
http://loadmen.ru/?ads_quality=rip
В результате найдутся все записи в которых есть вхождение rip причем регистр не учитывается, это есть не что иное как SQL оператор LIKE причем выражение взято в проценты вот так – $sqlNameVar LIKE ‘%$value%’. В предыдущих версиях плагина я решил, что от простого знака равно толку мало и поставил LIKE, ну так оно и осталось пока – жалоб не поступало, и практика показала, что так намного функциональные. Теперь, когда мы знаем про оператор LIKE давайте найдем все фильмы с 6 канальным звуком (6 ch), для звуковых параметров у нас выделено спец метаполе ads_audio получаем:
http://loadmen.ru/?ads_audio=6 ch SQL: ads_audio.meta_value LIKE ‘%6 ch%’
По открывайте полученные записи и проверьте – везде в поле Аудио будет присутствовать подстрока 6 ch.

Перейдем к условиям. Найдем все фильмы в которых IMDb рейтинг больше 8
http://loadmen.ru/?ads_imdb_rating[more]=8
SQL: ads_imdb_rating.meta_value > 8
Поскольку http протокол плохо переносит, когда в URL всякие значки типа < > = пришлось заменить их на спец слова, такой вот финт ушами :) . Общий принцип построения URL таков:
имя_переменной[оператор]=значение
Привожу таблицу соответствия этих слов и операторов SQL:

more > (больше)
less < (меньше)
moe >= (больше или равно)
loe <= (меньше или равно)
ne ( не равно )
between BETWEEN (проверка диапазона)
in IN (принадлежность к множеству)
rlike rlike (регулярные выражения)
Для версии Ads – WordPress 4 добавлены:
dloe >= STR_TO_DATE( “.$vvalue.”, ‘%Y-%m-%d %H:%i:%s’) – больше либо равно с конвертацией операнда к дате
dloe <= STR_TO_DATE( ".$vvalue.", '%Y-%m-%d %H:%i:%s') - меньше либо равно с конвертацией операнда к дате
eq = (простое равно совсем про него забыл :)
isnull ISNULL($sqlNameVar) – поле равно нулю
notnull NOT ISNULL($sqlNameVar) – поле НЕ равно нулю

Пример с between зададим условие – найти фильмы продолжительность которых от менее 1 часа. Поскольку продолжительность хранится в минутах переводим в минуты и составляем URL:
http://loadmen.ru/?ads_duration[between][0]=0&ads_duration[between][1]=60 SQL: adp_ads_duration BETWEEN 0 AND 60
adp_file_size[between][0]=629145600 – так мы задаем нижний предел
adp_file_size[between][1]=786432000 – а так верхний
немного громоздко, но работает. :)

Пример с IN (принадлежность к множеству), давайте попробуем найти все фильмы хорошего качества HDRip, DVDRip и BDRip :
http://loadmen.ru/?ads_quality[in][]=HDRip&ads_quality[in][]=DVDRip&ads_quality[in][]=BDRip
SQL: ads_quality.meta_value in (‘HDRip’,'DVDRip’,'BDRip’)

Пример с rlike приводить не буду.

Комбинирование условий

Условия можно комбинировать как угодно:
http://loadmen.ru/?cat=32&ads_quality=DVDRip&adp_file_size[moe]=734003200
Найти фильмы из категории Документальные (id категории = 32), у которых качество = DVDRip и размер больше либо равно 700 MB (700*1024*1024)

Механизм работы:

За обработку поисковых запросов отвечает функция function ads_queryfilter($query) если поиск идет по мета полю (ads_), то к основному запросу присоединяется LEFT JOIN таблица wp_postmeta и так для каждой переменной ads_. Для поля adp_ ничего присоединять не надо так-как они уже находятся в составе таблицы wp_posts

Теперь скажу самое главное – для каждой переменной можно назначить свою пользовательскую функцию, имя функции должно начинаться с названия переменной и суфикса _query. Так для переменной ads_quality можно назначить свою функцию которая должна вернуть правильный SQL текст с условием поиска и обязательное условие в тексте должен первым идти оператор AND:

Лучше примеров пояснений нет – на loadmen.ru сделаем альтернативу оператору between для поиска фильмов размером указным в формате x:y (MB), предварительно надо открыть секрет размер файлов на loadmen.ru сохраняется в байтах значит переводим наши значения в байты x*1024*1024 (нижний предел) и y*1024*1024 = 786432000 (верхний предел):
http://loadmen.ru/?adp_file_size=700:1400
для этого в ads_config.php добавляем следующую функцию:

Если вы используете мета поле ads_ тогда к переменной надо обращатся как имя_поля.meta_value например : ads_quality.meta_value

Сортировка

Чтобы задать сортировку записей по какому либо полю используйте след синтаксис:
ads_order[ads_name_var]=’sort’ где
ads_name_var имя поля по которому вы хотите задать сортировку;
sort указание типа сортировки может принимать след значения : asc, desc, iasc, idesc;
Например отсортируем записи по полю ads_quality
http://loadmen.ru/?ads_order[ads_quality]=asc
SQL: ORDER BY ads_quality.meta_value ASC

Как я уже говорил выше, кроме простой сортировки есть сортировка с принудительной конвертацией значений к числу. Дело в том, что в мета полях, если вы записываете число то оно сохраняется как строка т.к. тип столбца строковый, поэтому если в мета поле хранится число то надо использовать вместо asc iasc. Отсортируем фильмы по рейтингу IMDb:
http://loadmen.ru/?ads_order[ads_imdb_rating]=iasc
SQL: CAST(ads_imdb_rating.meta_value AS BINARY) ASC

Ну и напоследок, хочу обратить выше внимание на замечательную функцию worpdpress add_query_arg() при конструировании url ссылок может сильно облегчить вашу задачу.

Еще пару рабочих примеров Объявления города Ильичевска, Одесса Процессор Недвижимости – объявления по недвижимости.

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> [php]…[/php] [html]…[/html] [css]…[/css] [text]…[/text] [code]…[/code]