Termes d'attributs de produit séparés par des virgules si plusieurs valeurs sont disponibles

Jan 13 2021

Dans WooCommerce, je construis actuellement une fonction qui fera écho à certains attributs du produit dans la page de la boutique. Je voudrais les séparer par des virgules s'il y a plusieurs valeurs d'attribut disponibles, mais je ne sais pas comment.

Mon code:

add_action('woocommerce_after_shop_loop_item_title', 'TitleVariations', 10);
function TitleVariations()
{
global $product; $colormonth = $product->get_attribute('color-month'); $finish = $product->get_attribute('finish'); $design = $product->get_attribute('design'); echo '<span class="variation-display">'; echo __($colormonth, 'woocommerce');
echo __($finish, 'woocommerce'); echo __($crossdesign, 'woocommerce');
echo '</span>';
}

Réponses

2 LoicTheAztec Jan 13 2021 at 22:50

La méthode WC_Product get_attribute()donne une chaîne de valeurs séparées par des virgules lorsqu'il y a plus d'une valeur… Vous devez également vérifier que chaque attribut différent a dans la liste un terme…

Pour obtenir le nom de l'étiquette d'attribut de produit, vous pouvez utiliser wc_attribute_label()la fonction d'attribut de produit.

1). Si vous souhaitez obtenir chaque attribut de produit avec le nom de l'étiquette et la ou les valeurs des termes (chaque attribut différent sur une ligne), vous utiliserez à la place ce qui suit.

Ce code gère également les attributs de produit personnalisés :

add_action('woocommerce_after_shop_loop_item_title', 'display_loop_product_attributtes', 10);
function display_loop_product_attributtes()
{
    global $product; // Here define your product attribute names (slugs) $attribute_names = array('color-month', 'finish', 'design'); 
    $attributes = array(); // Initializing // Loop Through product attributes array foreach( $attribute_names as $attribute_name ) { if( taxonomy_exists( 'pa_' . $attribute_name )  ) {
            $attribute = 'pa_' . $attribute_name; // Custom taxonomy
        } else {
            $attribute = $attribute_name; // Custom attribute (not a taxonomy)
        }

        $values_str = $product->get_attribute($attribute); if ( $values_str ) {
            $attributes[] = '<strong>' . wc_attribute_label($attribute) . ':</strong> ' . $values_str; } } // Output product attribute label / values pairs (one by line) if( ! empty( $attributes ) ) { 
        echo '<span class="variation-display">' . implode( '<br>', $attributes ) . '</span>';
    }
}

2). Mais si vous souhaitez obtenir tous les termes d'attributs de votre produit sous forme de chaîne séparée par des virgules, votre code sera quelque chose comme dans Afficher les attributs de produit spécifiques sous le titre du produit dans les pages d'archives de Woocommerce .

Donc pour votre code:

add_action('woocommerce_after_shop_loop_item_title', 'display_loop_product_attributtes', 10);
function display_loop_product_attributtes()
{
    global $product;
        
    $color_month = $product->get_attribute('color-month');
    $finish = $product->get_attribute('finish');
    $design = $product->get_attribute('design');

    $attributes = array(); // Initializing if ( $color_month ) {
        $attributes[] = $color_month;
    }
    if (  $finish ) { $attributes[] = $finish; } if ( $design ) {
        $attributes[] = $design;
    }

    // Output product attribute values
    if( ! empty( $attributes ) ) { echo '<span class="variation-display">' . implode( ', ', $attributes ) . '</span>';
    }
}

Le code va dans le fichier functions.php du thème enfant actif (ou thème actif). Cela devrait fonctionner.

3 u_mulder Jan 13 2021 at 22:14

Collectez vos valeurs dans un tableau, puis dans implodece tableau:

$values = [ __($colormonth, 'woocommerce'),
    __($finish, 'woocommerce'), __($crossdesign, 'woocommerce'),
];

// if some values returned by `__()` are empty strings, 
// you can filter your array so as to remove them
$values = array_filter($values);

echo '<span class="variation-display">';
echo implode(', ', $values);
echo '</span>';