Obtener solo términos padres desde wp_get_post_terms
Tengo un tipo de contenido personalizado que tiene taxonomías jerárquicas configuradas. Por ejemplo, mi tipo de contenido "proyecto" tiene categorías de:
A
A.1
B
C
Estoy intentando mostrar las taxonomías como clases en elementos <li>
para cada publicación, pero solo quiero que se muestren los niveles superiores (padres). Para la publicación que estoy viendo, está categorizada como A.1 y C, pero me gustaría que devolviera A y C.
Estoy usando 'parent' => 0
en los argumentos, sin embargo me está devolviendo A.1 y C. También he intentado usar 'hide_empty' => 0
pero eso no parece ayudar.
Aquí está mi código:
function project_get_item_classes($post_id = null) {
if ($post_id === null)
return;
$_terms = wp_get_post_terms($post_id, 'construction_type', array( 'parent' => 0, 'hide_empty' => 0 ));
foreach ($_terms as $_term) {
echo " " . $_term->slug;
}
}
wp_get_post_terms
no acepta los parámetros 'parent'
o 'hide_empty'
en su array de argumentos, solo 'orderby'
, 'order'
y 'fields'
, pero vas por buen camino. Simplemente añade una verificación condicional antes de mostrar el slug:
function project_get_item_classes($post_id = null) {
if ($post_id === null)
return;
$_terms = wp_get_post_terms($post_id, 'construction_type');
foreach ($_terms as $_term) {
if ($_term->parent == 0) //verificar solo términos padre
echo " " . $_term->slug;
}
}

Gracias, tenía los argumentos confundidos con otra función. Ahora, el único problema es que la categoría padre no se está aplicando a la hija. Es decir, la categoría A debería aplicarse a una publicación para la categoría A.1. Antes de este fragmento, la categoría A.1 se aplicaba, pero ahora simplemente está en blanco.

Gracias a la ayuda de @Bainternet (aquí, y también su aporte que condujo a la respuesta en esta pregunta), pude armar el código.
// determinar el padre superior de un término
function get_term_top_most_parent($term_id, $taxonomy){
// comenzar desde el término actual
$parent = get_term_by( 'id', $term_id, $taxonomy);
// ascender en la jerarquía hasta llegar a un término con padre = '0'
while ($parent->parent != '0'){
$term_id = $parent->parent;
$parent = get_term_by( 'id', $term_id, $taxonomy);
}
return $parent;
}
// una vez que tienes esta función, puedes iterar sobre los resultados devueltos por wp_get_object_terms
function project_get_item_classes($taxonomy, $results = 1) {
// obtener términos para el post actual
$terms = wp_get_object_terms( get_the_ID(), 'work_type' );
// establecer variables
$top_parent_terms = array();
foreach ( $terms as $term ) {
// obtener el padre superior
$top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
// verificar si ya está en el array para agregarlo solo una vez
if ( !in_array( $top_parent, $top_parent_terms ) ) {
$top_parent_terms[] = $top_parent;
}
}
// construir la salida (el HTML depende de ti)
foreach ( $top_parent_terms as $term ) {
echo " " . $term->slug;
}
}
