Функция get_meta_sql()
в WordPress позволяет создать SQL-фрагменты JOIN
и WHERE
на основе параметров метазапроса. Это удобно для объединения метаданных с основным запросом и создания сложных условий поиска.
get_meta_sql( array $meta_query, string $type, string $primary_table, string $primary_id_column, object $context = null ): array|string|false
Функция возвращает массив с SQL-частями для соединения таблиц и условий фильтрации либо false
, если таблица для указанного типа метаданных не существует.
Параметры
$meta_query
(array) — Массив с параметрами метазапроса (аналогWP_Meta_Query
).$type
(string) — Тип метаданных. Может быть, например,'post'
,'user'
,'comment'
и т.д.$primary_table
(string) — Основная таблица, к которой присоединяется таблица метаданных, напримерwp_posts
.$primary_id_column
(string) — Основная колонка с ID, напримерID
дляwp_posts
.$context
(object) (необязательно) — Объект основного запроса, чаще всего этоWP_Query
или его аналог.
Возвращаемое значение
- array|string|false — Ассоциативный массив с ключами
join
иwhere
, содержащими SQL-фрагменты для использования в основном запросе, илиfalse
, если таблицы для указанного типа метаданных не существует.
Создание SQL для фильтрации по метаполям
В этом примере создается запрос для поиска записей, где метаполе 'color'
не содержит значение 'blue'
.
<?php
$meta_query = [
[
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE',
]
];
global $wpdb;
$meta_sql = get_meta_sql($meta_query, 'post', $wpdb->posts, 'ID');
print_r($meta_sql);
Результат:
Array
(
[join] => INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
[where] => AND ( (wp_postmeta.meta_key = 'color' AND CAST(wp_postmeta.meta_value AS CHAR) NOT LIKE '%blue%') )
)
Фильтрация записей по нескольким метаполям
Здесь создается запрос для записей, у которых метаполе 'status'
равно 'active'
и 'priority'
больше 3.
<?php
$meta_query = [
[
'key' => 'status',
'value' => 'active',
'compare' => '='
],
[
'key' => 'priority',
'value' => 3,
'compare' => '>'
]
];
$meta_sql = get_meta_sql($meta_query, 'post', 'wp_posts', 'ID');
print_r($meta_sql);
Результат:
Array
(
[join] => INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
[where] => AND (
(wp_postmeta.meta_key = 'status' AND CAST(wp_postmeta.meta_value AS CHAR) = 'active')
AND
(wp_postmeta.meta_key = 'priority' AND CAST(wp_postmeta.meta_value AS CHAR) > 3)
)
)
Использование метазапроса для комментариев
В этом примере создается SQL-фрагмент для фильтрации комментариев с метаполем 'liked'
со значением true
.
<?php
$meta_query = [
[
'key' => 'liked',
'value' => 'true',
'compare' => '='
]
];
global $wpdb;
$meta_sql = get_meta_sql($meta_query, 'comment', $wpdb->comments, 'comment_ID');
print_r($meta_sql);
Результат:
Array
(
[join] => INNER JOIN wp_commentmeta ON (wp_comments.comment_ID = wp_commentmeta.comment_id)
[where] => AND ( (wp_commentmeta.meta_key = 'liked' AND CAST(wp_commentmeta.meta_value AS CHAR) = 'true') )
)
Фильтрация пользователей по нескольким критериям
Пример использования get_meta_sql()
для фильтрации пользователей с user_status
равным 'active'
и access_level
больше 2.
<?php
$meta_query = [
[
'key' => 'user_status',
'value' => 'active',
'compare' => '='
],
[
'key' => 'access_level',
'value' => 2,
'compare' => '>'
]
];
global $wpdb;
$meta_sql = get_meta_sql($meta_query, 'user', $wpdb->users, 'ID');
print_r($meta_sql);
Результат:
Array
(
[join] => INNER JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id)
[where] => AND (
(wp_usermeta.meta_key = 'user_status' AND CAST(wp_usermeta.meta_value AS CHAR) = 'active')
AND
(wp_usermeta.meta_key = 'access_level' AND CAST(wp_usermeta.meta_value AS CHAR) > 2)
)
)
Заключение
Функция get_meta_sql()
удобна для динамического создания сложных условий поиска в запросах WordPress. Это упрощает работу с метаданными, особенно при необходимости фильтровать результаты по нескольким метаполям.