Использование get_terms() с параметрами meta_query

2 июл. 2016 г., 13:35:56
Просмотры: 34.8K
Голосов: 2

Я пытаюсь создать запрос таксономии, чтобы отображать только термины, которым присвоено определенное значение произвольного поля. Произвольное поле содержит логическое значение, поэтому я попробовал:

$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'   => '='
             )
        )
    );

Ни один из этих вариантов не дал ожидаемых результатов. Что я упускаю?

0
Все ответы на вопрос 1
5
12

Вставка булевых значений метаданных терминов

Когда мы добавляем несуществующие метаданные термина с помощью, например:

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' (строка).

2 июл. 2016 г. 18:35:41
Комментарии

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

Luis Martins Luis Martins
4 июл. 2016 г. 22:07:12

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

birgire birgire
5 июл. 2016 г. 12:17:44

Есть ли прогресс в решении проблемы? @LuisMartins

birgire birgire
23 июл. 2016 г. 16:11:46

Извините, я полностью пропустил уведомления от SO.

Luis Martins Luis Martins
13 авг. 2016 г. 16:04:54

Без проблем, просто было интересно ;-) @LuisMartins

birgire birgire
13 авг. 2016 г. 16:07:24