Obtener get_posts asignados a un término específico de taxonomía personalizada, y no a los términos hijos
Digamos que tengo los siguientes términos de taxonomía:
Término 1
Término 1.1
Término 1.2
Término 2
Término 2.1
¿Cómo puedo obtener solo las entradas que están asignadas al Término 1 y no incluir aquellas que están asignadas al Término 1.1 o Término 1.2?
Por ejemplo:
$pages = get_posts(array(
'post_type' => 'page',
'numberposts' => -1,
'tax_query' => array(
array(
'taxonomy' => 'taxonomy-name',
'field' => 'id',
'terms' => 1 // Donde term_id del Término 1 es "1".
)
)
);
también me está devolviendo entradas que tienen asignados los Términos 1.1 y 1.2.
Gracias.

Al examinar la clase WP_Tax_Query en /wp-includes/taxonomy.php, descubrí que existe una opción 'include_children' que por defecto es verdadera (true). Modifiqué mi llamada original a get_posts() con lo siguiente, y funciona perfectamente:
$pages = get_posts(array(
'post_type' => 'page',
'numberposts' => -1,
'tax_query' => array(
array(
'taxonomy' => 'taxonomy-name',
'field' => 'term_id',
'terms' => 1, /// Donde term_id del Término 1 es "1".
'include_children' => false
)
)
));
Lista de más parámetros de consulta: https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters

Según la lectura de la página del Codex enlazada, creo que el valor de 'field' en el array tax_query debería ser 'term_id' en lugar de 'id': "Los valores posibles son 'term_id', 'name' y 'slug'. El valor por defecto es 'term_id'." Supongo que 'id' funciona solo porque provoca un fallback al valor por defecto.

me topé con esto el otro día:
$tax = 'music';
$oterm = 'pop';
$term = get_term_by('slug', $oterm, $tax);
$termChildren = get_term_children($term->term_id, $tax);
$wp_query = new WP_Query();
$wp_query->query(
array(
'posts_per_page' => '5',
'tax_query' => array(
array(
'taxonomy' => $tax,
'field' => 'slug',
'terms' => $oterm
),
array(
'taxonomy' => $tax,
'field' => 'id',
'terms' => $termChildren,
'operator' => 'NOT IN'
)
)
)
);

Aquí está el código completo, espero que te ayude. Gracias
<?php
$terms_array = array(
'taxonomy' => 'services', // puedes cambiarlo según tu taxonomía
'parent' => 0 // Si parent => 0, solo se devolverán los términos de nivel superior
);
$services_terms = get_terms($terms_array);
foreach($services_terms as $service): ?>
<h4><?php echo $service->name; ?></h4>
<?php
$post_args = array(
'posts_per_page' => -1,
'post_type' => 'service', // puedes cambiarlo según tu tipo de post personalizado
'tax_query' => array(
array(
'taxonomy' => 'services', // puedes cambiarlo según tu taxonomía
'field' => 'term_id', // puede ser 'term_id', 'slug' o 'name'
'terms' => $service->term_id,
)
)
);
$myposts = get_posts($post_args); ?>
<ul>
<?php foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endforeach; // Fin del foreach de posts del término ?>
</ul>
<?php wp_reset_postdata(); ?>
<?php endforeach; // Fin del foreach de términos; ?>
