WooCommerce - Mostrar subcategorías de productos de un padre específico

4 oct 2013, 15:37:20
Vistas: 15.2K
Votos: 0

Quiero editar el siguiente fragmento de código:

<?php if ( (!$theretailer_theme_options['category_listing']) || ($theretailer_theme_options['category_listing'] == 0) ) { ?>
        <!-- Mostrar solo la primera categoría -->
        <?php $gbtr_product_cats = strip_tags($product->get_categories('|||', '', '')); //Categorías sin enlaces separadas por ||| ?>
        <h3><a href="<?php the_permalink(); ?>"><?php list($firstpart) = explode('|||', $gbtr_product_cats); echo $firstpart; ?></a></h3>
        <?php } ?>

Ejemplo: http://tjwillems.nl/priveekollektie/product-category/artists/reinier-bosch/

El título rojo debajo de la imagen del producto solo debe mostrar las subcategorías de 'artist'. Por ejemplo, solo 'Reinier Bosch' y no 'Lighting'.

¿Alguien puede ayudarme?

Saludos, Tom

0
Todas las respuestas a la pregunta 3
4

La función de WooCommerce get_categories() está declarada en abstract-wc-product.php, dado que está basada en la función de WordPress get_the_term_list(), no hay forma de obtener solo una rama específica de una categoría. Esto definitivamente no es lo mismo que la función de WordPress get_categories(), puedes notar que es específica de WooCommerce por cómo se usa $product->get_categories(). Además de las diferencias obvias en los argumentos que puedes usar, por supuesto, puedes profundizar en ello leyendo y comparando la información enlazada.


Ejemplo de árbol de taxonomía de categorías:

product_cat
    |
    |––cat1  
    |   |––child1.1  
    |   |––child1.2  
    |   |––child1.3  
    |
    |––cat2  
        |––child2.1  
        |––child2.2  
        |––child2.3  


En tu caso, las ramas serían »artist« y »art«, en lugar de »cat1« y »cat2«. El objetivo es obtener solo la rama de categoría relevante para el título que deseas mostrar. Al menos esto es lo que el código a continuación logrará.

Como mencioné anteriormente, si deseas obtener solo los términos de una rama específica de una categoría/taxonomía, tienes que hacerlo de otra manera. Debes hacer uso de get_terms() y wp_get_post_terms() y luego intersectar los resultados.

//categoría de producto de WooCommerce
$taxonomies = array( 'product_cat' );

//obtengamos un array con los IDs de todos los términos que tiene un post  
$post_tids = wp_get_post_terms($post->ID, 'product_cat', array("fields" => "ids"));

//debes cambiar el ID del padre de la rama según corresponda
$id_branch_parent = '111';
$args = array(
    'fields' => 'ids',
    'child_of' => $id_branch_parent
);
//obtengamos un array con los IDs de todos los términos que tiene la rama  
$branch_tids = get_terms( $taxonomies, $args );

//intersectamos los términos del post y la rama para obtener un array de IDs comunes
$pnb_tids = array_intersect($post_tids, $branch_tids);

//en caso de múltiples IDs, debemos recorrerlos
foreach ( $pnb_tids as $tid ) {
    //obtenemos la información del término por ID
    $tobj = get_term_by('id', $tid, 'product_cat');
    //almacenamos los nombres de los términos en un array
    $pnb_name_arr[] = $tobj->name;
}

//unimos el array de nombres, este es el resultado que deseas mostrar
$pnb_term_list = implode(' – ', $pnb_name_arr);

Esto debería darte el resultado que deseas, pero no ha sido probado.

4 oct 2013 18:36:31
Comentarios

¡Gracias por tu respuesta! Creo que necesita un pequeño ajuste antes de que funcione... Ahora tengo este error fatal... PHP no es mi especialidad :-(

Fatal error: Cannot use object of type stdClass as array in /var/www/vhosts/tjwillems.nl/httpdocs/priveekollektie/wp-content/themes/priveekollektie/woocommerce/content-product.php on line 111

Esta línea de código está en la línea 111 $pnb_name_arr[] = $tobj['name'];

tjwillems tjwillems
5 oct 2013 01:46:24

@tjwillems: Cambié el código/línea

Nicolai Grossherr Nicolai Grossherr
5 oct 2013 12:21:42

@tjwillems ¡Cuando quieras! Si es una respuesta correcta, márcala con una palomita, para que todos los que lleguen a la pregunta después lo sepan.

Nicolai Grossherr Nicolai Grossherr
8 oct 2013 17:29:01

@ialocin, ¡muchas gracias! Esta respuesta me ayudó. Solo una pregunta, ¿cómo obtengo la URL de la categoría hija?

input input
12 mar 2014 00:12:32
2

Puedes comentar esta parte

    <h3><a href="<?php the_permalink(); ?>"><?php list($firstpart) = explode('|||', $gbtr_product_cats); echo $firstpart; ?></a></h3>

Añade al html ....

También puedes usar CSS para ocultar el h3, por ejemplo:

<style> .product_item h3 {display: none !important;} </style>

Puedes añadirlo a tu css.

Haciendo eso, el texto 'rojo' desaparecerá y solo tendrás el otro texto.

4 oct 2013 15:58:48
Comentarios

Simplemente ocultar el elemento no es óptimo y se debe evitar el uso de declaraciones de estilo en línea.

Nicolai Grossherr Nicolai Grossherr
4 oct 2013 16:12:52

No es que quiera ocultar los títulos H3. Quiero cambiar la función. Actualmente muestra la categoría seleccionada por orden alfabético. Pero quiero que muestre las categorías hijas de un padre específico... (difícil de explicar :) )

tjwillems tjwillems
4 oct 2013 17:41:26
0

Aquí está la forma más sencilla de mostrar las categorías hijas de productos a partir de un ID de categoría padre específico

$parent_id = 12;    // ID de la categoría padre
// Obtener categorías hijas a partir del ID padre
$get_child_category = get_terms('product_cat',array('child_of' => $parent_id));
// Filtrar productos por categoría hija
foreach($get_child_category as $child_category){
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => 10,
        'product_cat' => $child_category->slug,
        'order' => 'DESC',
    );
}
6 ago 2015 07:15:46