Obtener categorías hijas de productos desde la categoría padre en WooCommerce

19 mar 2020, 19:46:37
Vistas: 14.4K
Votos: 1

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?

0
Todas las respuestas a la pregunta 1
9

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...

19 mar 2020 20:10:13
Comentarios

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?

Jeroen_L Jeroen_L
19 mar 2020 22:42:37

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 Jeroen_L
19 mar 2020 22:49:33

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

LoicTheAztec LoicTheAztec
19 mar 2020 23:01:18

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 Jeroen_L
20 mar 2020 00:11:30

@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...

LoicTheAztec LoicTheAztec
20 mar 2020 00:37:44

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 Jeroen_L
20 mar 2020 00:55:41

@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...

LoicTheAztec LoicTheAztec
20 mar 2020 07:44:35

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?

Jeroen_L Jeroen_L
20 mar 2020 12:13:07

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.

Jeroen_L Jeroen_L
20 mar 2020 16:08:15
Mostrar los 4 comentarios restantes