Tax_query con IDs de términos usando variables

17 ene 2017, 18:52:53
Vistas: 45.7K
Votos: 5

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,
        )
    ),
);
0
Todas las respuestas a la pregunta 2
0
15

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!

17 ene 2017 19:06:12
3

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);
17 ene 2017 19:09:04
Comentarios

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

Tex0gen Tex0gen
17 ene 2017 19:46:06

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

codiiv codiiv
17 ene 2017 20:10:58

O simplemente usa $ids = explode(',', $tax);

Alexander Holsgrove Alexander Holsgrove
23 jun 2020 18:52:07