Тема: Створення варіацій продуктів у cms wordpress
Привіт всім. Не можу ніяк написати функціонал додавання варіацій до продукту в wordpress.
В адмінці виводяться поля які ми заповняємо після чого аяксом відправляється запит з цими данними і створюється варіація. Варіація створюється на властивостях, тобто ми заповнили поля, відправили аякс де ми створили нову властивість якщо її ще нема і добавили варіацію по цій властивості. Варіації створюються, але на фронтенді їх чомусь не видно, і навіть коли я їх намагаюся вивести з допомогою
$product->get_available_variations();
то масив пусий, але в адмінці вони відображаються. Я так підозрюю, що коли я їх створюю, то не вірно встановлюю якесь значення через що ми і не можем їх бачити.
Наприклад ось хочу отримати всі варіаціїї продукта по його id
add_action('init', 'wpc_test');
function wpc_test()
{
// $post = get_posts(array('post_parent'=>9759));
// var_dump($post);
// exit();
$product = wc_get_product( 9759 );
var_dump("POST ID: 9759");
if(method_exists($product, 'get_available_variations'))
{
$variations = $product->get_available_variations();
var_dump($variations);
exit();
}
}
в результаті отримую пустий масив.
але в адмінці варіації відображаються (на фото видно).
Ось як я їх створюю:
add_action('wp_ajax_create_custom_variations', 'cvp_ajax_create_custom_variations');
add_action('wp_ajax_nopriv_create_custom_variations', 'cvp_ajax_create_custom_variations');
function cvp_ajax_create_custom_variations($import_excel = '', $product_id = 0)
{
if($import_excel != '' && $product_id != 0)
{
$_POST['json'] = $import_excel;
$_POST['post_id'] = $product_id;
}
$products_data = json_decode($_POST['json'], true);
//var_dump($_POST['json']);
if( $_POST['post_id'] == '')
{
return false;
}
$product_data['available_attributes'] = array("package");
$product_data['variations'] = array();
foreach ($products_data as $data)
{
$array = array("attributes"=>array("package" => $data[0]."mg x ".$data[1]." pills"), "price" => $data[3], 'mg'=>$data[0], 'pills'=>$data[1], 'per_pill'=>$data[2]);
array_push($product_data['variations'], $array);
}
//$_POST['post_id'] - містить правильний ідентифікатор батьківського продукту
//$data - також містить правильні дані, так як по них ми створюємо атрибути для продукта, і в результаті все правильнос створюється
wp_set_object_terms((int)$_POST['post_id'], 'variable', 'product_type'); // Set it to a variable product type
insert_product_attributes((int)$_POST['post_id'], $product_data['available_attributes'], $product_data['variations']); // Add attributes passing the new post id, attributes & variations
insert_product_variations((int)$_POST['post_id'], $product_data['variations']); // Insert variations passing the new post id & variations
//wp_die();
}
function insert_product_attributes ($post_id, $available_attributes, $variations)
{
var_dump('$post_id: '.$post_id);
foreach ($available_attributes as $attribute) // Go through each attribute
{
$values = array(); // Set up an array to store the current attributes values.
foreach ($variations as $variation) // Loop each variation in the file
{
$attribute_keys = array_keys($variation['attributes']); // Get the keys for the current variations attributes
foreach ($attribute_keys as $key) // Loop through each key
{
if ($key === $attribute) // If this attributes key is the top level attribute add the value to the $values array
{
$values[] = $variation['attributes'][$key];
}
}
}
$values = array_unique($values); // Filter out duplicate values
wp_set_object_terms($post_id, $values, 'pa_' . $attribute);
}
$product_attributes_data = array(); // Setup array to hold our product attributes data
$product_attributes_data['pa_package'] = array( // Set this attributes array to a key to using the prefix 'pa'
'name' => 'pa_package',
'value' => '',
'is_visible' => '1',
'is_variation' => '1',
'is_taxonomy' => '1'
);
// var_dump($product_attributes_data);
update_post_meta($post_id, '_product_attributes', $product_attributes_data); // Attach the above array to the new posts meta data key '_product_attributes'
}
//var_dump(get_post(10369));
//exit();
function insert_product_variations($post_id, $variations)
{
delete_variations_product($post_id);
var_dump("POST PARENT: ".$post_id);
foreach ($variations as $index => $variation)
{
$variation_post = array( // Setup the post data for the variation
'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); // Insert the variation
// var_dump($variation['attributes']);
update_post_meta($variation_post_id, 'cutom_variation_name', str_replace('-', ' ', $variation['attributes']['package']));
update_post_meta($variation_post_id, 'cvp_mg', $variation['mg']);
update_post_meta($variation_post_id, 'cvp_pills', $variation['pills']);
update_post_meta($variation_post_id, 'cvp_price', $variation['price']);
update_post_meta($variation_post_id, 'cvp_per_pill', $variation['per_pill']);
update_post_meta($variation_post_id, 'cvp_variation', $variation['per_pill']);
foreach ($variation['attributes'] as $attribute => $value) // Loop through the variations attributes
{
$attribute_term = get_term_by('name', $value, 'pa_'.$attribute); // We need to insert the slug not the name into the variation post meta
var_dump("+++++++++++ ".update_post_meta($variation_post_id, "attribute_pa_".$attribute, $attribute_term->slug));
var_dump("------------".get_post_meta($variation_post_id, "attribute_pa_".$attribute, true));
}
update_post_meta($variation_post_id, '_price', $variation['price']);
update_post_meta($variation_post_id, '_regular_price', $variation['price']);
}
}
function delete_variations_product($post_id)
{
$product = wc_get_product( $post_id );
var_dump("POST ID: ".$post_id);
if(method_exists($product, 'get_available_variations'))
{
var_dump("POST ID 2: ".$post_id);
$args = array(
'numberposts' => -1,
'post_parent' => $post_id
);
$get_posts = get_posts( $args );
$variations = $product->get_available_variations();
f_dump($args);
f_dump($get_posts);
foreach ($get_posts as $key => $variation)
{
var_dump("DELETE POST 1");
if(!get_post_meta($variation->ID, 'cvp_variation', true) && get_post_meta($variation->ID, 'cvp_variation', true) != '')
{
continue;
}
var_dump("DELETE POST 2");
wp_delete_post( $variation->ID );
}
}
}
функція delete_variations_product() на данний момент нічого не робить так як вона намагається отримати по id варіації продукта після чого їх видалити, але так як нам цілий час повертає пустий масив то ми нічого не видаляємо і варіації просто добавляються до все існуючих.
Ніяк не можу зрозуміти в чому проблема, прошу вашої допомоги. Якщо погано пояснив, то так і скажіть, спробую по іншому. Дуже потрібно вирішити цю проблему сьогодні.