Reputation: 491
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
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
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();
Upvotes: 4