Title: devdigith's Replies | WordPress.org

---

# devdigith

  [  ](https://wordpress.org/support/users/devdigith/)

 *   [Profile](https://wordpress.org/support/users/devdigith/)
 *   [Topics Started](https://wordpress.org/support/users/devdigith/topics/)
 *   [Replies Created](https://wordpress.org/support/users/devdigith/replies/)
 *   [Reviews Written](https://wordpress.org/support/users/devdigith/reviews/)
 *   [Topics Replied To](https://wordpress.org/support/users/devdigith/replied-to/)
 *   [Engagements](https://wordpress.org/support/users/devdigith/engagements/)
 *   [Favorites](https://wordpress.org/support/users/devdigith/favorites/)

 Search replies:

## Forum Replies Created

Viewing 1 replies (of 1 total)

 *   Forum: [Plugins](https://wordpress.org/support/forum/plugins-and-hacks/)
    In
   reply to: [[WooCommerce] How to create Simple and Variable Products from JSON data?](https://wordpress.org/support/topic/how-to-create-simple-and-variable-products-from-json-data/)
 *  Thread Starter [devdigith](https://wordpress.org/support/users/devdigith/)
 * (@devdigith)
 * [2 years, 8 months ago](https://wordpress.org/support/topic/how-to-create-simple-and-variable-products-from-json-data/#post-17087634)
 * I modified the code, now issue is still same, I want to assign proper variation
   based on above json data. Problem is with variable product data. Just want to
   know where the coding wrong
 *     ```wp-block-code
       foreach ((array)$json_result as $product) {
           $variations = $product['variations'];
   
           $availableOptions = $product['availableOptions'];
   
   
           // Fetch variant data
           $optionNames = [];
           $optionValues = [];
           // Loop through the available options array.
           if (is_countable($availableOptions) && count($availableOptions) > 0) {
             for ($a = 0; $a < count($availableOptions); $a++) {
               $optionNames[] = $availableOptions[$a]['optionName'];
               $optionValues[$availableOptions[$a]['optionName']][] = $availableOptions[$a]['optionValues'];
             }
           }
   
           if (!function_exists('save_product_attribute_terms')) {
             // Function to save attribute terms
             function save_product_attribute_terms($woocommerce, $optionValues)
             {
               foreach ($optionValues as $optionName => $values) {
                 try {
                   // Check if the attribute already exists
                   $existing_attributes = $woocommerce->get('products/attributes', ['name' => $optionName]);
   
                   if (!empty($existing_attributes)) {
                     // Loop through existing attributes to find the correct one
                     foreach ($existing_attributes as $existing_attribute) {
                       if ($existing_attribute->name === $optionName) {
                         $attribute_id = $existing_attribute->id;
                         break; // Stop the loop when the correct attribute is found
                       }
                     }
                   }
   
                   // If the attribute doesn't exist, create it
                   if (empty($attribute_id)) {
                     $attribute_data = [
                       'name' => $optionName,
                     ];
                     $attribute = $woocommerce->post('products/attributes', $attribute_data);
   
                     if (!empty($attribute->id)) {
                       $attribute_id = $attribute->id;
                     } else {
                       // Handle attribute creation failure
                       continue; // Skip to the next attribute if creation fails
                     }
                   }
                   // Now associate the values with the attribute
                   foreach ($values as $value) {
                     if (is_array($value)) {
                       // If $value is an array, loop through its elements
                       for ($td = 0; $td < count($value); $td++) {
                         // Check if the term already exists for this attribute
                         $term_exists = $woocommerce->get('products/attributes/' . $attribute_id . '/terms', ['name' => $value[$td]]);
                         // Create the term if it doesn't exist
                         if (empty($term_exists)) {
                           $term_data = [
                             'name' => $value[$td],
                           ];
                           $woocommerce->post('products/attributes/' . $attribute_id . '/terms', $term_data);
                         }
                       }
                     } else {
                       // Check if the term already exists for this attribute
                       $term_exists = $woocommerce->get('products/attributes/' . $attribute_id . '/terms', ['name' => $value]);
                       // Create the term if it doesn't exist
                       if (empty($term_exists)) {
                         $term_data = [
                           'name' => $value,
                         ];
                         $woocommerce->post('products/attributes/' . $attribute_id . '/terms', $term_data);
                       }
                     }
                   }
                 } catch (HttpClientException $e) {
                   // Handle the exception
                 }
               }
             }
           }
           // Call the function to save attribute terms
           save_product_attribute_terms($woocommerce, $optionValues);
   
           $productTitle = isset($product['title']) ? $product['title'] : '';
           $foundPost = post_exists($productTitle);
           if ($foundPost  <= 0) {
             if ($product['type'] === 'Variable') {
               $attr_ids = [];
               $createAttribute = [];
               foreach ($availableOptions as $attributesOption) {
                 $name = $attributesOption['optionName'];
                 $values = $attributesOption['optionValues'];
                 $at_id = $wpdb->get_var("select attribute_id from {$wpdb->prefix}woocommerce_attribute_taxonomies where attribute_name='" . $name . "'");
                 if ($at_id != '' && $at_id > 0) {
                   $attrID = $at_id;
                 } else {
                   try {
                     $attr_data = [
                       'name' => isset($name) ? $name : '',
                       'variation' => true,
                       'visible' => true,
                     ];
                     // Create the attribute without options for now
                     $attr_name = $woocommerce->post('products/attributes', $attr_data);
                     $attrID = $attr_name->id;
                   } catch (Exception $e) {
                     // Handle the exception
                   }
                 }
                 $attr_ids[] = $attrID;
                 $createAttributes = array(
                   'id' => $attrID,
                   'variation' => True,
                   'visible' => True,
                   'options' => $values
                 );
                 $createAttribute[] = $createAttributes;
               }
   
               $product_data = [
                 'name' => isset($product['title']) ? $product['title'] : '',
                 'type' => 'variable',
                 'status' => 'publish',
                 'description' => isset($product['contentHTML']) ? $product['contentHTML'] : '',
                 'categories' => [
                   [
                     'id' => $catID
                   ]
                 ],
                 'attributes' => $createAttribute,
               ];
               $products_data = $woocommerce->post('products', $product_data);
   
               if (is_countable($variations) && count($variations) > 0) {
                 for ($v = 0; $v < count($variations); $v++) {
                   $variant_images = $variations[$v]["imageSrcs"];
                   $variant_price = $variations[$v]["price"];
                   $variant_salePrice = $variations[$v]["priceCompareAt"];
                   $formatted_regular_price = number_format((float) $variant_price, 2, '.', '');
                   $formatted_selling_price = number_format((float) $variant_salePrice, 2, '.', '');
   
                   $variation_data = [
                     'regular_price' => $formatted_regular_price,
                     'sale_price' => $formatted_selling_price,
                     'attributes' => $createAttribute
                   ];
                   $addVariations = $woocommerce->post('products/' . $products_data->id . '/variations', $variation_data);
                   $varData = array();
                   $vv = [];
                   foreach ($variations[$v]['options'] as $vOption) {
                     $atid = $wpdb->get_var("select attribute_id from {$wpdb->prefix}woocommerce_attribute_taxonomies where attribute_name='" . $vOption['name'] . "'");
                     $vv[] = $vOption['value'];
                     $vardata = array(
                       'id' => $atid,
                       'options' => $vv
                     );
                     $varData[] = $vardata;
                   }
                   $variance_data = array(
                     'attributes' => $varData
                   );
   
                   $woocommerce->put('products/' . $products_data->id . '/variations/' . $addVariations->id, $variance_data);
                   echo '<pre>';
                   print_r($varData);
                   $stokeData = [
                     'manage_stock' => true,
                     'stock_quantity' => isset($variations[$v]['quantity']) ? $variations[$v]['quantity'] : '',
                     'sku' => isset($variations[$v]['sku']) ? $variations[$v]['sku'] : '',
                   ];
                   $woocommerce->put('products/' . $products_data->id . '/variations/' . $addVariations->id, $stokeData);
   
                 }
               }
             }
           }
         }
       ```
   
    -  This reply was modified 2 years, 8 months ago by [devdigith](https://wordpress.org/support/users/devdigith/).

Viewing 1 replies (of 1 total)