WP_Meta_Query{}
Клас створює JOIN і WHERE частини SQL запиту, які на додаток до основного запиту фільтруватимуть результат за вказаним ключем і значенням метаполя.
WP_Meta_Query – це допоміжний клас, який використовується в комбінації з класами: WP_Comment_Query та допомагає їм фільтрувати результат на основі вказаних метаданих.
Для WP_Meta_Query є функція обгортка: get_meta_sql()
нотатки
Результат не додає пробіли по краях рядків до JOIN та WHERE. Тому потрібно додати пробіли вручну, щоб не пошкодити SQL запит.
- Якщо ви використовуєте
value
іcompare
, то результат WHERE запиту буде виглядати якось так:AND (wp_postmeta.meta_key = 'foo_key' OR (mt1.meta_key = 'bar_key' AND CAST(mt1.meta_value AS CHAR) LIKE '%foo%') )
Зверніть увагу, що mt1 тут – це аліас мета таблиці, а значить wp_postmeta.meta_key та mt1 це різні таблиці. Тому в JOIN частині вам потрібно двічі об’єднати мета таблиці з основною, це виглядає так:
INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
Використання
Варіант 1:
$mq = new WP_Meta_Query( $meta_query );
Варіант 2:
$mq = New WP_Meta_Query();
$mq->parse_query_vars( $meta_query );
Аргументи параметра $meta_query
$meta_query передається у клас і основі цих даних будуються частини запиту.
$meta_query це масив, де кожен елемент є масивом із параметрами окремого запиту, тобто. це масив масивів. Така конструкція дозволяє створювати численні запити. Ось як це виглядає:
$meta_query = [
'relation' => 'OR', // за умовчанням 'AND'
// Перший мета запит
'Ключ для orderby' => [
'key' => 'color',
'value' => 'blue',
'compare' => '!=', // за умовчанням '='
],
// Другий мета запит
[
'key' => 'price',
'value' => 20,
'compare' => '>',
'type' => 'NUMERIC', // за замовчуванням 'CHAR'
],
// Третій мета запит. і т.д...
];
Якщо вказати ключ для вкладеного масиву, цей ключ можна використовувати в параметрі ‘orderby’ в батьківському запиті для сортування за поточним метаполем.
-
relation
(рядок) Визначає логічний зв’язок між вкладеними масивами. Цей параметр вказується як рядок у головному масиві
meta_query
та вказує як порівнювати між собою вкладені параметри запиту (вкладені масиви з параметрами запиту). Може бути:OR
– вибрати мета-поля відповідні хоти під один масив параметрів;AND
(за замовчуванням) – вибрати мета поля, що підходять для всіх масивів параметрів.key (рядок | масив)
Ключ поля. Можна вказати кілька ключів у масиві.compare_key (рядок) (з версії 5.1)
Як порівнювати вказане в key значення. Може бути:=
– Так само.!=
– не дорівнює. (WP 5.3)LIKE
– Містить зазначену підрядок.NOT LIKE
– НЕ містить зазначений підрядок. (WP 5.3)IN
– дорівнює одному зі значень. (WP 5.3)NOT IN
– НЕ одно одному зі значень. (WP 5.3) (WP 5.3)REGEXP
– збігається з регулярним виразом. (WP 5.3)NOT REGEXP
– НЕ збігається з регулярним виразом. (WP 5.3)RLIKE
– синонім REGEXP. (WP 5.3)EXISTS
-Аліас=
. (WP 5.3)NOT EXISTS
-Аліас!=
. (WP 5.3)
За замовчуванням: ‘=’, або ‘IN’, коли $key містить масив
type_key (рядок) (з версії 5.3)
Тип даних MySQL, який потрібно використовувати функції CAST(). Якщо вказано, то значення колонкиmeta_key
буде спочатку перетворено на вказаний тип і тільки потім порівнюватиметься з вказаним значенням. Може бути:BINARY
– потрібно коли у регулярних висловлюваннях важливий регістр символів.
За замовчуванням: ”
value (рядок/масив)
Значення поля. Вказувати не потрібно, якщо у порівнянні використовується:EXISTS
абоNOT EXISTS
(з версії 3.9).compare (рядок)
Як порівнювати вказане значення.
Може бути:=
– Так само.!=
– не дорівнює.>
– Більше.>=
– більше або дорівнює.<
– менше.<=
– менше або дорівнює.LIKE
– вказаний у value підрядок є в рядку. Як ‘%значення%’ у запиті sql.NOT LIKE
– теж що LIKE тільки навпаки.IN
– у value вказуються кілька значень у масиві і пошук йде хоча б за одним із значень.NOT IN
– будь-яке значення, крім тих, що зазначені у вигляді масиву в value.BETWEEN
– у value вказуються 2 значення масиві: більше і менше і пошук йде між цих значень. наприклад: ‘value’ => array(5, 25) – від 5 до 25 (включно).NOT BETWEEN
– будь-яке значення, за межами діапазону вказаного у value, наприклад: ‘value’ => array(5, 25) – менше 5 і більше 25.EXISTS
– виведе все, де існує вказаний в ‘key’ ключ. ‘value’ не вказується у разі. (З версії 3.5)NOT EXISTS
– виведе все, де вказаний в ‘key’ ключ не існує. ‘value’ не вказується у разі. (З версії 3.5)REGEXP
– у value вказується регулярне вираз пошуку, наприклад: ‘value’ => ‘^bar’ , (знайде рядок: ‘bar is’). (З версії 3.7)NOT REGEXP
– у value вказується регулярний вираз для пошуку, знайде все, що не входить до цього виразу. (З версії 3.7)RLIKE
– синонім REGEXP. (З версії 3.7)
За замовчуванням: ‘=’ або ‘IN’, коли вказівник вказує масив.
type (рядок)
Тип даних, у який потрібно перевести value для порівняння. Якщо, наприклад, у полі вказуються тільки числа, потрібно використовувати NUMERIC , щоб числа не порівнювалися як рядки.Зазначений тут тип безпосередньо передається в функцію mysql CAST() .
Може бути:
NUMERIC
– цілі числа. Можна вказати точністьDECIMAL(p,s)
.DECIMAL
– дробові числа. Можна вказати точність:DECIMAL(p,s)
. Наприклад: DECIMAL(5,2) – число з макс 5 цифрами всього (3 до роздільника) та 2 цифри після роздільника.SIGNED
– цілі числа, позитивні та негативніUNSIGNED
– цілі числа, лише позитивніCHAR
– рядок не чутливий до регіструBINARY
– рядок чутливий до регіструDATETIME
– дата і часDATE
– лише датаTIME
– Тільки час
Якщо вказати будь-яке інше значення (або взагалі не вказати значення), воно перетвориться на
CHAR
.За замовчуванням:
CHAR
.
Тип
DATE
працює при порівнянніBETWEEN
тільки якщо дата вказується у форматіY-m-d
та порівнюється з аналогічним форматом. Для типуDATETIME
це форматY-m-d H:i:s
.
Використання
Є 2 варіанти передати параметри до класу:
#1. Передача параметрів у конструктор
У цьому випадку ми передаємо масив параметрів у сам клас.
$meta_query = [
'relation' => 'OR', // необов'язково, за умовчанням 'AND'
[
'key' => 'key_name',
'value' => 'значення поля',
'compare' => '=' // не обов'язково, за умовчанням '=' або 'IN' (якщо value масив)
],
];
$mq = new WP_Meta_Query( $meta_query );
#2. Передача параметрів метод parse_query_vars()
parse_query_vars() потрібен, коли використовується “простий” спосіб передачі параметрів: як одномірного масиву. Або якщо ви не впевнені, як будуть передаватися параметри і вони можуть передаватися у вигляді одновимірного масиву.
У цьому випадку кожен параметр може починатися з ‘meta_*’ і такий параметр має бути в першому масиві:
$meta_query = array(
'relation' => 'OR',
'meta_key' => 'ключ',
'meta_value' => 'значення',
'meta_type' => 'CHAR',
'meta_compare' => '!=',
// Тут може бути ще один вкладений масив властивостей
array(
'key' => 'ключ',
'value' => 'значення',
)
);
$mq = New WP_Meta_Query();
$mq->parse_query_vars( $meta_query );
Отримання SQL запиту
Після того, як параметри передані, SQL запит можна отримати за допомогою методу get_sql():
$mq_sql = $mq->get_sql( $type, $primary_table, $primary_id_column, $context );
-
$type
(рядок) (обов’язковий) -
Тип метаданих. Наприклад: ‘user’, ‘post’, ‘comment’.
В об’єкті
$wpdb має бути зареєстрована таблиця з назвою:
$type .'meta'
наприклад, якщо ми вкажемо тут ‘foo’, то має існувати таблиця
$wpdb->foometa . Якщо такої таблиці немає, цей клас працювати не буде! -
$primary_table
(рядок) (обов’язковий) -
Назва основної таблиці, до якої належить таблиця метаданих. Наприклад
wp_posts ,
wp_comments ,
wp_users . -
$primary_id_column
(рядок) (обов’язковий) -
Назва ключової стовпчика основної таблиці, вказаної в
$primary_table . Для
wp_posts –
ID , для
wp_users –
ID , для
wp_comments –
comment_ID . -
$context
(об’єкт) -
Об’єкт основного запиту. Цей параметр ніде не використовується, а передається у фільтр
get_meta_sql .
Типово: null
Якщо з якихось причин функція не змогла створити правильний запит, вона поверне false.
В інших випадках повернеться масив такого виду:
array(
'join' => 'JOIN SQL рядок',
'where' => 'WHERE SQL рядок'
)
Приклади
#1 Демонстрація використання
$meta_query = array(
'relation' => 'OR', // необов'язково, за умовчанням 'AND'
array(
'key' => 'key_name',
'value' => 'значення поля',
'compare' => '=' // не обов'язково, за умовчанням '=' або 'IN' (якщо value масив)
)
);
$query_obj = новий WP_Meta_Query( $meta_query );
$mq_sql = $query_obj->get_sql( 'post', 'wp_posts', 'ID' );
// використовуємо в основному запит
$mq_sql['join'];
$mq_sql['where'];
У результаті $mq_sql міститиме:
Array
(
[join] => INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
[where] => AND (
( wp_postmeta.meta_key = 'key_name' AND CAST(wp_postmeta.meta_value AS CHAR) = 'значення поля' )
)
)
#2 Запит з одновимірним масивом $meta_query
$meta_query можна вказувати дані запиту не як вкладений масив, а відразу в поточному масиві. Такі дані треба передувати ‘meta_*’ і передавати їх потрібно метод parse_query_vars( $meta_query ); :
Цей приклад створить запит лише з урахуванням ключа. Якщо потрібен повний запит, додайте meta_value і meta_compare:
Global $wpdb;
$meta_query = array(
'meta_key' => 'some_key_name',
);
$mq_obj = новий WP_Meta_Query();
$mq_obj->parse_query_vars( $meta_query );
$mq_sql = $mq_obj->get_sql( 'post', $wpdb->posts, 'ID' );
$mq_sql міститиме:
Array (
[join] => INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
[where] => AND ( wp_postmeta.meta_key = 'some_key_name' )
)
#3 Складний запит із багатовимірним масивом $meta_query
Цей приклад показує як WP_Meta_Query обробляє змінну ‘meta_query’, яка вказана у загальних параметрах масиву та містить дані мета запитів.
$ args = array (
'post_type' => 'mypost',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'foo_key',
'value' => 'foo',
'compare' => 'LIKE',
),
array(
'key' => 'bar_key',
),
)
);
$meta_query = новий WP_Meta_Query();
$meta_query->parse_query_vars( $args );
$mq_sql = $meta_query->get_sql( 'post', $wpdb->posts, 'ID' );
У результаті $mq_sql міститиме:
Array(
[join] => INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
[where] => AND (
( wp_postmeta.meta_key = 'foo_key' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%foo%' )
OR
wp_postmeta.meta_key = 'bar_key'
)
)
#4 Складний багаторівневий запит
Окрім вкладених масивів, можна задавати і дві вкладеності, змінюючи оператор relation, тим самим впливаючи на залежність умов.
Наприклад, нам потрібно отримати мішки серого
кольору, вагою 200
кг, в яких знаходиться бетон
або матеріал не вказаний:
$args = [
'post_type' => 'mypost',
'meta_query' => array(
'relation' => 'AND', // це за умовчанням - тут для наочності...
array(
'relation' => 'OR',
array(
'key' => 'material',
'value' => 'бетон',
),
array(
'key' => 'material',
'compare' => 'NOT EXISTS'
),
),
array(
'key' => 'color',
'value' => 'сірий',
),
array(
'key' => 'weight',
'value' => '200',
),
)
];
$meta_query = новий WP_Meta_Query();
$meta_query->parse_query_vars( $args );
$mq_sql = $meta_query->get_sql( 'post', $wpdb->posts, 'ID' );
$mq_sql міститиме:
Array
(
[join] => LEFT JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'material' )
LEFT JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id)
LEFT JOIN wp_postmeta AS mt3 ON (wp_posts.ID = mt3.post_id)
[where] => AND (
(
( wp_postmeta.meta_key = 'material' AND wp_postmeta.meta_value = 'бетон' )
OR
mt1.post_id IS NULL
)
AND
( mt2.meta_key = 'color' AND mt2.meta_value = 'сірий' )
AND
( mt3.meta_key = 'weight' AND mt3.meta_value = '200' )
)
)
#5 Ще приклади
Можна переглянути в описі параметра meta_query у WP_Query.
Властивості класу
-
$queries
(масив) -
Містить параметри запиту
$meta_query . Опис параметрів
$meta_query . -
$relation
(рядок) - Зв’язок між кількома вказаними параметрами запитів. Можливо ‘AND’ або ‘OR’.
-
$meta_table
(рядок) - Назва таблиці метаданих. Наприклад: wp_postmeta.
-
$meta_id_column
(рядок) -
Назва ключової колонки – мета таблиці, вказаної в
$meta_table . Пр. meta_id чи umeta_id (users). -
$primary_table
(рядок) - Назва основної таблиці, до якої належить таблиця метаданих. Наприклад, wp_posts, wp_comments, wp_users.
-
$primary_id_column
(рядок) -
Назва ключової стовпчика основної таблиці, вказаної в
$primary_table . Для wp_posts – ID, для wp_users – ID, для wp_comments – comment_ID. -
$table_aliases
(масив) (protected) - Службова властивість. Список альтернативних назв таблиць, що використовуються в JOIN.
-
$clauses
(масив) (protected) - Службова властивість. Список окремих елементів запиту. У ключі вказується ‘name’.
-
$has_or_relation
(логічний) (protected) -
Службова властивість. Чи містить запит хоч одну OR зв’язок.
Типово: false
Методи класу
- __construct( $meta_query = false )
-
Конструктор.
Повертає: нічого - sanitize_query( $queries )
-
Перевіряє параметри ‘meta_query’. Виправляє якщо потрібно: прибирає порожні значення у перевіряє що параметр ‘relation’ встановлений.
Повертає чистий масив параметрів. -
is_first_order_clause( $query )
(protected) -
Перевіряє, чи встановлений у параметрах запит першим мета запитом. Першим вважається будь-яка перша група параметрів із ключем key або value. $query передаються
параметри.
Повертає: true/false - parse_query_vars( $qv )
-
Виправляє параметри стандартних на основі переданих
meta_* параметрів.
$qv – масив параметрів запиту.
Повертає: нічого - get_cast_for_type( $type = ” )
-
Отримує відповідний альт. назву для переданого типу, якщо є.
$type – рядок тип який потрібно перекласти value.
Повертає: рядок, MySQL тип - get_sql( $type, $primary_table, $primary_id_column, $context = null )
-
Створює частини SQL запиту на основі встановлених параметрів, які потрібно додати до основного запиту. Це основна функція, яка повертає результати роботи всього класу. Опис параметрів див. під шаблоном використання.
Повертає: false/масив. Масив містить JOIN та WHERE частини для використання у SQL запиті. Пр: array( join => рядок, where => рядок ) -
get_sql_clauses()
(protected) -
Службовий метод. Генерує частини SQL запиту. Використовується у методі
get_sql() .
Повертає: масив: array( join => рядок, where => рядок ) -
get_sql_for_query( & $query, $depth = 0 )
(protected) -
Службовий метод. Генерує частини для окремого запиту SQL. Якщо зазначені запити, цей метод рекурсивно обробить кожен із них.
$query – запит, який потрібно обробити.
$depth – рівень вкладеності, на якому зараз перебуваємо.
Повертає: масив: array( join => рядок, where => рядок ) - get_sql_for_clause( & $clause, $parent_query, $clause_key = ” )
-
Створює SQL JOIN та WHERE частини запиту для першого умови запиту.
Повертає: масив: array( join => рядок, where => рядок ) - get_clauses()
-
Повертає властивість
$clauses .
Повертає: масив мета частин запиту. -
find_compatible_table_alias( $clause, $parent_query )
(protected) -
Службовий метод. Визначає аліас таблиці, що відноситься до
$clause .
Повертає: рядок/false - has_or_relation()
-
Повертає властивість
has_or_relation() ;
Повертає: true/false
список змін
З версії 3.2.0 | Введено. |