Пользовательский цикл / запрос на основе настраиваемых полей - CSS-хитрости

Anonim
Последнее обновление: Джейсон Витт.

Если вы проектируете или разрабатываете темы или плагины 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страницу кодекса.