Tax_query с ID терминов используя переменную

17 янв. 2017 г., 18:52:53
Просмотры: 45.7K
Голосов: 5

Я хочу создать пользовательский WP_Query, используя ID терминов пользовательской таксономии.

Пример ID терминов: 19,18,214,226,20

Почему это работает:

$query_args = array (
    'post_type' => 'works',
    'tax_query' => array(
        array(
            'taxonomy'  => 'materials',
            'field'     => 'term_id',
            'terms'     => array( 19,18,214,226,20 ),
        )
    ),
);

Этот код показывает все элементы из всех ID терминов таксономии,

Но это не работает:

$tax = '19,18,214,226,20';

$query_args = array (
    'post_type' => 'works',
    'tax_query' => array(
        array(
            'taxonomy'  => 'materials',
            'field'     => 'term_id',
            'terms'     => array( $tax ),
        )
    ),
);

При использовании переменной $tax результат запроса показывает элементы только первого ID термина (19) и игнорирует все остальные.

Почему это происходит и как я могу использовать переменную в tax_query вместо жестко закодированных ID?

0
Все ответы на вопрос 2
0
15

Похоже, вы создаёте массив с одной строкой внутри.

Попробуйте преобразовать $tax в массив перед передачей:

$tax = array( 19, 18, 214, 226, 20 );

$query_args = array (
    'post_type' => 'works',
    'tax_query' => array(
        array(
            'taxonomy'  => 'materials',
            'field'     => 'term_id',
            'terms'     => $tax,
        )
    ),
);

Если вам нужно создать массив из форматированной строки, используйте функцию PHP explode, которая принимает разделитель и строку, а возвращает массив:

$tax_string = '19,18,214,226,20';
$tax_array = explode( ',', $tax_string );

Надеюсь, это поможет!

17 янв. 2017 г. 19:06:12
3

Потому что в PHP $tax = '19,18,214,226,20'; является строкой. И вы не можете обернуть строку в array() и создать массив :)

Возможно, вам понадобится что-то вроде:

function comma_separated_to_array($string, $separator = ',')
{
  //Разделяем по запятой
  $vals = explode($separator, $string);

  //Удаляем лишние пробелы
  foreach($vals as $key => $val) {
    $vals[$key] = trim($val);
  }
  //Возвращаем пустой массив, если элементы не найдены
  //http://php.net/manual/ru/function.explode.php#114273
  return array_diff($vals, array(""));
}

И использовать это как

$terms= comma_separated_to_array($tax);
17 янв. 2017 г. 19:09:04
Комментарии

Отличная функция для разделения значений, разделенных запятыми, в массив, но избыточная для данного вопроса.

Tex0gen Tex0gen
17 янв. 2017 г. 19:46:06

Спасибо. 4 строки кода, каждая менее 30 символов, не считаю избыточными :)

codiiv codiiv
17 янв. 2017 г. 20:10:58

Или просто использовать $ids = explode(',', $tax);

Alexander Holsgrove Alexander Holsgrove
23 июн. 2020 г. 18:52:07