- WP Magazine
- Про WordPress на русском языке
- Работа с произвольными полями в WP_Query
- Параметр meta_query
- Несколько запросов meta_query
- Сортировка с помощью произвольного поля
- Производительность meta_query
- Константин Ковшенин 07.01.2014 21.10.2014
- Подписаться на рассылку
- Читайте также
- Вебинары на WordPress.com
- Как добавить заголовок Sender в wp_mail()
- WordPress Meetup в Санкт-Петербурге пройдет 14 октября
- Локальный сервер для WordPress за 5 минут с VVV, VirtualBox и Vagrant
- Поиск по сайту
- Бесплатная книга
- Вакансии
- Сортируемые колонки в админке
- 1. Добавление колонки
- 2. Делаем колонку сортируемой
- 3. Сортируем посты
- Сортировка по произвольному полю (WordPress)
- Создание произвольного поля
- HTML-разметка фильтра сортировки
- Вывод товаров
- Доработка формы фильтра
- Вывод товаров для выбранной сортировки
- Отправка формы при выборе option
- Сортировка записей по произвольным полям в консоли управления WordPress
WP Magazine
Про WordPress на русском языке
Работа с произвольными полями в WP_Query
Произвольные поля (или мета-данные) в WordPress позволяют добавлять дополнительную информацию к записям, страницам и пользовательским типам данных. Использовать произвольные поля можно в самых разных сценариях, например:
- для сайта недвижимости произвольными полями могут быть цена, площадь, координаты на карте
- для авто-каталога произвольными полями можно задавать мощность двигателя, цвет автомобиля, пробег
- для личного блога с помощью произвольных полей можно задать настроение, музыку или ваше место нахождения
Работа с произвольными полями в WordPress
» data-medium-file=»https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png?fit=300×93″ data-large-file=»https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png?fit=1024×317″ src=»https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png» alt=»Работа с произвольными полями в WordPress» width=»766″ height=»237″ srcset=»https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png 2164w, https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png?fit=300×93 300w, https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png?fit=768×238 768w, https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png?fit=1024×317 1024w, https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png?fit=1536×476 1536w, https://wpmag.ru/wp-content/uploads/2014/01/wordpress-custom-fields.png?fit=2048×634 2048w» sizes=»(max-width: 2164px) 100vw, 2164px»/>
Работа с произвольными полями в 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 , оставьте комментарий и мы обязательно вам ответим.
Константин Ковшенин 07.01.2014 21.10.2014
Сооснователь журнала WP Magazine и первой конференции WordCamp в России. Работал в Automattic, WordPress.com, WooCommerce. Принимает активное участие в развитии ядра WordPress. Любимый язык программирования: Python.
Подписаться на рассылку
Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!
Читайте также
Вебинары на WordPress.com
Вебинары на WordPress.com
Как добавить заголовок Sender в wp_mail()
Contributor Day после WordCamp SF 2013
WordPress Meetup в Санкт-Петербурге пройдет 14 октября
Локальный сервер для WordPress за 5 минут с VVV, VirtualBox и Vagrant
Раз в неделю, только все самое новое про WordPress и никакого спама!
Поиск по сайту
Бесплатная книга
Как защитить свой сайт от хакеров? Читайте в нашей электронной книге.
Вакансии
- WordPress разработчик в компанию Grooni
- Web-разработчик со знанием WordPress в Pravmir.ru
- Ведущий WordPress-программист в компанию UpSolution
- WordPress-ниндзя в команду Pressjitsu
- WordPress разработчик в компанию Automattic
Ищете крутую тему для WordPress? Попробуйте Maker от ThemePatio:
Сортируемые колонки в админке
В этом уроке покажу, как добавить колонку с количеством просмотров в таблицу с постами и отсортировать её по значению произвольного поля.
В качестве произвольного поля я взял количество просмотров записи, ну, и если вы кликнете по заголовку таблицы «Количество просмотров», то посты соответственно будут сортироваться по возрастанию или убыванию просмотров (если кликнуть второй раз).
Другие фильтры записей и постраничная навигация при этом будут работать как обычно.
Также хочу порекомендовать вам свой видеокурс по созданию темы WordPress на основе готовой HTML-вёрстки ⚡️
1. Добавление колонки
Про добавление колонок для типов записей, таксономий, пользователей, комментариев и так далее у меня есть подробнейший урок.
Сейчас же добавим колонку с выводом значения произвольного поля для обычных записей WordPress.
2. Делаем колонку сортируемой
А вот нам придётся познакомиться с хуком manage_
Или можете например воспользоваться таблицей:
Экран | Хук |
---|---|
Записи | manage_edit-post_sortable_columns |
Страницы | manage_edit-page_sortable_columns |
Произвольные типы постов | manage_edit-<тип поста>_sortable_columns |
Рубрики | manage_edit-category_sortable_columns |
Метки | manage_edit-post_tag_sortable_columns |
Произвольные таксономии | manage_edit-<таксономия>_sortable_columns |
Библиотека файлов | manage_upload_sortable_columns |
Комментарии | manage_edit-comments_sortable_columns |
Пользователи | manage_users_sortable_columns |
Суть легка – в массив сортируемых колонок добавляем нашу:
После этого наша колонка станет сортируемой, но пока что ничего не будет работать до тех пор, пока мы не перейдём к следующему шагу.
3. Сортируем посты
О, а вот тут конечно интересно. Код сильно зависит от того, что конкретно вы будете сортировать. В этом примере мы сортируем посты (записи) и поэтому все наши старания ограничатся использованием хука pre_get_posts.
- Вам не нужно писать этот код для стандартных значений параметра orderby , например, если вы хотите отсортировать пользователей по дате их регистрации, то скипаем смело этот шаг.
- Фильтр pre_get_posts у нас сработает для любых типов постов – записей, страниц, библиотеки файлов и любых произвольных.
- Для пользователей можете использовать pre_get_users .
- Для комментариев pre_get_comments .
- Для рубрик, меток и таксономий – pre_get_terms .
Раньше, чтобы заставить работать что-либо, кроме постов, нужно было устраивать свистопляски, но теперь все фильтры очень похожи друг на друга.
Ну и ещё раз то, что у нас получилось:
Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.
Пишите, если нужна помощь с сайтом или разработка с нуля.
Сортировка по произвольному полю (WordPress)
Рассмотрим, как отсортировать по произвольному полю (ACF) в WordPress. Для примера будем использовать select, но здесь нет разницы какие элементы форм использовать.
Какие шаги необходимо предпринять:
Создание произвольного поля
Пусть произвольное поле будет цена — будем сортировать по нему (по возрастанию и убыванию).
HTML-разметка фильтра сортировки
Начнём с простой HTML-разметки, далее сделаем её динамической, т.е. будем проверять какой тип сортировки в текущий момент выбран.
Вывод товаров
Пусть у нас есть таксономия «Товары» my_product и таксономия «Категории товаров» my_product_category .
Выведем товары с сортировкой по умолчанию (ASC). Для упрощения, как уже говорил выше, после того как у нас всё выведется по умолчанию, только тогда мы добавим динамики.
Обратите внимание, мы сортируем по произвольному полю ACF price.
Пагинация. Более подробно о создании пагинации можно прочитать в этой статье — Пагинация в WordPress без плагинов.
Доработка формы фильтра
Если все вышеописанные шаги у вас не вызвали проблем и всё успешно работает, добавим динамики.
При отправке формы и перезагрузке страницы мы увидим хвосты в URL — GET-параметры. Будем добавлять атрибут checked выбранному select option :
Вывод товаров для выбранной сортировки
Осталось получить и добавить текущее значение сортировки в запрос WP_Query.
Отправка формы при выборе option
Можно добавить автоматическую отправку формы при выборе какого-либо option:
На этом на сегодня всё. Может пригодиться:
- Шпаргалка по работе с WordPress.
- Шпаргалка по работе с ACF.
Надеюсь, вам понравилась данная информация. Если вам интересна тема web-разработки, то можете следить за выходом новых статей в Telegram.
Сортировка записей по произвольным полям в консоли управления WordPress
В прошлый раз мы говорили о том как немного упростить жизнь контент-менеджера с помощью фильтрации по таксономиям списка записей WordPress. Сегодня мы пойдём дальше, добавим в список записей колонку со значениями из произвольных полей (custom fields) и сделаем по этим данным сортировку записей.
Сразу поясню, речь идёт о консоли управления WordPress. Мы будем делать сортировку записей в листинге записей для администраторов и контент-менеджеров.
Понятно, что обычному блогу вряд ли когда-то это всё пригодится, а вот для различных каталогов, баз данных, интернет-магазинов возможность видеть в списке записей нужные произвольные часто бывает очень даже удобно и полезно.
Формулируем задачу.
Имеется тип данных (CPT) — portfolio с несколькими записями, каждая из которых содержит произвольное поле price с числовым значением. Необходимо в листинге записей вывести колонку с ценами с возможностью сортировки по-возрастанию и убыванию относительно значений price. Говоря проще, контент-менеджер должен иметь возможность сортировки записей от дешёвых к дорогим и наоборот.
1. Регистрируем в WordPress новую колонку с помощью хука manage_edit-$
2. Выводим в созданную колонку мета-данные из произвольного поля «price».
3. Делаем сортировку с помощью фильтра manage_<$screen->id>_sortable_column. Где <$screen->id> в нашем случае edit-portfolio. Чтобы сделать невозможной дефолтную сортировку по дате, расскоментируйте строку unset($columns[‘date’]);
4. Новая сортировка по умолчанию.
Конечно, это самый простой и примитивный пример, который скорее даст лишь общие представления о работе с контентом в WordPress и покажет некоторые способы упрощения управления им.
Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.