¿Cómo verificar si el producto está en una categoría específica en single-product.php en Woocommerce?
¿Cómo puedo verificar si un producto pertenece a una categoría específica de productos en el archivo single-product.php?
<?php if (is_product_category('audio')) {
echo 'En audio';
woocommerce_get_template_part( 'content', 'single-product' );
} elseif (is_product_category('elektro')) {
echo 'En elektro';
woocommerce_get_template_part( 'content', 'single-product' );
} else {
echo 'algún blabla'; } ?>
is_product_category('slug') no tiene efecto en single-product.php. Quiero tener las condicionales anteriores. ¿Hay alguna solución para esto en una página de producto individual?
has_term
debería funcionar en este caso:
if ( has_term( 'audio', 'product_cat' ) ) {
echo 'En audio';
woocommerce_get_template_part( 'content', 'single-product' );
} elseif ( has_term( 'elektro', 'product_cat' ) ) {
echo 'En elektro';
woocommerce_get_template_part( 'content', 'single-product' );
} else {
echo 'algún texto';
}

No creo que get_categories()
sea la mejor opción para ti en este caso porque devuelve una cadena con todas las categorías listadas como etiquetas de anclaje, está bien para mostrar, pero no es ideal para determinar en el código cuáles son las categorías. Bien, lo primero que necesitas hacer es obtener el objeto de producto/post de la página actual si aún no lo tienes:
global $post;
Luego puedes obtener los objetos de término de categoría de producto (las categorías) para el producto. Aquí estoy convirtiendo los objetos de término de categoría en un array simple llamado $categories
para que sea más fácil ver qué slugs están asignados. Ten en cuenta que esto devolverá todas las categorías asignadas al producto, no solo la de la página actual, es decir, si estamos en /shop/audio/funzo/
:
$terms = wp_get_post_terms( $post->ID, 'product_cat' );
foreach ( $terms as $term ) $categories[] = $term->slug;
Entonces solo tenemos que verificar si una categoría está en la lista:
if ( in_array( 'audio', $categories ) ) { // hacer algo
Juntando todo:
<?php
global $post;
$terms = wp_get_post_terms( $post->ID, 'product_cat' );
foreach ( $terms as $term ) $categories[] = $term->slug;
if ( in_array( 'audio', $categories ) ) {
echo 'En audio';
woocommerce_get_template_part( 'content', 'single-product' );
} elseif ( in_array( 'elektro', $categories ) ) {
echo 'En elektro';
woocommerce_get_template_part( 'content', 'single-product' );
} else {
echo 'algún blabla';
}
Espero que esto sea lo que estabas buscando y responda tu pregunta.

Vale la pena mencionar que puedes recorrer una lista de opciones llamando a un array en lugar de saturar tu código con múltiples verificaciones elseif, asumiendo que quieres hacer lo mismo con cada categoría.
if( has_term( array( 'laptop', 'fridge', 'hats', 'magic wand' ), 'product_cat' ) ) :
// Hacer algo aquí
else :
// Hacer otra cosa
endif;

Esto es antiguo, pero por si acaso la gente sigue buscando WooThemes como una solución simple:
if ( is_product() && has_term( 'tu_categoria', 'product_cat' ) ) {
//hacer código
}
*Cambia 'tu_categoria' por lo que estés usando.
Aquí está el enlace a la documentación: https://docs.woothemes.com/document/remov-product-content-based-on-category/

Te recomendaría usar la función get_categories()
de la clase WC_Product.
Puedes encontrar el enlace a la documentación aquí.
Básicamente, dentro del bucle de la página, llama a la función para devolver las categorías asociadas al producto.

No soy capaz de programar esto. No tengo ni idea de cómo hacer que funcione. ¿Alguien podría ilustrarlo, por favor? Hice mi mejor esfuerzo arriba. ¿Debería reemplazar esto con get_categories()?

@Alex la función is_product_category() devuelve TRUE si estás en la página de categoría de producto. No la categoría del producto. Ahora mismo estoy inmerso en un proyecto, pero intentaré darte un fragmento de código más tarde.
