4 votes

Ajouter un nouveau terme à un attribut de produit et le définir dans le produit dans Woocommerce

Ma taxonomie personnalisée (attribut WooCommerce) existe déjà et j'utilise ce qui suit pour ajouter un nouveau terme à la taxonomie et l'associer à mon produit WooCommerce :

wp_set_object_terms($product_id, array($omega_jahr), 'pa_years-of-construction');

Lorsque j'utilise la commande suivante pour appeler la rubrique 'pa_years_of_construction' de mon produit, je constate que les nouveaux termes ont été enregistrés :

$v = array_values( wc_get_product_terms( $product->id, 'pa_years-of-construction', array( 'fields' => 'names' ) ) );

Cependant, lorsque je vérifie les attributs de mes produits dans l'arrière-plan et l'avant-plan de mon site Web, l'attribution "pa_years_of_construction" n'apparaît pas.

Qu'est-ce que je rate ici ?

Merci d'avance pour toute aide !

12voto

LoicTheAztec Points 72349

Les attributs de produit sont une taxonomie personnalisée compliquée qui nécessite bien plus qu'une simple ligne de code...

Le code suivant traitera tous les cas pour un attribut de produit préexistant :

$taxonomy = 'pa_years-of-construction'; // The taxonomy

$term_name = '2009'; // The term "NAME"
$term_slug = sanitize_title($term_name); // The term "slug"

// Check if the term exist and if not it create it (and get the term ID).
if( ! term_exists( $term_name, $taxonomy ) ){
    $term_data = wp_insert_term( $term_name, $taxonomy );
    $term_id   = $term_data['term_id'];
} else {
    $term_id   = get_term_by( 'name', $term_name, $taxonomy )->term_id;
}

// get an instance of the WC_Product Object
$product = wc_get_product( $product_id );

$attributes = (array) $product->get_attributes();

// 1. If the product attribute is set for the product
if( array_key_exists( $taxonomy, $attributes ) ) {
    foreach( $attributes as $key => $attribute ){
        if( $key == $taxonomy ){
            $options = (array) $attribute->get_options();
            $options[] = $term_id;
            $attribute->set_options($options);
            $attributes[$key] = $attribute;
            break;
        }
    }
    $product->set_attributes( $attributes );
}
// 2. The product attribute is not set for the product
else {
    $attribute = new WC_Product_Attribute();

    $attribute->set_id( sizeof( $attributes) + 1 );
    $attribute->set_name( $taxonomy );
    $attribute->set_options( array( $term_id ) );
    $attribute->set_position( sizeof( $attributes) + 1 );
    $attribute->set_visible( true );
    $attribute->set_variation( false );
    $attributes[] = $attribute;

    $product->set_attributes( $attributes );
}

$product->save();

// Append the new term in the product
if( ! has_term( $term_name, $taxonomy, $product_id ))
    wp_set_object_terms($product_id, $term_slug, $taxonomy, true );

Testé et fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X