Usar get_term_children para obtener la subcategoría de una categoría padre para el post actual

20 abr 2014, 11:13:59
Vistas: 16.9K
Votos: 1

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?

4
Comentarios

¿Por qué asumes que debería filtrar así? No recuerdo que los args acepten term_id ahí.

Rarst Rarst
20 abr 2014 15:56:03

Sí, parece que tienes razón, me estaba confundiendo con el array de retorno

tommyf tommyf
20 abr 2014 16:32:39

¿Entonces resuelto? :) O por favor actualiza tu pregunta.

Rarst Rarst
20 abr 2014 17:36:01

Pregunta actualizada.

tommyf tommyf
20 abr 2014 22:30:45
Todas las respuestas a la pregunta 3
0

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;
    }
}
21 abr 2014 08:28:38
0
// 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>';
21 abr 2014 08:43:45
0

Primero que nada, ya había hecho esta misma pregunta aquí y obtuve la respuesta por mí mismo :)

https://wordpress.stackexchange.com/questions/188839/wordpress-tags-and-hierarchy-parent-child-relation

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.

23 may 2015 12:14:48