WooCommerce - Mostrar subcategorías de productos de un padre específico
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

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.

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

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.

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

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',
);
}
