Tax_query con IDs de términos usando variables
Quiero hacer una WP_Query personalizada usando IDs de términos de taxonomía personalizada.
Ejemplo de IDs de términos: 19,18,214,226,20
¿Por qué esto funciona?:
$query_args = array (
'post_type' => 'works',
'tax_query' => array(
array(
'taxonomy' => 'materials',
'field' => 'term_id',
'terms' => array( 19,18,214,226,20 ),
)
),
);
Muestra todos los elementos de todos los IDs de términos de taxonomía,
Pero esto no:
$tax = '19,18,214,226,20';
$query_args = array (
'post_type' => 'works',
'tax_query' => array(
array(
'taxonomy' => 'materials',
'field' => 'term_id',
'terms' => array( $tax ),
)
),
);
Usando la variable $tax
el resultado de la consulta solo muestra elementos del primer ID de término (19), e ignora todos los demás.
¿Por qué sucede esto y cómo puedo usar la variable en tax_query en lugar de codificar los IDs directamente?
La solución es convertir la cadena en un array usando explode():
$tax = '19,18,214,226,20';
$tax_array = explode(',', $tax);
$query_args = array (
'post_type' => 'works',
'tax_query' => array(
array(
'taxonomy' => 'materials',
'field' => 'term_id',
'terms' => $tax_array,
)
),
);
Parece que estás creando un array con una sola cadena dentro.
Verifica si convertir $tax en un array antes de pasarlo funciona:
$tax = array( 19, 18, 214, 226, 20 );
$query_args = array (
'post_type' => 'works',
'tax_query' => array(
array(
'taxonomy' => 'materials',
'field' => 'term_id',
'terms' => $tax,
)
),
);
Si necesitas crear un array a partir de una cadena formateada, puedes usar la función PHP explode
que toma un delimitador y una cadena, y devuelve un array, así:
$tax_string = '19,18,214,226,20';
$tax_array = explode( ',', $tax_string );
¡Espero que funcione!

Porque en PHP, $tax = '19,18,214,226,20';
es una cadena de texto. Y no puedes envolver una cadena dentro de array()
y crear un array :)
Podrías necesitar algo como:
function comma_separated_to_array($string, $separator = ',')
{
//Separar por comas
$vals = explode($separator, $string);
//Recortar espacios en blanco
foreach($vals as $key => $val) {
$vals[$key] = trim($val);
}
//Retornar array vacío si no se encontraron elementos
//http://php.net/manual/en/function.explode.php#114273
return array_diff($vals, array(""));
}
y usarlo como
$terms= comma_separated_to_array($tax);

Excelente función para separar valores separados por comas en un array, pero excesiva para la pregunta anterior.

Gracias. 4 líneas de código de menos de 30 caracteres cada una no es excesivo, creo :)
