Tcmxc
Tcmxc

Reputation: 491

How to save product attributes programmatically in Woocommerce

Im using wp_insert_post() to add products programmatically in woocommerce I got everything working except product attributes will not show on the product page view unless I click update from the admin.

Im adding tons of products so is there any way to get variations to show in the dropdown on the product page.

Heres my code it works fine everything gets placed in the correct fields it just wont show options on the product page without clicking update.

$new_post = array(
      'ID' => '',
      'post_author' => 1,           
      'post_title' => 'title of product',
      'post_status' => 'publish',
      'post_type' => 'product'
    );
$post_id = wp_insert_post($new_post);

wp_set_object_terms($post_id, 'variable', 'product_type', false); 

$my_post = array(
  'post_title'    => 'Variation # of ' . esc_attr(strip_tags(  $post_title)),
  'post_name'     => 'product-' . $post_id . '-variation-',
  'post_status'   => 'publish',
  'post_parent'   => $post_id,
  'post_type'     => 'product_variation',
  'guid'          =>  home_url() . '/?product_variation=product-' . $post_id . '-variation-'
);
wp_insert_post( $my_post );
$variable_id = $post_id + 1;

update_post_meta( $variable_id, '_price', 8.50 );
update_post_meta( $variable_id, '_regular_price', '8.50');

 $product_attributes['type'] = array(
            'name' => htmlspecialchars(stripslashes('Options')),
            'value' => "black|blue",
            'position' => 1,
            'is_visible' => 1,
            'is_variation' => 1,
            'is_taxonomy' => 0
    );


update_post_meta( $post_id, '_product_attributes', $product_attributes);    

Upvotes: 2

Views: 9401

Answers (2)

Shubh
Shubh

Reputation: 3

$sku = trim(strtoupper(substr($productName, 8) . '-' . 'SKU' . substr(time(), 3)));
$product = new WC_Product_Variable();
$product->set_name($productName);
$product->set_status('publish');
$product->set_catalog_visibility('visible');
$product->set_weight($productWeight);
$product->set_height($productHeight);
$product->set_length($productLength);
$product->set_width($productWidth);
$product->set_price($productPrice);
$product->set_regular_price($productPrice);
$product->set_sale_price($productPrice);
$product->set_sku($sku);
$product->set_stock_quantity(50);
$product->set_manage_stock(true);
$product->set_stock_status('instock');
$product->set_description($productDescription);


$options = array_map('trim', explode(',', $productAttributeValues));

$attribute = new WC_Product_Attribute();
$attribute->set_name($productAttributeName);
$attribute->set_options($options);
$attribute->set_position(1);
$attribute->set_visible(true);
$attribute->set_variation(true);
$attributes[] = $attribute;

$product->set_attributes($attributes);
$product->set_default_attributes(array($productAttributeName => 'small'));

$product->save();
$productId = $product->get_id();

foreach ($_FILES['productImages']['tmp_name'] as $key => $tmpName) {
    $file = array(
        'name' => $images['name'][$key],
        'tmp_name' => $images['tmp_name'][$key],
        'size' => $images['size'][$key],
        'full_path' => $images['full_path'][$key],
        'type' => $images['type'][$key],
        'error' => $images['error'][$key],
    );

    $_FILES = array('image' => $file);

    $attchIDs[] = media_handle_upload('image', $productId);
}

if ($attchIDs && is_array($attchIDs)) {
    $product->set_image_id($attchIDs[0]);
    array_shift($attchIDs);
    $product->set_gallery_image_ids($attchIDs);
}


$i=0;
foreach ($options as $option) {
    $sku = trim(strtoupper(substr($productName, 8) . '-' . $option . '-SKU' . substr(time(), 3) . rand(100, 999)));
    $variation = new WC_Product_Variation();
    $variation->set_parent_id($productId);
    $variation->set_attributes(array($productAttributeName => $option));
    $variation->set_regular_price($productPrice);
    $variation->set_sale_price(($productPrice - 100));
    $variation->set_stock_quantity(10);
    $variation->set_manage_stock(true);
    $variation->set_weight($productWeight);
    $variation->set_length($productLength);
    $variation->set_height($productHeight);
    $variation->set_width($productWidth);
    $variation->set_stock_status('instock');
    $variation->set_sku($sku);
    $variation->set_image_id($attchIDs[$i]);
    $variation->save();
    $i++;
}

here I am using options array [small,medium,large] I have also used media_handle_upload() function for uploading multiple images so that I can set product image and gallery images

        $productCreated=0;
        $product = new WC_Product_Variable();
        $product->set_name($row['Product_Name']);
        $product->set_status('publish');
        $product->set_catalog_visibility('visible');
        $product->set_height($row['Product_Height']);
        $product->set_length($row['Product_Lenght']);
        $product->set_width($row['Product_Width']);
        $product->set_weight($row['Product_Weight']);
        $product->set_sku($row['SKU']);
        $product->set_stock_quantity(50);
        $product->set_stock_status('instock');
        $product->set_manage_stock(true);
        $product->set_price($row['Product_Price']);
        $product->set_regular_price($row['Product_Price']);
        $product->set_sale_price($row['Product_Price']);
        $i = 1;

        while (($row['Attribute_Name_' . $i])) {

            $attributeValues = array_map('strtolower', array_map('trim', explode(',', $row['Attribute_' . $i . '_value(s)'])));
            $attribute = new WC_Product_Attribute();
            $attribute->set_name(strtolower($row['Attribute_Name_' . $i]));
            $attribute->set_options($attributeValues);
            $attribute->set_position($i);
            $attribute->set_visible(1);
            $attribute->set_variation(1);
            $attributes[] = $attribute;
            $i++;
        }

        $product->set_attributes($attributes);
        $product->save();
        $productID = $product->get_id();

        $i=1;
        $attchIDs=[];
        while($row['Featured_image_'.$i])
        {
            // print_r($row['Featured_image_' . $i]);
            $upload_dir=wp_upload_dir();
            $imageName= $row['Featured_image_' . $i];
            $imageType='image/'.end(explode('.',$imageName));
            $imageUrl=$upload_dir['url'].'/'.$imageName;
            $imagePath=$upload_dir['path'].'/'.$imageName;

            $args=array(
                'post_title'=>$imageName,
                'post_status'=>'inherit',
                'post_mime_type'=>$imageType,
                'guid'=>$imageUrl
            );
            $attachmentId=wp_insert_attachment($args, $imagePath);
            $attchData=wp_generate_attachment_metadata($attachmentId,$imagePath);
            wp_update_attachment_metadata($attachmentId,$attchData);
            $i++;


            if(!is_wp_error($attachmentId))
            {
                $attchIDs[]=$attachmentId;
            }
        }

        $attributeName1 =  strtolower($row['Attribute_Name_1']);
        $attributeName2 =  strtolower($row['Attribute_Name_2']);

        $attributeValues1 = array_map('strtolower', array_map('trim', explode(',', $row['Attribute_1_value(s)'])));
        $attributeValues2 = array_map('strtolower', array_map('trim', explode(',', $row['Attribute_2_value(s)'])));

        $product->set_default_attributes(
            array($attributeName1 =>$attributeValues1[0],
                $attributeName2 => $attributeValues2[0])
            );

       
            if($attchIDs && is_array($attchIDs))
        {
            $imageID= $attchIDs[0];
            array_shift($attchIDs);
            $product->set_image_id($imageID);
            $product->set_gallery_image_ids($attchIDs);
        }

        foreach ($attributeValues1  as $value1) {
            if (!empty($value1)) {
                foreach ($attributeValues2 as $value2) {
                    if (!empty($value2)) {
                        $sku = 'SKU-' . substr(time(), 4) . '-' . rand(100, 999);
                        $variation = new WC_Product_Variation();
                        $variation->set_parent_id($productID);
                        $variation->set_attributes(array(
                            $attributeName1 => $value1,
                            $attributeName2 => $value2
                        ));
                        $variation->set_height($row['Product_Height']);
                        $variation->set_length($row['Product_Lenght']);
                        $variation->set_width($row['Product_Width']);
                        $variation->set_weight($row['Product_Weight']);
                        $variation->set_sku($sku);
                        $variation->set_stock_quantity(50);
                        $variation->set_stock_status('instock');
                        $variation->set_manage_stock(true);
                        $variation->set_regular_price(($row['Product_Price']));
                        $variation->set_sale_price(($row['Product_Price'] - 200));
                        $variation->set_image_id($imageID);
                        $variation->save();
                    }
                }
            }
        }

        $productCreated++;
        $product->save();
   
    }

Upvotes: 0

Jayesh
Jayesh

Reputation: 161

This code will create product with 2 attributes (weight, brand) and 2 variations.

//Create main product
$product = new WC_Product_Variable();

$att_var = array();
//Create the attribute object with name weight
$attribute = new WC_Product_Attribute();
$attribute->set_id( 0 );
$attribute->set_name( 'weight' );
$attribute->set_options( array(
        '50g',
        '100g',
        '150g'
) );
$attribute->set_position( 0 );
$attribute->set_visible( 1 );
$attribute->set_variation( 1 );
$att_var[] = $attribute;

//Create the attribute object with name brand
$attribute = new WC_Product_Attribute();
$attribute->set_name( 'brand' );
$attribute->set_options( array(
        'Parle-G',
        'Britania'
) );
$attribute->set_position( 1 );
$attribute->set_visible( 1 );
$attribute->set_variation( 1 );
$att_var[] = $attribute;

$product->set_attributes($att_var);
$product->set_name('Product 3');
$product->set_status('publish');
$product->set_sku(12345);

//Save main product to get its id
$product->set_category_ids([47, 56] );
$id = $product->save();

//variation 1
$variation = new WC_Product_Variation();
$variation->set_regular_price(10);
$variation->set_sale_price(10);
$variation->set_stock_quantity(12);
$variation->set_manage_stock(True);
$variation->set_weight('50g');
$variation->set_parent_id($id);

$variation->set_attributes(array(
        'weight' => '50g',
        'brand' => 'Parle-G'
));

//Save variation, returns variation id
$variation->save();

//variation 2
$variation_new = new WC_Product_Variation();
$variation_new->set_regular_price(15);
$variation_new->set_sale_price(12);
$variation_new->set_stock_quantity(20);
$variation_new->set_manage_stock(True);
$variation_new->set_weight('100g');
$variation_new->set_parent_id($id);

//Set attributes requires a key/value containing
$variation_new->set_attributes(array(
        'weight' => '100g',
        'brand' => 'Britania'
));


//Save variation, returns variation id
$variation_new->save();

Product will create like this in woocommerce product section

Upvotes: 4

Related Questions