/** * Build the product structure with variation for product choosed by the user into frontend sheet * * @param array $selected_variation THe list of variation choosed by the user in product frontend sheet * @param integer $product_id The basic product choose by the user in frontend * * @return array The product list for adding to the cart build by variation priority */ public static function get_variation_by_priority($selected_variation, $product_id, $add_to_cart_action = false) { global $wpdb; $all_required_variations_selected = $no_selected_variation = true; $single_variations = $combined_variations = $product_to_add_to_cart = array(); // Check if all required variations are selected $required_attributes_list = wpshop_prices::check_required_attributes($product_id); foreach ($selected_variation as $k => $value) { if ($value == 0 && in_array($k, $required_attributes_list)) { $all_required_variations_selected = false; } if ($value != 0) { $no_selected_variation = false; } } if (!empty($selected_variation)) { //Check variations configuration $product_variation_configuration = get_post_meta($product_id, '_wpshop_variation_defining', true); // Check variations type $product_variation_type = !empty($product_variation_configuration) && !empty($product_variation_configuration['variation_type']) ? $product_variation_configuration['variation_type'] : 'single'; $product_to_add_to_cart[$product_id]['variation_priority'] = $product_variation_type; //Check defined variation priority $priority = !empty($product_variation_configuration['options']) && !empty($product_variation_configuration['options']['priority'][0]) ? $product_variation_configuration['options']['priority'][0] : 'combined'; $product_to_add_to_cart[$product_id]['defined_variation_priority'] = $priority; // Recover all product variations $query_variation = $selected_variation; // Delete free variations unset($query_variation['free']); if ($product_variation_type == 'single') { // Get single variations $single_variations = array(); foreach ($selected_variation as $attribute_code => $attribute_value) { if (isset($attribute_value) && $attribute_code != 'free') { $query = $wpdb->prepare("SELECT ID FROM " . $wpdb->postmeta . " AS P_META INNER JOIN " . $wpdb->posts . " as P ON ((P.ID = P_META.post_id) AND (P.post_parent = %d)) WHERE P_META.meta_value = '" . serialize(array($attribute_code => $attribute_value)) . "'", $product_id); $single_variation_id = $wpdb->get_var($query); if (!empty($single_variation_id)) { $single_variations[] = $single_variation_id; unset($query_variation[$attribute_code]); } } } } else { // Get combined variations $query = $wpdb->prepare("SELECT ID FROM " . $wpdb->postmeta . " AS P_META INNER JOIN " . $wpdb->posts . " as P ON ((P.ID = P_META.post_id) AND (P.post_parent = %d)) WHERE P_META.meta_key = '_wpshop_variations_attribute_def' AND P_META.meta_value = '" . serialize($query_variation) . "'", $product_id); $combined_variation_id = $wpdb->get_var($query); if (!empty($combined_variation_id)) { $combined_variations[] = $combined_variation_id; } } //If all required variations are not selected if (!$all_required_variations_selected || $no_selected_variation) { $product_to_add_to_cart['text_from'] = 'on'; // If we choose to display lower price variation combinaison if (empty($product_variation_configuration) || !empty($product_variation_configuration) && empty($product_variation_configuration['options']) || !empty($product_variation_configuration) && !empty($product_variation_configuration['options']) && !empty($product_variation_configuration['options']['price_display']) && !empty($product_variation_configuration['options']['price_display']['lower_price'])) { //Get lower price variation combinaison $lower_price_variations = wpshop_prices::check_product_lower_price($product_id); if (!empty($lower_price_variations['variations']) && is_array($lower_price_variations['variations'])) { foreach ($lower_price_variations['variations'] as $lower_price_variation) { $product_to_add_to_cart[$product_id]['variations'][] = $lower_price_variation; } } $product_to_add_to_cart['display_lower_price'] = true; } else { $product_to_add_to_cart[$product_id]['variations'] = array(); } } else { $product_to_add_to_cart['text_from'] = ''; $product_to_add_to_cart[$product_id]['variations'] = !empty($product_variation_type) && $product_variation_type == 'single' ? $single_variations : $combined_variations; } } return $product_to_add_to_cart; }