/** * Link all variations via ajax function. */ public static function link_all_variations() { if (!defined('WC_MAX_LINKED_VARIATIONS')) { define('WC_MAX_LINKED_VARIATIONS', 49); } check_ajax_referer('link-variations', 'security'); if (!current_user_can('edit_products')) { die(-1); } if (function_exists('set_time_limit') && false === strpos(ini_get('disable_functions'), 'set_time_limit') && !ini_get('safe_mode')) { @set_time_limit(0); } $post_id = intval($_POST['post_id']); if (!$post_id) { die; } $variations = array(); $_product = wc_get_product($post_id, array('product_type' => 'variable')); // Put variation attributes into an array foreach ($_product->get_attributes() as $attribute) { if (!$attribute['is_variation']) { continue; } $attribute_field_name = 'attribute_' . sanitize_title($attribute['name']); if ($attribute['is_taxonomy']) { $options = wc_get_product_terms($post_id, $attribute['name'], array('fields' => 'slugs')); } else { $options = explode(WC_DELIMITER, $attribute['value']); } $options = array_map('trim', $options); $variations[$attribute_field_name] = $options; } // Quit out if none were found if (sizeof($variations) == 0) { die; } // Get existing variations so we don't create duplicates $available_variations = array(); foreach ($_product->get_children() as $child_id) { $child = $_product->get_child($child_id); if (!empty($child->variation_id)) { $available_variations[] = $child->get_variation_attributes(); } } // Created posts will all have the following data $variation_post_data = array('post_title' => 'Product #' . $post_id . ' Variation', 'post_content' => '', 'post_status' => 'publish', 'post_author' => get_current_user_id(), 'post_parent' => $post_id, 'post_type' => 'product_variation'); $variation_ids = array(); $added = 0; $possible_variations = wc_array_cartesian($variations); foreach ($possible_variations as $variation) { // Check if variation already exists if (in_array($variation, $available_variations)) { continue; } $variation_id = wp_insert_post($variation_post_data); $variation_ids[] = $variation_id; foreach ($variation as $key => $value) { update_post_meta($variation_id, $key, $value); } // Save stock status update_post_meta($variation_id, '_stock_status', 'instock'); $added++; do_action('product_variation_linked', $variation_id); if ($added > WC_MAX_LINKED_VARIATIONS) { break; } } delete_transient('wc_product_children_' . $post_id); echo $added; die; }
/** * Link all variations via ajax function. */ public static function link_all_variations() { check_ajax_referer('link-variations', 'security'); if (!current_user_can('edit_products')) { die(-1); } wc_maybe_define_constant('WC_MAX_LINKED_VARIATIONS', 49); wc_set_time_limit(0); $post_id = intval($_POST['post_id']); if (!$post_id) { die; } $variations = array(); $product = wc_get_product($post_id); if ($product->is_type('variable')) { $attributes = wc_list_pluck(array_filter($product->get_attributes(), 'wc_attributes_array_filter_variation'), 'get_slugs'); if (!empty($attributes)) { // Get existing variations so we don't create duplicates. $existing_variations = array_map('wc_get_product', $product->get_children()); $existing_attributes = array(); foreach ($existing_variations as $existing_variation) { $existing_attributes[] = $existing_variation->get_attributes(); } $added = 0; $possible_attributes = wc_array_cartesian($attributes); foreach ($possible_attributes as $possible_attribute) { if (in_array($possible_attribute, $existing_attributes)) { continue; } $variation = new WC_Product_Variation(); $variation->set_parent_id($post_id); $variation->set_attributes($possible_attribute); do_action('product_variation_linked', $variation->save()); if ($added++ > WC_MAX_LINKED_VARIATIONS) { break; } } echo $added; } } die; }