Tax_query с ID терминов используя переменную
Я хочу создать пользовательский 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?
Похоже, вы создаёте массив с одной строкой внутри.
Попробуйте преобразовать $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 );
Надеюсь, это поможет!

Потому что в 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);

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

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