Если вы проектируете или разрабатываете темы или плагины WordPress, есть большая вероятность, что когда-нибудь вам понадобится сделать запрос для настраиваемых мета-полей. Это те полностью настраиваемые пары ключ / значение, которые вы можете прикрепить к любому сообщению, странице или настраиваемому типу сообщения. WordPress по умолчанию имеет базовый пользовательский интерфейс для них, или вы можете использовать что-то вроде расширенных настраиваемых полей, чтобы поработать с ними. Но под капотом ACF использует обычные старые настраиваемые поля.
Этот самый фрагмент страницы, на который вы сейчас смотрите, был написан в 1999 году. В то время для запроса сообщений с определенными настраиваемыми полями вам нужно было использовать глобальную переменную `$ wpdb`. Это можно использовать для создания запросов MySQL, которые класс WordPress WP_Query () не поддерживает. К счастью, сегодня у WordPress есть аргументы, которые поддерживают запросы для настраиваемых мета-полей.
Здесь мы рассмотрим различные способы запроса и цикла сообщений с определенными настраиваемыми полями (и их значениями). Вы сможете использовать эту информацию независимо от того, используете ли вы WP_Query
класс query_posts()
, или get_posts()
. Поскольку query_posts()
и get_posts()
являются оболочками для WP_Query
класса. Все они принимают одни и те же аргументы.
Аргументы запроса
Вот базовый пример запроса WordPress, взятый из Кодекса WordPress.
have_posts() ) ( echo '
'; while ( $the_query->have_posts() ) ( $the_query->the_post(); echo '
- ' . get_the_title() . '
'; ) echo '
'; ) else ( // no posts found ) /* Restore original Post Data */ wp_reset_postdata();
Это $args
важный момент. Мы будем передавать разные аргументы, чтобы заставить эту работу работать так, как мы хотим.
При запросе настраиваемой меты есть две «группы» аргументов, которые вы можете использовать. Одна группа предназначена для простого запроса настраиваемого метаполя, а другая группа - для более сложных запросов настраиваемого метаполя. Начнем с простой группы.
meta_key
meta_key
Аргумент будет запрашивать любой пост , который имеет пользовательские поля мета сохранен идентификатор в базе данных, независимо от того , есть или нет значение сохраняется на поле. Это meta_key
идентификатор, который вы даете своим мета-полям. Так:
В этом примере будет запрашиваться любое сообщение, в котором есть настраиваемое мета-поле с идентификатором «field1».
$args = array( 'meta_key' => 'field1' );
meta_value
meta_value
Аргумент запрашивает пост , которые имеют значение , которое вы определили. meta_value
Аргумент используется для строковых значений. В этом примере будут запрашиваться любые сообщения с настраиваемым метаполем, имеющим значение «data1».
$args = array( 'meta_value' => 'data1' );
Вы также можете комбинировать их. В этом примере будут запрашиваться только сообщения, у которых есть настраиваемое мета-поле с идентификатором «field1», имеющим значение «data1».
$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1' );
meta_value_num
Аргумент meta_value_num аналогичен аргументу `meta_value`. Если meta_value
аргумент используется для строковых значений, meta_value_num
он предназначен для числовых значений.
В этом примере показано, как запросить настраиваемое мета-поле «field1», если оно имеет значение «10».
$args = array( 'meta_key' => 'field1', 'meta_value_num' => '10', );
meta_compare
meta_compare
Аргумент делает именно то , что это звучит. Это позволит вам использовать компараторы с аргументами `meta_value` и` meta_value_num`. Вы можете использовать компараторы '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' или 'RLIKE'. Вот пример, который показывает, как запрашивать любые сообщения, у которых нет значения «data1».
$args = array( 'meta_key' => 'field1', 'meta_value' => 'data1', 'meta_compare' => '!=', );
Более сложные запросы
meta_query
Главный аргумент, который вы будете использовать для сложных запросов, - это meta_query
. Этот аргумент сам по себе ничего не дает. Он просто сообщает WordPress, что вы хотите сделать запрос для настраиваемых мета-полей. Вы добавите дополнительные аргументы, meta_query
которые будут использоваться для определения запроса.
ключ, значение и сравнение
Аргументы key
, value
работа точно так же , как meta-key
, meta-value
как описано выше. Комплекс compare
аналогичен compare
описанному выше, но требует другого списка компараторов. В комплексе compare
используются '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN ',' НЕ МЕЖДУ ',' СУЩЕСТВУЕТ 'или' НЕ СУЩЕСТВУЕТ '. value
может быть массивом, но только если для сравнения используются «IN», «NOT IN», «BETWEEN» или «NOT BETWEEN».
Если вы используете EXISTS или NOT EXISTS с compare
, вам не нужно указывать value
аргумент.
Вот пример, который будет запрашивать сообщения, если в нем есть «field1» со значением «data1» и «field2» со значением, отличным от «data2».
$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1' ), array( 'key' => 'field2', 'value' => 'data2', 'compare' => '!=', ) ) );
связь
relation
Используется , когда вы хотите пользовательских запросов данных мета используя логическую связь. Вы можете использовать AND
или OR
. Например, вы будете использовать AND
для сравнения, если data1 и data2 соответствуют критериям, и вы используете, OR
если data1 или data2 соответствуют критериям.
Это самостоятельный аргумент. Это означает, что он не отображается в отдельных параметрах настраиваемого мета-поля. Давайте посмотрим на пример. В этом примере будут запрашиваться только сообщения, в которых «field1» имеет значение «data1», а «field2» - значение «data2».
$args = array( 'meta_query' => array( 'relation' => 'AND' array( 'key' => 'field1', 'value' => 'data1', ), array( 'key' => 'field2', 'value' => 'data2', ), ) );
Если вы изменили relation
на «ИЛИ». Затем он будет запрашивать любые сообщения, если «field1» имеет значение «data1», или если «field2» имеет значение «data2».
тип
type
Аргумент позволяет выбрать тип данных для запроса. Вы можете использовать NUMERIC, BINARY, CHAR, DATE, DATETIME, DECIMAL, SIGNED, TIME или UNSIGNED.
Тип «ДАТА» может использоваться с compare
«МЕЖДУ», только если формат даты - «ГГГГММДД».
В этом примере будет запрашиваться любое сообщение, в котором значение field1 является числовым.
$args = array( 'meta_query' => array( array( 'key' => 'field1', 'value' => 'data1', 'type' => 'NUMERIC' ) ) );
Пример из реального мира
Пока что я привел только примеры с произвольными данными и полями. Теперь я хотел бы показать вам реальный пример запроса настраиваемых мета-полей.
Сценарий
Вы создали настраиваемый тип публикации событий. Тип публикации событий имеет настраиваемое поле даты с идентификатором event_date
. Вы хотите создать запрос, который будет показывать любые события, которые начнутся с текущей даты в течение следующих 30 дней.
Мы собираемся использовать meta_query
аргумент, поскольку мы хотим использовать type
аргумент для определения поля «event_date» как типа данных «DATE».
Это запрос:
$args = array( 'post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'event_date', 'value' => array( date( 'Ymd', strtotime( '-1 day' ) ), date( 'Ymd', strtotime( '+31 days' ) ) ), 'compare' => 'BETWEEN', 'type' => 'DATE' ) ) ); $event_query = new WP_Query( $args );
Это value
массив текущей даты - 1 день и 31 день от текущей даты. Поскольку мы используем компаратор «BETWEEN», будут запрашиваться только сообщения между массивом значений, поэтому мы хотим компенсировать их на один день.
С помощью этого запроса вы отобразите любое событие, происходящее в ближайшие 30 дней.
Вывод
Это WP_Query
очень гибкий класс, который позволит вам создавать множество пользовательских запросов. Если вы хотите узнать больше о различных аргументах, которые можно использовать для запросов, я рекомендую просмотреть WP_Query
страницу кодекса.