Monday, October 30, 2017

Adding products programmatically creates duplicate variations if already exists on Woocommerce

Leave a Comment

I am working on an API to automatically import products on Wordpress with Woocommerce. All products are variation products and during the first sync, everything works ok. But after that, if I want to update the products, even if I have a code to avoid it, it creates duplicate variations for that product.

Here is the code:

function insert_product_variations ($post_id, $variations) {     foreach ($variations as $index => $variation)     {         $variation_id = find_matching_product_variation( $post_id, $variation['attributes'] );          if ( $variation_id == 0 ) {             $variation_post = array(                             'post_title'  => 'Variation #'.$index.' of '.count($variations).' for product#'. $post_id,                             'post_name'   => 'product-'.$post_id.'-variation-'.$index,                             'post_status' => 'publish',                             'post_parent' => $post_id,                             'post_type'   => 'product_variation',                             'guid'        => home_url() . '/?product_variation=product-' . $post_id . '-variation-' . $index                         );             $variation_post_id = wp_insert_post($variation_post);         } else {             $variation_post_id = $variation_id;         }          foreach ($variation['attributes'] as $attribute => $value)         {                $attribute_term = get_term_by('name', $value, 'pa_'.$attribute);             update_post_meta($variation_post_id, 'attribute_pa_'.$attribute, $attribute_term->slug);         }         update_post_meta($variation_post_id, '_price', $variation['price']);         update_post_meta($variation_post_id, '_regular_price', $variation['price']);         update_post_meta($variation_post_id, '_sku', $variation['sku']);     } }  function find_matching_product_variation( $product_id, $attributes ) {     $product = wc_get_product( $product_id );         if( class_exists('WC_Data_Store') ) {         $data_store = WC_Data_Store::load( 'product' );         return $data_store->find_matching_product_variation( $product, $attributes );     } else {         return $product->get_matching_variation( $attributes );     } } 

$post_id is the parent_id of the original product and the $variations is an array of objects like this one:

{     "attributes": {          "size"  : "Small",          "color" : "Red"     },     "price" : "8.00",     "sku" : "TS1000" } 
  • Wordpress Version: 4.8.2
  • Woocommerce Version: 3.1.2

0 Answers

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment