Cómo mostrar los nombres de las etiquetas de productos de WooCommerce en la página de inicio y páginas de categorías

4 oct 2017, 15:31:25
Vistas: 28.2K
Votos: 1

Estoy tratando de mostrar las etiquetas de productos de WooCommerce en la página de inicio y páginas de categorías. Junto con el título del producto, el tema debería mostrar las etiquetas en orden alfabético, separadas por un "·".

Por ejemplo: Etiqueta 1 · Etiqueta 2 · Etiqueta 3

Esto es lo que tengo por el momento:

<?php echo get_the_tag_list('<span class="woocommerce-display-tag">Etiquetas: ',' · ','</span>');?>

La salida está en blanco.

¿Cómo puedo hacer que esto funcione?

Para mostrar las etiquetas de productos de WooCommerce, debes usar la función específica de WooCommerce. Aquí está la solución correcta:

<?php
$terms = get_the_terms(get_the_ID(), 'product_tag');
if ($terms && !is_wp_error($terms)) {
    // Ordenar las etiquetas alfabéticamente
    usort($terms, function($a, $b) {
        return strcmp($a->name, $b->name);
    });
    
    echo '<span class="woocommerce-display-tag">Etiquetas: ';
    $tags = array();
    foreach ($terms as $term) {
        $tags[] = $term->name;
    }
    echo implode(' · ', $tags);
    echo '</span>';
}
?>
0
Todas las respuestas a la pregunta 2
2

Creo que get_the_tag_list solo se usa para las etiquetas predeterminadas de WordPress. Las etiquetas de productos de WooCommerce son una taxonomía personalizada llamada product_tag. Por lo tanto, no puedes usar esta función para devolver estas etiquetas. (por favor, corríjanme si estoy equivocado aquí).

En su lugar, podrías usar la función get_the_terms() de WordPress para obtener un resultado "similar".

Básico:

// obtener product_tags del producto actual
$current_tags = get_the_terms( get_the_ID(), 'product_tag' );

// solo comenzar si tenemos algunas etiquetas
if ( $current_tags && ! is_wp_error( $current_tags ) ) { 

    // crear una lista para contener nuestras etiquetas
    echo '<ul class="product_tags">';

    // para cada etiqueta creamos un elemento de lista
    foreach ($current_tags as $tag) {

        $tag_title = $tag->name; // nombre de la etiqueta
        $tag_link = get_term_link( $tag );// enlace del archivo de la etiqueta

        echo '<li><a href="'.$tag_link.'">'.$tag_title.'</a></li>';
    }

    echo '</ul>';
}

Si deseas usar un separador especial y demás, tendrás que ajustarlo.


Actualización para separadores:

Tienes algunas opciones sobre cómo quieres eliminar el último separador o lidiar con los separadores en general aquí.

El primer método es usar solo CSS. Para esto, primero envolvemos cada $tag_title en un elemento HTML (aquí un <span>). Hacemos esto para poder apuntar a cada título.

// para cada etiqueta creamos un elemento de lista
foreach ($current_tags as $tag) {

    $tag_title = $tag->name; // nombre de la etiqueta

    echo '<span>'.$tag_title.'</span>';
}

Luego simplemente agregamos 2 nuevos estilos CSS (usando tu marcado):

/* agregar " · " después de cada elemento span dentro de .woocommerce-Price-amount */
.woocommerce-Price-amount span:after { content: " · "; }

/* establecer el contenido a nada/eliminar " · " en el último elemento span */
.woocommerce-Price-amount span:last-child:after { content: ""; }

También puedes agregar un separador vía PHP.
Para esto, primero necesitamos obtener un nuevo arreglo de todas las claves de nuestro arreglo $current_tags. Luego buscamos la última clave encontrada en este nuevo arreglo. Después de esto, usamos un foreach loop y en ese comparamos la clave actual con la última clave encontrada. Si estas dos son iguales, sabemos que tenemos el último elemento.

Cambia tu función if:

// solo comenzar si tenemos algunas etiquetas
if ( $current_tags && ! is_wp_error( $current_tags ) ) { 

    // crear una lista para contener nuestras etiquetas
    echo '<span class="woocommerce-Price-amount amount">';

    // obtener todas las claves del arreglo $current_tags
    $get_keys = array_keys($current_tags);

    // obtener la última clave de nuestras claves
    $last_key = array_pop($get_keys);

    // para cada etiqueta creamos un elemento de lista
    foreach ($current_tags as $key => $value) {

        $tag_title = $value->name; // nombre de la etiqueta

        if($key == $last_key) {
            echo $tag_title;
        } else {
            echo $tag_title.' · ';
        }

    }
    echo '</span>';
}

P.D. ¡Revisa tu código! En el fragmento que publicaste hay un error al final echo '</span> }. Te falta una '

4 oct 2017 15:56:57
Comentarios

¡Gracias! Ahora estoy usando:

`// obtener product_tags del producto actual $current_tags = get_the_terms( get_the_ID(), 'product_tag' );

// solo comenzar si tenemos algunas etiquetas if ( $current_tags && ! is_wp_error( $current_tags ) ) {

// crear una lista para contener nuestras etiquetas
echo '<span class="woocommerce-Price-amount amount">';

// por cada etiqueta creamos un elemento de lista
foreach ($current_tags as $tag) {

    $tag_title = $tag->name; // nombre de la etiqueta

    echo $tag_title.' · ';
}

 echo '</span>

}`

¿Sabes cómo puedo eliminar el · final?

illmasterj illmasterj
4 oct 2017 19:04:01

@illmasterj puedes eliminar el · final mediante CSS o mediante PHP. Acabo de actualizar mi respuesta con dos métodos diferentes.

LWS-Mo LWS-Mo
6 oct 2017 13:49:51
1

Ahora puedes usar la función wc_get_product_tag_list() para obtener una lista de las etiquetas del producto. Soporta proporcionar un separador junto con elementos antes y después.

Ejemplo

<?php
    global $product;
?>
    <div class="product-tags">
        <?php echo wc_get_product_tag_list( $product->get_id(), ', ' ); ?>
    </div>
12 oct 2020 18:27:37
Comentarios

¡Hola y gracias por tu respuesta! Por favor, ten cuidado al copiar/pegar esta respuesta en múltiples preguntas. Asegúrate de que sea relevante para la pregunta específica. Tal vez usa código de la pregunta específica para implementarlo en tu respuesta como ejemplo. Esto evitará que el sistema lo marque como comportamiento spam.

Howdy_McGee Howdy_McGee
12 oct 2020 19:11:58