/** * Returns the following arrays: * * 1. $scenarios - contains all scenario ids. * 2. $scenario_settings - includes scenario actions and masked components in scenarios. * 3. $scenario_data - maps every product/variation in a group to the scenarios where it is active. * 4. $defaults_in_scenarios - the scenarios where all default component selections coexist. * * @param array $bto_scenario_meta scenarios meta * @param array $bto_data component data - values may contain a 'current_component_options' key to generate scenarios for a subset of all component options * @return array */ public static function build_scenarios($bto_scenario_meta, $bto_data) { $scenarios = empty($bto_scenario_meta) ? array() : array_map('strval', array_keys($bto_scenario_meta)); $common_scenarios = $scenarios; $scenario_data = array(); $scenario_settings = array(); $compat_group_count = 0; // Store the 'actions' associated with every scenario. foreach ($scenarios as $scenario_id) { $scenario_settings['scenario_actions'][$scenario_id] = array(); if (isset($bto_scenario_meta[$scenario_id]['scenario_actions'])) { $actions = array(); foreach ($bto_scenario_meta[$scenario_id]['scenario_actions'] as $action_name => $action_data) { if (isset($action_data['is_active']) && $action_data['is_active'] === 'yes') { $actions[] = $action_name; if ($action_name === 'compat_group') { $compat_group_count++; } } } $scenario_settings['scenario_actions'][$scenario_id] = $actions; } else { $scenario_settings['scenario_actions'][$scenario_id] = array('compat_group'); $compat_group_count++; } } $scenario_settings['scenario_actions']['0'] = array('compat_group'); // Find which components in every scenario are 'non shaping components' (marked as unrelated). if (!empty($bto_scenario_meta)) { foreach ($bto_scenario_meta as $scenario_id => $scenario_single_meta) { $scenario_settings['masked_components'][$scenario_id] = array(); foreach ($bto_data as $group_id => $group_data) { if (isset($scenario_single_meta['modifier'][$group_id]) && $scenario_single_meta['modifier'][$group_id] === 'masked') { $scenario_settings['masked_components'][$scenario_id][] = (string) $group_id; } } } } $scenario_settings['masked_components']['0'] = array(); // Include the '0' scenario for use when no 'compat_group' scenarios exist. if ($compat_group_count === 0) { $scenarios[] = '0'; } // Map each product and variation to the scenarios that contain it. foreach ($bto_data as $group_id => $group_data) { $scenario_data[$group_id] = array(); // 'None' option. if ($group_data['optional'] === 'yes') { $scenarios_for_product = self::get_scenarios_for_product($bto_scenario_meta, $group_id, -1, '', 'none'); $scenario_data[$group_id][0] = $scenarios_for_product; } // Component options. // When indicated, build scenarios only based on a limited set of component options. if (isset($bto_data[$group_id]['current_component_options'])) { $component_options = $bto_data[$group_id]['current_component_options']; // Otherwise run a query to get all component options. } else { $component_options = WC_CP()->api->get_component_options($group_data); } foreach ($component_options as $product_id) { if (!is_numeric($product_id)) { continue; } // Get product type. $terms = get_the_terms($product_id, 'product_type'); $product_type = !empty($terms) && isset(current($terms)->name) ? sanitize_title(current($terms)->name) : 'simple'; if ($product_type === 'variable') { $variations = WC_CP_Helpers::get_product_variations($product_id); if (!empty($variations)) { $scenarios_for_product = array(); foreach ($variations as $variation_id) { $scenarios_for_variation = self::get_scenarios_for_product($bto_scenario_meta, $group_id, $product_id, $variation_id, 'variation'); $scenarios_for_product = array_merge($scenarios_for_product, $scenarios_for_variation); $scenario_data[$group_id][$variation_id] = $scenarios_for_variation; } $scenario_data[$group_id][$product_id] = array_values(array_unique($scenarios_for_product)); } } else { $scenarios_for_product = self::get_scenarios_for_product($bto_scenario_meta, $group_id, $product_id, '', $product_type); $scenario_data[$group_id][$product_id] = $scenarios_for_product; } } if (isset($group_data['default_id']) && $group_data['default_id'] !== '') { if (!empty($scenario_data[$group_id][$group_data['default_id']])) { $common_scenarios = array_intersect($common_scenarios, $scenario_data[$group_id][$group_data['default_id']]); } else { $common_scenarios = array(); } } } return array('scenarios' => $scenarios, 'scenario_settings' => $scenario_settings, 'scenario_data' => $scenario_data, 'defaults_in_scenarios' => $common_scenarios); }
/** * @deprecated 3.5.0 */ public function get_product_variations($item_id) { _deprecated_function('WC_CP_API::get_product_variations()', '3.5.0', 'WC_CP_Helpers::get_product_variations()'); return WC_CP_Helpers::get_product_variations($item_id); }