Answer a question

I want to add a new attribute to an existing woocommerce product. I use this code

$pf = new WC_Product_Factory();

$product = $pf->get_product(76);


//Create the attribute object
$attribute = new WC_Product_Attribute();

$attribute->set_id( 0 ); 

//pa_color slug
$attribute->set_name( 'color' ); 

//Set terms slugs
$attribute->set_options( array(
   'blue',
) );

$attribute->set_position( 0 );

//If enabled
 $attribute->set_visible( 1 );

$product->set_attributes(array($attribute));

$id = $product->save();

this code working fine but I want to add attributes with terms, this code create custom product attribute. I want to create attribute like this image enter image description here

How can I create key-value attributes?

Answers

Try this code

function get_attribute_id_from_name($name)
{
    global $wpdb;
    $attribute_id = $wpdb->get_var("SELECT attribute_id
    FROM {$wpdb->prefix}woocommerce_attribute_taxonomies
    WHERE attribute_name LIKE '$name'");
    return $attribute_id;
}


function save_product_attribute_from_name($name, $label = '', $set = true)
{
    if (!function_exists('get_attribute_id_from_name')){
          return;
   }

    global $wpdb;

    $label = $label == '' ? ucfirst($name) : $label;
    $attribute_id = get_attribute_id_from_name($name);
    $taxonomy = wc_attribute_taxonomy_name($name); // The taxonomy slug

    if (empty($attribute_id)) {
        $attribute_id = NULL;
    }
    else {
        $set = false;
    }

    //register existing taxonomy
    if (isset($attribute_id) && !taxonomy_exists($taxonomy)) {
        register_attribute($name);
    }

    $args = array(
        'attribute_id'      => $attribute_id,
        'attribute_name'    => $name,
        'attribute_label'   => $label,
        'attribute_type'    => 'select',
        'attribute_orderby' => 'menu_order',
        'attribute_public'  => 0,
    );


    if (empty($attribute_id)) {
        $wpdb->insert("{$wpdb->prefix}woocommerce_attribute_taxonomies", $args);
        set_transient('wc_attribute_taxonomies', false);
    }

    if ($set) {

        $attributes = wc_get_attribute_taxonomies();
        $args['attribute_id'] = get_attribute_id_from_name($name);
        $attributes[] = (object)$args;
        //print_r($attributes);
        set_transient('wc_attribute_taxonomies', $attributes);
    } else {
        return;
    }
}

function register_attribute($name)
{
    $taxonomy = wc_attribute_taxonomy_name($name); // The taxonomy slug
    $attr_label = ucfirst($name); // attribute label name
    $attr_name = (wc_sanitize_taxonomy_name($name)); // attribute slug

    register_taxonomy(
        $taxonomy,
        'product',
        array(
            'label'        => __($attr_label),
            'rewrite'      => array('slug' => $attr_name),
            'hierarchical' => true,
        )
    );

}

function add_product_attribute($product_id, $data)
{

    $_pf = new WC_Product_Factory();
    $product = $_pf->get_product($product_id);

    $product_attributes = array();

    
    foreach ($data['_attributes'] as $key => $terms) {
        $taxonomy = wc_attribute_taxonomy_name($key); // The taxonomy slug
        $attr_label = ucfirst($key); // attribute label name
        $attr_name = (wc_sanitize_taxonomy_name($key)); // attribute slug

        // NEW Attributes: Register and save them
        if (!taxonomy_exists($taxonomy))
            save_product_attribute_from_name($attr_name, $attr_label);


        $product_attributes[$taxonomy] = array(
            'name'         => $taxonomy,
            'value'        => '',
            'position'     => '',
            'is_visible'   => 1,
            'is_variation' => 1,
            'is_taxonomy'  => 1
        );

        foreach ($terms as $value) {
            $term_name = ucfirst($value);
            $term_slug = sanitize_title($value);

            // Check if the Term name exist and if not we create it.
            if (!term_exists($value, $taxonomy))
                wp_insert_term($term_name, $taxonomy, array('slug' => $term_slug)); // Create the term
            // Set attribute values
            wp_set_object_terms($product_id, $term_name, $taxonomy, true);

        }

        $product->set_attributes(array($attribute));
    }
    update_post_meta($product_id, '_product_attributes', $product_attributes);


}

Then call function

add_product_attribute(76, [
        'attributes' => [
            'Attribute 1' => ['Value 1', 'Value 2'],
            'Attribute 2' => ['Value 4', 'Value 5'],
        ],

    ]
);
Logo

WooCommerce社区为您提供最前沿的新闻资讯和知识内容

更多推荐