Как организовать фильтр по произвольным полям


Содержание материала:

Поиск по произвольным полям wordpress

В предыдущих статьях я рассказывал и показывал вам поиск в wordpress, а также описывал плагин поиска для wordpress. В этих темах я частично затрагивал тему поиск по полям wordpress, теперь попробую описать более разлого.

Зачем нужен wordpress поиск по дополнительным полям

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

Штатная функция поиска WP, к сожалению, ищет только в заголовках и тексте поста или страницы. На большее она не способна, по этому приходится или писать свою функцию поиск по дополнительным полям или использовать плагин.

Например, на сайте недвижимости, магазине, каталоге и тому подобное, поиск по произвольным полям критически необходим. Ведь как найти вещь в магазине по артикулу или адрес квартиры, или модификацию товара. Конечно можно записать эти данные в заголовок или текст страницы, но тогда это будет не сайт, а просто какой то монстр. Более подробно, зачем нужны произвольные поля wordpress я уже описывал. Также, заводилась тема по поводу их удобного использования с помощью плагина advanced custom fields.

Поиск по произвольным полям wordpress позволяет:

  • выводить более релевантные результаты;
  • манипулировать с поиском WP;
  • показывать результаты, в которых не встречается поисковая фраза (например указывать слова с ошибкой и тому подобное).

Как организовать поиск по полям wordpress

Думаю существует множество вариантов реализации поиска по произвольным полям, один из них написание собственных MySQL запросов. Но этот способ не доступе рядовом блогеру, да и вряд ли он будет лучше чем поисковый плагин. Хотя иногда используется и самопальный поиск, например для создания фильтров и прочих задач. Но сегодня не о них. Сейчас я покажу вам несколько плагинов поиска для Вордпресс, которые умеют делать поиск по полям.

Поиск по полям на Relevanssi

Плагин Relevanssi я уже описывал в более ранних постах. Ссылку на запись вы можете сгенерировать вот здесь: Получить ссылку на (Relevanssi)

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

Описание плагина Relevanssi и официальная статистика на сегодня (11.11.2015)
Официальный рейтинг 4.7
Активных сайтов с этим плагином 80 000
Текущая версия 4.3.1
Требуемая версия WP не ниже 3.3
Ссылка на сайт Получить ссылку на (Relevanssi)
Позволяет Делать поиск по полям wordpress, по комментариям, таксономиям, рубрикам, меткам.

Имеется русский язык интерфейса и многое другое.

Для создания поиска достаточно указать в настройках какие поля нужно учитывать в поиске. Можно указать все, исключить скрытые или через запятую записать массив имен полей.

Чтобы сделать поиск по произвольным полям wordpress вам нужно:

  1. Установить плагин на ваш сайт.
  2. Активировать его.
  3. Перейти в настройки и найти «Настройки индексирования».
  4. В этом разделе отыскать вот такой блок:

К преимуществам этого плагина можно отнести то, что поисковый индекс создается заблаговременно, то есть нагрузка на сервер при поиске минимальная. Это очень полезно, если у вас большой сайт или очень много уникальных пользователей в сутки.

Поиск по произвольным полям на Search Everything

Второй плагин для поиска по дополнительным полям, который я хочу порекомендовать, — Search Everything. Он имеет меньше настроек чем предыдущий, но это не мешает ему хорошо делать поиск по полям wordpress.

Описание плагина Search Everything и официальная статистика на сегодня (11.11.2015)
Официальный рейтинг 4.4
Активных сайтов с этим плагином 80 000
Текущая версия 8.1.3
Требуемая версия WP не ниже 3.6

Чтобы подключить поиск по произвольным полям вам нужно:

  1. Установить и активировать плагин.
  2. Перейти в настройки.
  3. Найти графу: «Search Everything Basic Configuration»
  4. Поставить активный чекбокс напротив «Искать каждое свое поле (метаданные)» как на скриншоте:

На этом список плагинов для поиска по полям окончен. Это пожалуй два самых сильных плагина, которые просты в настройке и могут легко делать поиск.

Если у вас не получается сделать поиск по полям wordpress или остались вопросы вы можете задать их в комментариях или в разделе Вопрос / Ответ.

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

Добрый вечер. огромное спасибо за данную статью. Не могли бы вы подсказать в чем может быть дело. пробовал как один так и другой плагин, все вроде бы отрабатывает но в результате выводиться просто ссылка на страницу(главная) я ищу кастомные записи которые расположены на главной старнице. можно ли как сделать что бы выводился сам искомый контент а не ссылка? заранее огромное спасибо

Добрый день. На главной обычно выводятся посты по дате, думаю вот такая выборка получит именно то что вам нужно:

Или я не правильно понял ваш вопрос?

большое спасибо за ответ, сейчас буду пробовать)

я пробовал сделать так как вы написали, но что то ни чего из этого увы не вышло, на другом форуме говорят что возможно нет шаблона поисковой выдачи, если Вам не сложно, не могли бы вы перейти по ссылке посмотреть на проблему (-url-)
если ввести в поле поиска например галакси, то просто перекинет на главную страницу. поля выводи с помощью плагина acf. заранее огромное спасибо за помощь

ну это понятно почему мой пример не помог �� он был для выборки постов, но не поиска.
Найдите в теме файл search.php, если его нет надо создать. Закиньте туда элементарный код:

далее наберите в строке браузера вашдомен?s=вода

или вместо слова вода любое другое слово которое есть у вас в постах.

В результатах поиска вы должны увидеть хоть какой-то результат.

У вас нет редиректа на главную, вы просто не видите в браузере гет параметра видимо заходите через оперу или им подобные

Поиск по произвольным полям в админке Вордпрес. Фильтры

Случай из моей практики. У клиента был организован раздел товаров посредством произвольных записей типа post (post_type=product). У этих записей имелись произвольные поля barcode и barcode2, содержащие штрихкод. Необходимо было организовать поиск по артикулу внутри админки Вордпрес.

Реализовано было так (код для function.php):

В админке все выглядело так:

Разумеется, что аналогичным способом вы можете создавать свои фильтры, причем они не обязательно должны быть текстовыми к в моем случае.

Поиск и фильтр WordPress записей по произвольным полям

Нередко на WordPress создают сайты в виде каталога товаров. И как правило, для больших каталогов требуется продвинутый фильтр товаров или поиск по произвольным полям — параметрам. Именно такой поиск и фильтр на WordPress нам пришлось разрабатывать. Посмотреть действующий пример можно в каталоге мобильных устройств. И вот как мы это сделали.

Услуга: Разработаем фильтр для Вашего сайта

Разработаем фильтр и поиск по произвольным полям специально для Вашего сайта. Оформим форму в соответствии с дизайном сайта. Сверстаем страницу с результатами поиска.

от 4 900 рублей

Принцип поиска и фильтра записей в WordPress

Дан был сайт, где товары (в данном случае мотоциклы) добавлялись в виде стандартных WordPress записей c произвольными полями. Для работы с произвольными полями был установлен плагин Types. Произвольные поля отвечали за дополнительные параметры товара, по которым в дальнейшем подразумевался фильтр и поиск.

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

Форма поиска и фильтра WordPress товаров

Далее была доработана HTML форма поиска и фильтра WordPress записей. А именно, был создан файл moto_filtr_form.php и наполнен следующим кодом:

Эта форма вызывалась в сайдбаре (sidebar.php) с помощью php кода:

Вот что получилось

HTML форма позволяет выставить необходимые параметры поиска товаров на WordPress сайте и отправляет запрос методом GET (запрос формируется путем изменения URL страницы) .

Каталог на WordPress + Magic Fields. Поиск по каталогу и фильтры. Часть 2

Продолжая тему, посвященную плагину Magic Fields, я постараюсь доступно рассказать о том, как организовать поиск по дополнительным полям, которые создаются с помощью этого плагина. Помимо процесса создания привычной поисковой формы, приведу пример организации одиночных фильтров.

И то и другое, в готовом варианте, вы можете видеть в блоге, который я уже упоминал в первой заметке о Magic Fields. К сожалению, с тех пор я так и не удосужился уделить этому блогу сколько-нибудь достаточное количество времени, поэтому и форма и фильтры там находятся в зачаточном состоянии. Тем не менее, они отлично демонстрируют результат, являющийся логичным завершением использования данного WordPress плагина.

Единственным минусом плагина Magic Fields является невозможность создавать поля с парами ключ – значение. Быть может для вас это и не является минусом, но мне данный подход не слишком нравится. В любом случае, вариантов нет, поэтому мы будем фильтровать публикации в каталоге по строковым значениям дополнительных полей.

Допустим, помимо прочих, у нас есть дополнительное поле «Производитель». Список производителей строго регламентирован и при создании публикации он представляет собой selectbox. В пользовательской части наша публикации может иметь следующий вид (скриншот с упомянутого блога):

Все характеристики заданы дополнительным полями Magic Fields. Те значения, что подсвечиваются синим цветом являются ссылками, выполняющими роль фильтров.

Предположим, что мы кликаем на имя производителя LG и, перейдя обратно в каталог, хотим видеть товары только этой компании. Для реализации этой нехитрой логики открываем файл шаблона header.php и дописываем туда следующий код:

Код простой и не требует каких-то особых комментариев, кроме отдельных моментов.

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

Далее собираем все полученные значения дополнительных полей в массив $x_params. Если полей будет очень много, то не следует делать так, как сделал я, а именно писать блок условия для каждого поля. Иначе у вас будет много некрасивого и бестолкового кода. Лучше вынести имена полей в массив, а затем обходить его циклом, проверяя, пришло ли от пользователя значение для каждого поля. Но речь не об этом.

Собрали все значения в массив ключ =>значение и циклом конкатенируем их в строку вида &x_field_name=field_value. Обратите внимание, на то, что имена дополнительных полей должны иметь префикс x_. После этого регистрируем наш обновленный запрос функцией query_posts(). Естественно, не забываем выполнить конкатенацию уже существующей строки запроса, которая храниться в переменной $query_string и наших добавленных параметров.

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

Ниже привожу код, который будет выводить форму поиска по дополнительным полям Magic Fields. У меня она лежит в файле шаблона archive.php, но не факт, что у вас также (зависит от шаблона и способов его реализации).

У меня в блоге, на момент написания статьи, она выглядела примерно так:

В общем, Magic Fields – действительно отличный WordPress плагин, позволяющий значительно расширять возможности стандартного блога. Потенциал у него достаточно большой и при желании, можно структурировать неплохой каталог со всеми необходимыми функциями.

P.S: Пример реализации поиска с помощью класса WP_Query

Комментарии (32)

А могли бы Вы привести реализацию фильтра (поиска) по выборке записей с различными видами, а не только с полем select, но и с checkbox-ами, полями ввода (например для мин. и макс. цены) и чтобы они были взаимодополняющими. Например выбор нескольких типов производителей.

То, о чем вы спрашиваете, больше относится к API WordPress и прямого отношения к плагину не имеет.
Но учитывая тот факт, что подобный вопрос задаете не вы первый, ближайшее время постараюсь написать небольшую заметку на эту тему.

буду очень признателен, если уведомите о этой заметке по мылу;)

Я бы предложил вам подписаться на RSS 🙂 про мыло, скорее всего, банально забуду.
Ко всему прочему, время от времени пишу о WordPress. Возможно, другие заметки тоже будут вам интересны.

Большое спасибо за материал! Как раз нужен каталог для WordPress

Помогите разобраться!)
Делаю все точно по вашему уроку.. но в раскрывающемся списке выбора производителя нет ни одной позиции.
Хотя в самих настройках полей я их задавала.
Заранее, спасибо!)

У меня список производителей формируется не на основе тех значений, что вы задаете при создании поля, а на основе массива $device_producers. Это сделано с целью избавиться от дополнительного запроса в БД.

Мне кажется, вы не там ищете источник проблемы.

Подскажите, пожалуйста, что означают параметры полей required (this field is required)
Can be duplicated (this field is duplicable?)

Развернутый ответ на этот вопрос имеется в официальной документации Magic Fields http://wiki.magicfields.org/doku.php? >

Не думаю, что я смогу добавить что-либо к написанному.

Просто там на английском и такие технические тонкости сложно понять, поэтому хотелось бы по простому, по русски 🙂

Здравствуйте Олег. Сделал все как описано в статье (из первой статьи все получилось) но сделать сортировку по каталогу как у вас в первом примере не получается. Вставляю в single.php код и подставляю свои значения но данные из доп. полей даже не подсвечиваются как ссылки. Можете подсказать что я делаю не так?

и сразу дополню свой вопрос. Как выводить дополнительные поля в каталоге к каждому посту если у меня в категории выводятся только заголовки. Ну то есть я в категории хочу построить таблицу в которой напротив каждого названия(заголовка поста) будут выводиться доп. поля.

Для получения значения полей необходимо использовать функцию get() внутри цикла while (have_posts()). И неважно, в категории это или в одиночной записи.

Это же относится к вашему первому вопросу. В заметке данный момент опускается. Но ссылки для фильтров формируются именно с помощью get().

Здравствуйте.
Не могли б вы объяснить что означает это: action=»/devices/»
Получается форму обрабатывает страница devices. Какую мне страницу задать. У меня на все логично выдает Нет такой страницы


У меня это была категория, но можно сделать с помощью страницы в том числе. Разница только в файлах шаблонов, которые потребуется отредактировать.

Подскажите пожалуйста как делать сортировку или поиск, если данные в таблице храняться в серилизованном виде?

Я понятия не имею о том, насколько он рабочий. Сам не пользовался, но на форумах о нем иногда говорят.

Без него сортировка по сериализованной строке невозможна. А вот поиск, в принципе, можно осуществлять с помощью LIKE %%, например.

Здраво.
Отфильтрованные посты выводятся с пагинацией, первая страница показывает отфильтрованные, но стоит перейти на другую страницу пагинации, выводятся все посты без фильтрации.
Как полечить?
Спасибо

Реализуйте свою функцию пагинации или можно использовать какой-нибудь плагин, который позволит передавать дополнительные параметры.

Я, как правило, делал вывод результатов фильтрации через ajax, поэтому базовая пагинация WP меня не беспокоила.

А можно пример, как это выглядит через ajax

Вроде и понятно, но не получается … буду тренироватся)

Подскажите пожалуйста, как можно интегрировать в стандартный поиск wp magic-fields, чтобы искало хотябы по заголовкам и по возможности по текстовым полям

По заголовкам он должен искать и так. Как раз неделю назад проверял это на живом проекте. Если поиск по заголовкам не происходит, значит что-то не так с таксономиями.

А вот относительно полей подсказать не могу, так как подобных задач не решал. Попробуйте погуглить. В топе выдачи можно найти вот эту тему на офф. форуме, где поднимают ваш вопрос http://wordpress.org/support/topic/include-custom-field-values-in-search

Простите, тема старая, но вроде никто подобного вопроса не касался: если доп. поля не одного уровня, как у вас (производители), а хотя бы двух (оружие — танки — танки гусеничные и танки колесные, предположим такое) Как в таком случае организовать ввод данных, чтобы танки колесные были и в категории «танки колесные» и в то же время в категории «танки»? (Делаю для людей неискушенных, поэтому важно сделать просто и доступно, самому-то можно и на коленке забацать )

Множественный выбор полей не поможет, т.к. кроме танков там есть и самолеты и автоматы, есть риск выбрать по ошибке не ту категорию. Идеальным было бы вложение категорий, но такого в этом плагине я не нашел пока.

А зачем вам дополнительные поля? Ведь есть обычные категории WP или можно создать свою таксономию.

Категории есть, они для постов, а в каталоге логичнее (на мой взгляд, конечно) страницы использовать. Своя таксономия, насколько я понял, тоже создается или на основе постов или на основе страниц. Если у нас страницы, то есть ли возможность сделать вложение таксономий, или придется переходить на посты с категориями?
Есть еще один путь сделать каталог — через плагин Page list, там есть все возможности для реализации искомого, но ввод новых позиций в каталог не очевиден. А в Magic Fields как раз ввод достаточно прост, но с вложенностью затык…

Расширенный фильтр в Excel и примеры его возможностей

Вывести на экран информацию по одному / нескольким параметрам можно с помощью фильтрации данных в Excel.

Для этой цели предназначено два инструмента: автофильтр и расширенный фильтр. Они не удаляют, а скрывают данные, не подходящие по условию. Автофильтр выполняет простейшие операции. У расширенного фильтра гораздо больше возможностей.

Автофильтр и расширенный фильтр в Excel

Имеется простая таблица, не отформатированная и не объявленная списком. Включить автоматический фильтр можно через главное меню.

  1. Выделяем мышкой любую ячейку внутри диапазона. Переходим на вкладку «Данные» и нажимаем кнопку «Фильтр».
  2. Рядом с заголовками таблицы появляются стрелочки, открывающие списки автофильтра.

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

Пользоваться автофильтром просто: нужно выделить запись с нужным значением. Например, отобразить поставки в магазин №4. Ставим птичку напротив соответствующего условия фильтрации:

Сразу видим результат:

Особенности работы инструмента:

  1. Автофильтр работает только в неразрывном диапазоне. Разные таблицы на одном листе не фильтруются. Даже если они имеют однотипные данные.
  2. Инструмент воспринимает верхнюю строчку как заголовки столбцов – эти значения в фильтр не включаются.
  3. Допустимо применять сразу несколько условий фильтрации. Но каждый предыдущий результат может скрывать необходимые для следующего фильтра записи.

У расширенного фильтра гораздо больше возможностей:

  1. Можно задать столько условий для фильтрации, сколько нужно.
  2. Критерии выбора данных – на виду.
  3. С помощью расширенного фильтра пользователь легко находит уникальные значения в многострочном массиве.



Как сделать расширенный фильтр в Excel

Готовый пример – как использовать расширенный фильтр в Excel:

  1. Создадим таблицу с условиями отбора. Для этого копируем заголовки исходного списка и вставляем выше. В табличке с критериями для фильтрации оставляем достаточное количество строк плюс пустая строка, отделяющая от исходной таблицы.
  2. Настроим параметры фильтрации для отбора строк со значением «Москва» (в соответствующий столбец таблички с условиями вносим = «=Москва»). Активизируем любую ячейку в исходной таблице. Переходим на вкладку «Данные» — «Сортировка и фильтр» — «Дополнительно».
  3. Заполняем параметры фильтрации. Исходный диапазон – таблица с исходными данными. Ссылки появляются автоматически, т.к. была активна одна из ячеек. Диапазон условий – табличка с условием.
  4. Выходим из меню расширенного фильтра, нажав кнопку ОК.

В исходной таблице остались только строки, содержащие значение «Москва». Чтобы отменить фильтрацию, нужно нажать кнопку «Очистить» в разделе «Сортировка и фильтр».

Как пользоваться расширенным фильтром в Excel

Рассмотрим применение расширенного фильтра в Excel с целью отбора строк, содержащих слова «Москва» или «Рязань». Условия для фильтрации должны находиться в одном столбце. В нашем примере – друг под другом.

Заполняем меню расширенного фильтра:

Получаем таблицу с отобранными по заданному критерию строками:

Выполним отбор строк, которые в столбце «Магазин» содержат значение «№1», а в столбце стоимость – «>1 000 000 р.». Критерии для фильтрации должны находиться в соответствующих столбцах таблички для условий. На одной строке.

Заполняем параметры фильтрации. Нажимаем ОК.

Оставим в таблице только те строки, которые в столбце «Регион» содержат слово «Рязань» или в столбце «Стоимость» — значение «>10 000 000 р.». Так как критерии отбора относятся к разным столбцам, размещаем их на разных строках под соответствующими заголовками.

Применим инструмент «Расширенный фильтр»:

Данный инструмент умеет работать с формулами, что дает возможность пользователю решать практически любые задачи при отборе значений из массивов.

  1. Результат формулы – это критерий отбора.
  2. Записанная формула возвращает результат ИСТИНА или ЛОЖЬ.
  3. Исходный диапазон указывается посредством абсолютных ссылок, а критерий отбора (в виде формулы) – с помощью относительных.
  4. Если возвращается значение ИСТИНА, то строка отобразится после применения фильтра. ЛОЖЬ – нет.

Отобразим строки, содержащие количество выше среднего. Для этого в стороне от таблички с критериями (в ячейку I1) введем название «Наибольшее количество». Ниже – формула. Используем функцию СРЗНАЧ.

Выделяем любую ячейку в исходном диапазоне и вызываем «Расширенный фильтр». В качестве критерия для отбора указываем I1:I2 (ссылки относительные!).

В таблице остались только те строки, где значения в столбце «Количество» выше среднего.

Чтобы оставить в таблице лишь неповторяющиеся строки, в окне «Расширенного фильтра» поставьте птичку напротив «Только уникальные записи».

Нажмите ОК. Повторяющиеся строки будут скрыты. На листе останутся только уникальные записи.

Сustom fields – создаем поиск по произвольным полям

Сustom fields или пользовательские поля по русски являются отличной функцией в WordPress . Они позволяют хранить любую дополнительную информацию (метаданные) о посте.

Когда я только начинал использовать WordPress, я и не представлял насколько мощным дополнением к сайту они могут быть.

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

[spoiler name=”Необходимые данные Для открытия – нажмите “]

1. Создание страница поиска.
Открываем page.php в вашей теме и сохранить его копию как новый файл. Я назвал новый шаблон страницы filtr.php.

Дайте имя в файле шаблона, добавив следующую строчку в самом начале:
[crayon lang=’html’]Template Name: Фильтр[/crayon]

Теперь, когда вы создали новую страницу в вашей теме, заходим в админ панель и создаем новую страницу. Например “Поиск” и выбираем появившийся в списке доступных шаблонов нашу созданную страничку.

2. Создаем фильтр в виде выпадающего списка
Чтобы создать форму, которая позволит пользователям фильтровать посты, добавляем этот код, в filtr.php, туда где бы вы хотели видеть выпадающий список :

3. Отображение результатов поиска.

Теперь,когда мы фактически создали фильтр поиска, нам надо как-то вывести этот результат. Для этого мы добавляем следующий код, в filtr.php после кода формы фильтра:

[crayon lang=’php’]
19,
‘meta_value’ => $counties,
‘paged’=>$paged,
);

Результат поиска по –

Недавно добавленные

ID, ‘ИМЯ ПОЛЯ’, true); ?>

” title=” “>

Извините, ничего не найдено

Во всем получившемся коде на странице filtr.php заменяем ИМЯ ПОЛЯ на нужное вам имя пользовательского поля.
А вместо ID_КАТЕГОРИИ указываем номер нужной вам категории, если надо сделать фильтр по всем категория, то удаляем данную аргумент.

На этом все. у Вас должна получиться рабочая страничка с фильтром по пользовательским полям.

Если что не получается или непонятно пишите в комментарии.

WP Magazine

Про WordPress на русском языке

Работа с произвольными полями в WP_Query

Произвольные поля (или мета-данные) в WordPress позволяют добавлять дополнительную информацию к записям, страницам и пользовательским типам данных. Использовать произвольные поля можно в самых разных сценариях, например:

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

» data-medium-file=»https://wpmag.ru/wp-content/uploads/sites/13/2014/01/wordpress-custom-fields-300×93.png» data-large-file=»https://wpmag.ru/wp-content/uploads/sites/13/2014/01/wordpress-custom-fields-1024×317.png» src=»https://wpmag-22.cdn.pjtsu.com/wp-content/uploads/sites/13/2014/01/wordpress-custom-fields.png?w=780″ alt=»Работа с произвольными полями в WordPress» w />

Работа с произвольными полями в WordPress

Помимо сохранения и отображения произвольных полей, часто приходится искать, фильтровать и сортировать по этим полям. В этом нам помогут классы WP_Query и WP_Meta_Query .

Напоминаем вам, что WP_Query это один из основных API в WordPress. Данный класс позволяет обращаться к базе данных WordPress и получать статьи, страницы и произвольные типы данных. В данной статье мы рассмотрим параметры к классу WP_Query , которые отвечают за работу с мета-данными.

Параметр meta_query

Основным параметром для работы с мета-данными в WP_Query является meta_query , который реализован классом WP_Meta_Query . Параметр meta_query — это массив, где каждый элемент является в свою очередь массивом с параметрами мета-запроса. Рассмотрим простой пример:

Если вы не знакомы с параметром post_type и другими параметрами WP_Query , советуем обратиться к нашей статье.

Как видно из примера, meta_query содержит массив с одним элементом, который указывает ключ и значение произвольного поля с помощью key и value . Данный пример вернет записи, которые мы опубликовали в хорошем настроении.

Каждый массив в meta_query может содержать следующие элементы:

  • key — это ключ (или имя) нашего произвольного поля
  • value — значение произвольного поля, строкой или массивом
  • compare — тип сравнения, например: = , != , > , >= , , , LIKE , NOT LIKE , IN , NOT IN , BETWEEN , NOT BETWEEN , EXISTS , NOT EXISTS
  • type — тип значения, например: NUMERIC , BINARY , CHAR , DATE , DATETIME , DECIMAL , SIGNED , TIME , UNSIGNED


Рассмотрим еще один пример с использованием чисел и другого типа сравнения:

Здесь мы запрашиваем у WP_Query записи произвольного типа property , где значение произвольного поля price меньше или равно 50,000.

Важно отметить, что все значения произвольных полей в WordPress имеют текстовый тип, а значение параметра type позволяет преобразовать все значения в требуемый тип перед сравнением. В нашем случае это число ( NUMERIC ).

Несколько запросов meta_query

Как мы уже упомянули, параметр meta_query является массивом массивов, что позволяет легко указать более одного запроса или условия. Например:

Данный запрос вернет записи типа product у которых в произвольных полях указан красный цвет и размер XL. По умолчанию в meta_query запросы будут производиться с оператором «и», а не «или», но это легко изменить с помощью аргумента relation :

В данном примере мы получим продукты красного или синего цвета. Когда речь идет об одном ключе и нескольких возможных значениях, подобный запрос написать гораздо проще (и быстрее) с помощью сравнения типа IN :

Сортировка с помощью произвольного поля

Часто при работе с мета-данными в WordPress приходится учитывать их при сортировке результатов. За это в классе WP_Query отвечает параметр orderby , где можно указать:

  • meta_value — сортировать по значению мета-поля
  • meta_value_num — сортировать по численному значению мета-поля
  • для сортировки по дате, заголовку и другим полям см. нашу статью

При использовании значений для сортировки по произвольным полям необходимо в параметрах к WP_Query так же указать ключ для сортировки с помощью аргумента meta_key . Простой пример вывода автомобилей по их цене по возрастанию:

Более сложный пример: вывод красных автомобилей мощностью от 100 до 150 лошадиных сил, и сортировка по цене по убыванию:

Производительность meta_query

Параметр meta_query действительно позволяет делать многое с произвольными полями в WordPress, но не стоит забывать о производительности, особенно если речь идет о большом количестве данных и о сложных запросах с мета-полями.

Поле meta_value таблицы wp_postmeta в базе данных MySQL не имеет индекса из-за его типа LONGTEXT . Но даже если бы был индекс, пользы от него было бы мало, поскольку запросы с meta_query используют MySQL функцию CAST для перевода типа данных при поиске, а присутствие подобной функции в запросе значит, что индекс использован не будет.

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

Если у вас остались вопросы по работе с произвольными полями в WP_Query , оставьте комментарий и мы обязательно вам ответим.

Фильтр поиска по значению произвольного поля

Подскажите, как можно осуществить выбор и вывод постов по значению произвольного поля gorod . При этом необходимо, чтобы список имеющихся значений в фильтре выбирался из базы, а не определялся в фильтре вручную.

фильтр выводится, работает, но при условии, если комментирую строку

Фильтрация по значению полей gorod не осуществляется ни при каком варианте.

1 ответ 1

Проблема, как минимум, в том, что в начале функции нет строки

Каталог на WordPress + Magic Fields. Поиск по каталогу и фильтры. Часть 2

Продолжая тему, посвященную плагину Magic Fields, я постараюсь доступно рассказать о том, как организовать поиск по дополнительным полям, которые создаются с помощью этого плагина. Помимо процесса создания привычной поисковой формы, приведу пример организации одиночных фильтров.

И то и другое, в готовом варианте, вы можете видеть в блоге, который я уже упоминал в первой заметке о Magic Fields. К сожалению, с тех пор я так и не удосужился уделить этому блогу сколько-нибудь достаточное количество времени, поэтому и форма и фильтры там находятся в зачаточном состоянии. Тем не менее, они отлично демонстрируют результат, являющийся логичным завершением использования данного WordPress плагина.

Единственным минусом плагина Magic Fields является невозможность создавать поля с парами ключ – значение. Быть может для вас это и не является минусом, но мне данный подход не слишком нравится. В любом случае, вариантов нет, поэтому мы будем фильтровать публикации в каталоге по строковым значениям дополнительных полей.

Допустим, помимо прочих, у нас есть дополнительное поле «Производитель». Список производителей строго регламентирован и при создании публикации он представляет собой selectbox. В пользовательской части наша публикации может иметь следующий вид (скриншот с упомянутого блога):

Все характеристики заданы дополнительным полями Magic Fields. Те значения, что подсвечиваются синим цветом являются ссылками, выполняющими роль фильтров.

Предположим, что мы кликаем на имя производителя LG и, перейдя обратно в каталог, хотим видеть товары только этой компании. Для реализации этой нехитрой логики открываем файл шаблона header.php и дописываем туда следующий код:

Код простой и не требует каких-то особых комментариев, кроме отдельных моментов.

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

Далее собираем все полученные значения дополнительных полей в массив $x_params. Если полей будет очень много, то не следует делать так, как сделал я, а именно писать блок условия для каждого поля. Иначе у вас будет много некрасивого и бестолкового кода. Лучше вынести имена полей в массив, а затем обходить его циклом, проверяя, пришло ли от пользователя значение для каждого поля. Но речь не об этом.

Собрали все значения в массив ключ =>значение и циклом конкатенируем их в строку вида &x_field_name=field_value. Обратите внимание, на то, что имена дополнительных полей должны иметь префикс x_. После этого регистрируем наш обновленный запрос функцией query_posts(). Естественно, не забываем выполнить конкатенацию уже существующей строки запроса, которая храниться в переменной $query_string и наших добавленных параметров.

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

Ниже привожу код, который будет выводить форму поиска по дополнительным полям Magic Fields. У меня она лежит в файле шаблона archive.php, но не факт, что у вас также (зависит от шаблона и способов его реализации).

У меня в блоге, на момент написания статьи, она выглядела примерно так:

В общем, Magic Fields – действительно отличный WordPress плагин, позволяющий значительно расширять возможности стандартного блога. Потенциал у него достаточно большой и при желании, можно структурировать неплохой каталог со всеми необходимыми функциями.

P.S: Пример реализации поиска с помощью класса WP_Query

Комментарии (32)

А могли бы Вы привести реализацию фильтра (поиска) по выборке записей с различными видами, а не только с полем select, но и с checkbox-ами, полями ввода (например для мин. и макс. цены) и чтобы они были взаимодополняющими. Например выбор нескольких типов производителей.

То, о чем вы спрашиваете, больше относится к API WordPress и прямого отношения к плагину не имеет.
Но учитывая тот факт, что подобный вопрос задаете не вы первый, ближайшее время постараюсь написать небольшую заметку на эту тему.

буду очень признателен, если уведомите о этой заметке по мылу;)

Я бы предложил вам подписаться на RSS 🙂 про мыло, скорее всего, банально забуду.
Ко всему прочему, время от времени пишу о WordPress. Возможно, другие заметки тоже будут вам интересны.

Большое спасибо за материал! Как раз нужен каталог для WordPress

Помогите разобраться!)
Делаю все точно по вашему уроку.. но в раскрывающемся списке выбора производителя нет ни одной позиции.
Хотя в самих настройках полей я их задавала.
Заранее, спасибо!)

У меня список производителей формируется не на основе тех значений, что вы задаете при создании поля, а на основе массива $device_producers. Это сделано с целью избавиться от дополнительного запроса в БД.

Мне кажется, вы не там ищете источник проблемы.

Подскажите, пожалуйста, что означают параметры полей required (this field is required)
Can be duplicated (this field is duplicable?)

Развернутый ответ на этот вопрос имеется в официальной документации Magic Fields http://wiki.magicfields.org/doku.php? >

Не думаю, что я смогу добавить что-либо к написанному.

Просто там на английском и такие технические тонкости сложно понять, поэтому хотелось бы по простому, по русски 🙂

Здравствуйте Олег. Сделал все как описано в статье (из первой статьи все получилось) но сделать сортировку по каталогу как у вас в первом примере не получается. Вставляю в single.php код и подставляю свои значения но данные из доп. полей даже не подсвечиваются как ссылки. Можете подсказать что я делаю не так?

и сразу дополню свой вопрос. Как выводить дополнительные поля в каталоге к каждому посту если у меня в категории выводятся только заголовки. Ну то есть я в категории хочу построить таблицу в которой напротив каждого названия(заголовка поста) будут выводиться доп. поля.

Для получения значения полей необходимо использовать функцию get() внутри цикла while (have_posts()). И неважно, в категории это или в одиночной записи.

Это же относится к вашему первому вопросу. В заметке данный момент опускается. Но ссылки для фильтров формируются именно с помощью get().

Здравствуйте.
Не могли б вы объяснить что означает это: action=»/devices/»
Получается форму обрабатывает страница devices. Какую мне страницу задать. У меня на все логично выдает Нет такой страницы

У меня это была категория, но можно сделать с помощью страницы в том числе. Разница только в файлах шаблонов, которые потребуется отредактировать.

Подскажите пожалуйста как делать сортировку или поиск, если данные в таблице храняться в серилизованном виде?

Я понятия не имею о том, насколько он рабочий. Сам не пользовался, но на форумах о нем иногда говорят.

Без него сортировка по сериализованной строке невозможна. А вот поиск, в принципе, можно осуществлять с помощью LIKE %%, например.

Здраво.
Отфильтрованные посты выводятся с пагинацией, первая страница показывает отфильтрованные, но стоит перейти на другую страницу пагинации, выводятся все посты без фильтрации.
Как полечить?
Спасибо

Реализуйте свою функцию пагинации или можно использовать какой-нибудь плагин, который позволит передавать дополнительные параметры.

Я, как правило, делал вывод результатов фильтрации через ajax, поэтому базовая пагинация WP меня не беспокоила.

А можно пример, как это выглядит через ajax

Вроде и понятно, но не получается … буду тренироватся)

Подскажите пожалуйста, как можно интегрировать в стандартный поиск wp magic-fields, чтобы искало хотябы по заголовкам и по возможности по текстовым полям

По заголовкам он должен искать и так. Как раз неделю назад проверял это на живом проекте. Если поиск по заголовкам не происходит, значит что-то не так с таксономиями.

А вот относительно полей подсказать не могу, так как подобных задач не решал. Попробуйте погуглить. В топе выдачи можно найти вот эту тему на офф. форуме, где поднимают ваш вопрос http://wordpress.org/support/topic/include-custom-field-values-in-search

Простите, тема старая, но вроде никто подобного вопроса не касался: если доп. поля не одного уровня, как у вас (производители), а хотя бы двух (оружие — танки — танки гусеничные и танки колесные, предположим такое) Как в таком случае организовать ввод данных, чтобы танки колесные были и в категории «танки колесные» и в то же время в категории «танки»? (Делаю для людей неискушенных, поэтому важно сделать просто и доступно, самому-то можно и на коленке забацать )

Множественный выбор полей не поможет, т.к. кроме танков там есть и самолеты и автоматы, есть риск выбрать по ошибке не ту категорию. Идеальным было бы вложение категорий, но такого в этом плагине я не нашел пока.

А зачем вам дополнительные поля? Ведь есть обычные категории WP или можно создать свою таксономию.

Категории есть, они для постов, а в каталоге логичнее (на мой взгляд, конечно) страницы использовать. Своя таксономия, насколько я понял, тоже создается или на основе постов или на основе страниц. Если у нас страницы, то есть ли возможность сделать вложение таксономий, или придется переходить на посты с категориями?
Есть еще один путь сделать каталог — через плагин Page list, там есть все возможности для реализации искомого, но ввод новых позиций в каталог не очевиден. А в Magic Fields как раз ввод достаточно прост, но с вложенностью затык…

Сортировка записей WordPress по нескольким произвольным полям

В WordPress есть полезная функция, которую можно использовать для получения списка постов — query_posts() .

Используется самим WordPress при получении записей для текущей страницы (архив авторов, отдельная запись, рубрика, метка). Определяет какие посты будут показаны в базовом Цикле WordPress. Создает базовый Цикл WordPress. Возвращает список записей (постов). WP-KAMA

Эта функция может принимать огромное количество аргументов, из которых в данной статье нам будут интересны order , orderby и meta_query .

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

Предположим, нам необходимо вывести товары интернет-магазина, отсортированные по наличию и по возрастанию цены. Для сортировки только по одному полю нам было бы достаточно такой записи:

В такой записи мы сортируем по произвольному полю meta_key => price , которое является числовым orderby => meta_value_num и по убыванию значения order => DESC . Однако, добавить второе поле сортировки в такой конструкции нельзя, как нельзя его добавить, используя множественный массив:

Но мы все же можем использовать множественный массив, но для этого нам необходимо с помощью параметра meta_query обозначить наши произвольные поля. Для этого мы добавляем через вложенные массивы эти поля с параметрами compare => EXISTS и type => NUMERIC для числовых значений:

Таким образом мы определили имена произвольных полей в параметре meta_query и можем воспользоваться ими в множественном массиве orderby :

После этого уже можем воспользоваться функцией query_posts() для получения списка записей и дальнейшего вывода.

Нам будет приятно

Еще интересное в блоге

Облако меток для постов из определенной категории

Редактирование стилей административной панели

Будем рады работать именно с вами

Политика конфиденциальности персональных данных

Топ-пост этого месяца:  ВебЭффектор — комплексное продвижение сайта в Webeffector
Добавить комментарий