Использование get_terms() с параметрами meta_query
Я пытаюсь создать запрос таксономии, чтобы отображать только термины, которым присвоено определенное значение произвольного поля. Произвольное поле содержит логическое значение, поэтому я попробовал:
$args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'meta_key' => 'featured',
'meta_value' => true
);
Также:
$args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'meta_query' => array(
array(
'key' => 'featured',
'value' => true,
'compare' => '='
)
)
);
Ни один из этих вариантов не дал ожидаемых результатов. Что я упускаю?

Вставка булевых значений метаданных терминов
Когда мы добавляем несуществующие метаданные термина с помощью, например:
add_term_meta( 123, 'test', true );
фактически выполняется следующий INSERT-запрос:
$wpdb->insert( 'wp_termmeta', array(
'term_id' => 123,
'meta_key' => 'test',
'meta_value' => true
) );
в рамках общей функции add_metadata()
.
Метод wpdb::insert()
является обёрткой для wpdb::_insert_replace_helper()
,
которая подготавливает SQL-запрос на вставку и преобразует значения для вставки в:
INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)
или в нашем тестовом случае:
INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (123, 'test', '1')
Также обратите внимание, что столбец meta_value
в таблице wp_termmeta
имеет тип longtext.
Таким образом, булево значение true
сохраняется как строка '1'
.
Получение булевых значений метаданных терминов
Когда выполняется get_terms()
с подобным мета-запросом:
$args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'meta_query' => array(
array(
'key' => 'featured',
'value' => true,
'compare' => '='
)
)
);
генерируется SQL-запрос, содержащий:
wp_termmeta.meta_key = 'featured' AND wp_termmeta.meta_value = '1'
где true
(булево) преобразуется в '1'
(строка).

Я до сих пор не могу заставить запрос возвращать какие-либо результаты, используя строку "1"
в качестве значения, передаваемого в meta_query, но я продолжу искать. Большое спасибо за подробное объяснение.

Мета-значение true
в запросе get_terms()
также изменено на '1'
, так что, думаю, вы должны сохранять мета-значения терминов по-другому. Как вы их сохраняете? Какой код используете? Возможно, вы сохраняете его как строку-булево значение 'true'
? @LuisMartins
