Obtener categorías hijas de productos desde la categoría padre en WooCommerce
En WooCommerce, estoy intentando obtener todos los términos de categorías hijas de productos desde el ID del término padre de la categoría actual del producto con el siguiente código:
$category = get_queried_object();
$category_parent_id = $category->parent;
$category_test = get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );
La variable $category_parent_id
retorna el ID de la categoría padre del producto y $category_test
retorna todos los términos de categorías de productos.
Estoy intentando retornar todas las categorías hijas de productos usando el ID del término de la categoría padre obtenido de $category->parent
Lógicamente intenté:
$category_test = $category_parent_id->get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );
y
$category_test = $category->parent->get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );
Pero esto no me devolvió todas las categorías hijas de la categoría padre actual. ¿Alguien tiene alguna idea de si y cómo se puede lograr esto?

Editado (1)
Necesitarás usar 'child_of'
de los argumentos disponibles en WP_Term_Query
, lo que te permitirá obtener todos los términos hijos para el término padre de la categoría de producto actual:
// Solo en páginas de archivo de categorías de producto
if( is_product_category() ) {
$main_term = get_queried_object();
$args_query = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'child_of' => $main_term->parent
);
if ( $main_term->parent != 0 ) {
// Recorrer objetos WP_Term
foreach ( get_terms( $args_query ) as $term ) {
if( $term->term_id != $main_term->term_id ) {
// $term->slug; // Slug
// Mostrar cada nombre de término (enlazado)…
echo sprintf( '<a href="%s">%s</a></br>', get_term_link( $term->term_id, 'product_cat' ), $term->name );
}
}
}
}
O también puedes usar get_term_children()
así:
// Solo en páginas de archivo de categorías de producto
if( is_product_category() ) {
$main_term = get_queried_object();
$taxonomy = 'product_cat';
if ( $main_term->parent != 0 ) {
$child_ids = get_term_children( $main_term->parent, $taxonomy );
echo '<ul>';
foreach ( $child_ids as $child_id ) {
if( $child_id != $main_term->term_id ) {
$term = get_term_by( 'id', $child_id, $taxonomy );
echo '<li><a href="' . get_term_link( $child_id, $taxonomy ) . '">' . $term->name . '</a></li>';
}
}
echo '</ul>';
}
}
Esto es solo para páginas de archivo de categorías de producto, ya que para páginas de productos puedes tener múltiples categorías de producto asignadas y el código sería más complicado y bastante diferente...

Esto efectivamente proporciona todos los datos brutos deseados como salida. ¿Alguna idea sobre cómo mostrar solo el nombre y/o el slug, por ejemplo?

Recién acepté, si pudieras encontrar el tiempo para explicar cómo mostrar solo el nombre y/o el slug en lugar de los datos brutos, me ahorrarías horas de búsqueda. Si no, gracias de todos modos :)

@Jeroen_L He actualizado mi código para mostrar el nombre y/o el slug...

Acabo de notar que no toma el padre si está en una página de producto. Y también captura padres de padres y los hijos de esos padres... ¿alguna idea? Compartiré mi nuevo código en la próxima publicación si estás interesado.

@Jeroen_L He editado mi respuesta con otro código... Ahora en la página de producto esto es completamente diferente ya que un producto puede tener muchas categorías de producto...

Tendré que verificarlo pero se está haciendo tarde, ¿qué pasa si en la página de producto (is_product) también funcionará? Lo revisaré mañana, gracias hasta ahora.

@Jeroen_L El código solo maneja páginas de archivo de categorías de productos, ya que puedes tener muchas categorías de productos configuradas para un producto... Así que sería algo muy diferente y más complicado manejar páginas de productos y deberías hacer una nueva pregunta para manejar páginas de productos...

Casi...
Las primeras pruebas muestran que ahora solo sube 1 nivel, pero si alguno de los hermanos dentro de ese nivel tiene subcategorías, entonces esas subcategorías también se muestran.
En realidad hace esto ahora: sube 1 nivel (categoría padre), toma todas las categorías allí (que es lo que necesito), pero si alguna de esas categorías tiene subcategorías, estas también se incluirán.
Así que ahora sube +1 para llegar a la categoría padre y seguirá bajando -1 mientras sea posible, ¿cómo podemos evitar que haga el -1?
Para las páginas de Productos, ¿sería más fácil si los productos están restringidos a 1 categoría asociada?

Logré resolver el problema de capturar subcategorías como primas al pasar el ID de la categoría padre y combinar otras soluciones. Actualizaré mi propia respuesta con el nuevo código. Todo lo que queda ahora es cómo obtener la lista en la página de producto si conocemos el ID de la categoría padre.
