Спеціальний цикл / запит на основі користувацьких полів - 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Аргумент використовується для строкових значень. Цей приклад запитає будь-які публікації зі спеціальним мета полем, яке має значення “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_value` та` meta_value_num`. Порівняльниками, якими можна скористатися, є '=', '! =', '>', '> =', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN' , "МІЖ", "НЕ МІЖ", "НЕ ІСНУЄ", "REGEXP", "НЕ 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'.

Якщо ви використовуєте "ІСНУЄ" або "НЕ ІСНУЄ" 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для порівняння, якщо дані1 та дані2 відповідають критеріям, і ви використовуєте, ORякщо дані1 або дані2 відповідають критеріям.

Цей аргумент є самостійним. Це означає, що він не відображається в окремих спеціальних параметрах метаполя. Давайте розглянемо приклад. Цей приклад буде запитувати лише повідомлення, які мають “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', or '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 день від поточної дати. Оскільки ми використовуємо компаратор “МІЖ”, запитуватимуться лише повідомлення між масивом значень, тому ми хочемо компенсувати їх на один день.

За допомогою цього запиту ви відобразите будь-яку подію, яка відбудеться протягом наступних 30 днів.

Висновок

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