Add a new term to a product attribute and set it in the product in Woocommerce

后端 未结 1 1392
再見小時候
再見小時候 2020-12-11 21:37

My custom taxonomy (WooCommerce attribute) already exists and I am using the following to add a new term to the taxonomy and associate it with my WooCommerce product:

<
相关标签:
1条回答
  • 2020-12-11 22:00

    Product attributes are a complicated custom taxonomy that needs much more than a simple line of code...

    The following code will handle all cases for a pre-existing product attribute:

    $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 );
    

    Tested and works.

    0 讨论(0)
提交回复
热议问题