Usar get_term_children para obtener la subcategoría de una categoría padre para el post actual
En mi tema de WooCommerce he creado una categoría raíz: 'Marcas' y luego para cada producto he añadido su marca como una subcategoría de la categoría padre 'Marcas'.
En la página del producto quiero mostrar la marca del producto actual.
global $post;
// Obtener el ID de marcas desde el slug
$brands_id = get_term_by('slug', 'brands', 'product_cat');
// Obtener los hijos de ese término
$termchildren = get_term_children( $brands_id, 'product_cat' );
// Recorrer los hijos del término 'marca' para mostrar el nombre de la marca
foreach ( $termchildren as $child ) {
$term = get_term_by( 'id', $child, 'product_cat' );
echo '<a href="' . get_term_link( $child, 'product_cat' ) . '">' . $term->name . '</a>';
}
Esto siempre muestra todas las marcas. ¿Cómo puedo tomar esta información y filtrar las marcas no asociadas al producto actual?

No necesitas get_term_children()
en absoluto. Simplemente recorre get_the_terms()
para obtener lo que necesitas.
global $post;
$brands_id = get_term_by('slug', 'brands', 'product_cat');
$terms = get_the_terms($post->ID, 'product_cat');
foreach ($terms as $term) {
if($term->parent === $brands_id->term_id) {
echo $term->name;
break;
}
}

// Obtener el ID del término por su slug 'brands' en la taxonomía 'product_cat'
$term_id = get_term_by( 'slug', 'brands', 'product_cat' );
// Nombre de la taxonomía
$taxonomy_name = 'product_cat';
// Obtener los términos hijos del término principal
$termchildren = get_term_children( $term_id, $taxonomy_name );
// Mostrar lista HTML no ordenada
echo '<ul>';
// Recorrer cada término hijo
foreach ( $termchildren as $child ) {
// Obtener el objeto del término por su ID
$term = get_term_by( 'id', $child, $taxonomy_name );
// Mostrar cada término como elemento de lista con enlace
echo '<li><a href="' . get_term_link( $child, $taxonomy_name ) . '">' . $term->name . '</a></li>';
}
echo '</ul>';

Primero que nada, ya había hecho esta misma pregunta aquí y obtuve la respuesta por mí mismo :)
Aquí está cómo deberías hacerlo:
$taxonomies = array(
'brands'
);
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'fields' => 'all',
'parent' => '(parentID)',
'hierarchical' => true,
'child_of' => 0
);
$terms = get_terms($taxonomies, $args);
var_dump($terms);
foreach ($terms as $term) {
print '<h2 class="story-heading">'.$term->name.'</h2>';
}
Si ya conoces el ID de la categoría padre, simplemente lo pasas como INT y dentro del ciclo foreach obtendrás todos los términos hijos (subcategorías) del padre. Además, si necesitas reutilizar esto, es decir, si deseas mostrar varias veces la misma consulta y obtener diferentes términos padre -> hijo
, recomendaría escribir una función y colocarla en el archivo functions.php. La función debería verse así:
function get_children_of_parent_terms($tax, $pid) {
$taxonomies = $tax;
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'fields' => 'all',
'parent' => $pid,
'hierarchical' => true,
'child_of' => 0
);
$terms = get_terms($taxonomies, $args);
var_dump($terms);
foreach ($terms as $term) {
print '<h2 class="story-heading">'.$term->name.'</h2>';
}
}
add_action('init','get_children_of_parent_terms');
Y luego, cuando quieras consultar los hijos del término padre (categoría), simplemente llamas a esta función con el nombre de la categoría padre de la taxonomía como $tax, y el ID del padre como $pid, por ejemplo echo get_children_of_parent_terms('brands','15');
y suponiendo que tienes la taxonomía brands y algún término padre con ID 15, esto mostrará todos los términos hijos del término con ID 15.
Saludos.
