Поиск по произвольным полям 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 ссылок может сильно облегчить вашу задачу.

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

Комментарии 26 к “Поиск по произвольным полям Ads-WordPress 4”

  1. Штейк:

    Как быть, если нужно по чекбоксу проверить, просто любое значение БД в расширенном поиске? Чтобы параметром передать запрос вместе с другими параметрами

    • Штейк:

      в бд столбец с пометкой adp_

    • admin:

      для adp_ полей точно такие же правила допустим у вас поле
      adp_etag – допустим тут у нас этаж квартиры хранится то есть от 1 до X
      вы хотите сделать чекбокс поиск квартира не на первом этаже

      <input type=’checkbox’ name=’adp_etag[more]‘ value=’1′ />
      ну просто задаем условие adp_etag должно быть больше 1
      ничего сложно

      • Штейк:

        Спасибо за ответ, но тут условие числовое, это проще, чем проверка на любое значение, ведь оно отнюдь не всегда числовое.

        Имелось в виду, если идет проверка оставил ли юзер в контактах e-mail адрес для связи, если да, то выдать только таких юзеров. Но e-mail же у всех разный…

        • Штейк:

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

  2. Олег:

    Здравствуйте!
    Спасибо за плагин!
    Вопрос возник по-поводу поиска на сайте. Поиск с формой осуществляется только по class=”content”, добавленные ads_ не работают при поиске. Подскажите, пожалуйста, как включить в поиск все произвольные поля?

  3. Aios:

    Спасибо за плагин действительно это все гениально.. Очень сложная и продуманная структура – преклоняю перед вами тело..

    однако поиск на версии 3.4.2 не работает.. Выбираю в виджете хотя бы категорию – не хочет.. выводит все подряд

    • admin:

      Да с поиском могут возникнуть проблемы. Если у вас ЧПУ включены это может повлиять, может конфликт с другим плагином. Надо смотреть по месту.

  4. Валерий:

    На странице добавления объявления не корректно работает виджет поиска, в нем отображаются все подряд рубрики, на остальных страницах все нормально. Как это исправить?

  5. Павел:

    Доброго времени суток! В первую очередь огромное спасибо за отличный плагин!!!
    Я не очень силен в php, но мне нужно в виджет поиска добавить еще один выпадающий список. Можете подсказать как это осуществить?

    • admin:

      открываем код виджета
      если необходимо внести изменения скопируйте код виджета в ads_config.php
      поменяйте название ==Ads_Search_Form== везде! на свое
      и далее все изменения делайте там вы получите новые виджет
      далее делаем по примеру

      с помощью фукции wp_dropdown_categories получаем html код выпадающего списка
      указываем параметры child_of=45 взять категории из родительской категории id=45 – тут поставить свое значение

      вторая строчка preg_replace просто добавляет пустое значение в список чтобы заставить пользователя выбрать

      ну и ниже по коду смотрим html и вставляем

  6. Павел:

    Если можно, у меня есть еще один вопрос?
    У меня стоит плагин “featured-post-with-thumbnail”. Он берет изображения из миниатюр записей. Как сделать, чтобы он брал изображения из той-же папки, что и ads-wordpress?

    • admin:

      никаких специальных папок с изображениями у плагина нет за исключением иконок кнопочек, все файлы обрабатываются средствами WP и хранятся там же где и все картинки wp-content/uploads очевидно ваш плагин требует еще какой-то информации о загруженных файлах

  7. Игорб:

    Пример с rlike приводить не буду.
    Смешной вообще, именно это мне и нужно, а он поленился. Ну ппц. И ошибок орфографических как всегда куча.

  8. Люди, напишите мне плагин для поиска по произвольным полям! все деньги отдам. Что бы был поиск как вот здесь http://kiev.vlasne.ua/sleeping/1/

  9. Дмитрий:

    Здравствуйте. Не пойму, почему в произвольное поле ads_price можно добавить “50 000″ или “50000″, ведь “50 000″ уже по сути не цифровое значение и я не могу с помощью запроса query делать сортировку, потому что “50 000″ воспринимается как 50.
    [php]str_replace(” “,”",$this->_post['ads_price']);[php]
    Вот так убираем пробелы в цене, если есть, только потом в базу загоняем. Только где этот “хук” применить? Пока не могу найти, подскажите, пожалуйста.

  10. Дмитрий:

    в ads_config.php прописал

    Теперь нормально. Но, как я думал, плагин автоматом хотя бы базовую проверку делает. Сейчас я могу всякую ересь писать в поля и она будет добавляться, так и до SQL инъекций не далеко. Или я что-то не так сделал?

    • admin:

      базовую проверку это заголовок и текст он должен быть иначе не создаст пост, остальные проверки самостоятельно.
      SQL инъекций – данные добавляются с помощью функции wp_insert_post(), так что все вопросы по безопасности к разработчика WP

  11. Денис:

    Подскажите как к обычному поиску добавить результаты по произвольному полю
    То есть у меня есть дополнительное поле с ключевыми словами – нужно чтоб поиск искал как обычно и добавлял посты у которых в произвольном поле есть совпадение.

  12. source:

    скажите, а ?ads_katdate=2017-02-01 на https сайтах не работает?

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

Ваш 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]