0
/**
 * Plugin Name:     ERP - WooCommerce Sync
 * Description:     Erp Sync
 */

// Exit if accessed directly
if(!defined('ABSPATH')) {
    exit;
}

// Getting the saved API response
$api = file_get_contents(plugin_dir_path( _FILE_ ) . 'api.json', 'r');
$api_products = json_decode($api);
$product_ids = [336, 337];

add_action( 'wp_loaded', function() use ($api_products, $product_ids) {
   foreach ($product_ids as $product_id)
       create_update_variations($api_products, $product_id);
});

/**
 * Creating/updating attributes and variations
 */
function create_update_variations($api_products, $product_id) {
    $size_variations = [];
    $fusion_variations = [];

    // Taking nd/single order
    foreach ($api_products[1]->price_all->rows as $api_product) {
        if (str_contains($api_product[0], 'nd') && $api_product[2] == 'single') {
            $fusion_variations[] = $api_product[1];
            $size_variations[] = $api_product[5];
        }
    }

    $fusion_variations = array_unique($fusion_variations);

    // Loading attributes
    $product = wc_get_product($product_id);
    $attributes = $product->get_attributes();

    // Creating or updating sizes
    if (!isset($attributes['Size'])) {
        $size_attribute = new WC_Product_Attribute();
        $size_attribute->set_id(0);
        $size_attribute->set_name('Size');
        $size_attribute->set_options($size_variations);
        $size_attribute->set_visible(true);
        $size_attribute->set_variation(true);
        $attributes['Size'] = $size_attribute;
    } else {
        $size_attribute = $attributes['Size'];
        $size_attribute->set_options($size_variations);
    }

    // Creating or updating fusions
    if (!isset($attributes['Fusion'])) {
        $fusion_attribute = new WC_Product_Attribute();
        $fusion_attribute->set_id(0);
        $fusion_attribute->set_name('Fusion');
        $fusion_attribute->set_options($fusion_variations);
        $fusion_attribute->set_visible(true);
        $fusion_attribute->set_variation(true);
        $attributes['Fusion'] = $fusion_attribute;
    } else {
        $fusion_attribute = $attributes['Fusion'];
        $fusion_attribute->set_options($fusion_variations);
    }

    $product->set_attributes($attributes);
    $product->save();

    // Creating variations
    $variable_product = wc_get_product($product_id);
    $existing_variations = $variable_product->get_children();

    foreach ($size_variations as $size) {
        foreach ($fusion_variations as $fusion) {
            // Check if a variation with these attributes already exists
            $variation_exists = false;
            foreach ($existing_variations as $variation_id) {
                $variation = wc_get_product($variation_id);
                $variation_attributes = $variation->get_attributes();
                if (isset($variation_attributes['Size']) && isset($variation_attributes['Fusion']) && $variation_attributes['Size'] == $size && $variation_attributes['Fusion'] == $fusion) {
                    $variation_exists = true;
                    break;
                }
            }

            // If the variation doesn't exist, create it
            if (!$variation_exists) {
                $variation = new WC_Product_Variation();
                $variation->set_regular_price(20);
                $variation->set_attributes(array(
                    'Fusion' => $fusion,
                    'Size' => $size
                ));
                $variation->set_parent_id($product_id);
                $variation->save();
            }
        }
    }
}```

This code successfully creating variations, but not bounding their attributes. Here is the "api.json" file code:

```[
  {
    "client": "TSS",
    "manager": "Mike",
    "unit": "М14",
    "category_m14store": ""
  },
  {
    "price_all": {
      "columns": [
        {
          "text": "Name",
          "type": "string"
        },
        {
          "text": "Fusion",
          "type": "string"
        },
        {
          "text": "PriceType",
          "type": "string"
        },
        {
          "text": "ProdType",
          "type": "string"
        },
        {
          "text": "Price",
          "type": "string"
        },
        {
          "text": "Size",
          "type": "string"
        }
      ],
      "rows": [
        [
          "Nd - 31,75",
          "oen",
          "single",
          "ball oen;oen-mg",
          "25",
          "31,75"
        ],
        [
          "Nd - 32,00",
          "oen",
          "single",
          "ball oen;oen-mg",
          "25",
          "32"
        ]
      ],
      "type": "table"
    }
  }
]```

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Browse other questions tagged or ask your own question.