geno/wp-content/plugins/ti-woocommerce-wishlist/integrations/uni-woo-custom-product-options.php
2024-02-01 11:54:18 +00:00

279 lines
8.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* TI WooCommerce Wishlist integration with:
*
* @name Product Options and Price Calculation Formulas for WooCommerce Uni CPO
*
* @version 4.9.9.1
*
* @slug uni-woo-custom-product-options
*
* @url https://wordpress.org/plugins/uni-woo-custom-product-options/
*
*/
// If this file is called directly, abort.
if (!defined('ABSPATH')) {
exit;
}
// Load integration depends on current settings.
global $tinvwl_integrations;
$slug = "uni-woo-custom-product-options";
$name = "Product Options and Price Calculation Formulas for WooCommerce Uni CPO";
$available = class_exists('Uni_Cpo');
$tinvwl_integrations = is_array($tinvwl_integrations) ? $tinvwl_integrations : [];
$tinvwl_integrations[$slug] = array(
'name' => $name,
'available' => $available,
);
if (!tinv_get_option('integrations', $slug)) {
return;
}
if (!$available) {
return;
}
if (!function_exists('tinv_wishlist_item_meta_uni_woo_custom_product_options')) {
/**
* Set description for meta Product Options and Price Calculation Formulas for WooCommerce Uni CPO
*
* @param array $meta Meta array.
* @param array $wl_product Wishlist Product.
* @param \WC_Product $product Woocommerce Product.
*
* @return array
*/
function tinv_wishlist_item_meta_uni_woo_custom_product_options($item_data, $product_id, $variation_id)
{
if (class_exists('Uni_Cpo')) {
foreach (array_keys($item_data) as $key) {
if (strpos($key, 'cpo_') === 0) {
unset($item_data[$key]);
}
}
if (!empty($item_data)) {
$options_eval_result = [];
$form_data = array();
$formatted_vars = array();
$variables = array();
$product_data = Uni_Cpo_Product::get_product_data_by_id($product_id);
foreach ($item_data as $key => $value) {
$form_data[$key] = $value['display'];
}
array_walk(
$options_eval_result,
function ($v) use (&$variables, &$formatted_vars, &$nice_names_vars) {
foreach ($v as $slug => $value) {
// prepare $variables for calculation purpose
$variables['{' . $slug . '}'] = $value['calc'];
// prepare $formatted_vars for conditional logic purpose
$formatted_vars[$slug] = $value['cart_meta'];
}
}
);
// non option variables
if ('on' === $product_data['nov_data']['nov_enable']
&& !empty($product_data['nov_data']['nov'])
) {
$variables = uni_cpo_process_formula_with_non_option_vars($variables, $product_data, $formatted_vars);
}
$filtered_form_data = array_filter($form_data, function ($k) use ($form_data) {
return false !== strpos($k, UniCpo()->get_var_slug()) && !empty($form_data[$k]);
}, ARRAY_FILTER_USE_KEY);
if (!empty($filtered_form_data)) {
$posts = uni_cpo_get_posts_by_slugs(array_keys($filtered_form_data));
if (!empty($posts)) {
$posts_ids = wp_list_pluck($posts, 'ID');
foreach ($posts_ids as $post_id) {
$option = uni_cpo_get_option($post_id);
if (is_object($option)) {
$calculate_result = $option->calculate($filtered_form_data);
if (is_array($calculate_result) && isset($calculate_result[$option->get_slug()])) {
if (is_array($calculate_result[$option->get_slug()]['order_meta'])) {
$calculate_result[$option->get_slug()]['order_meta'] = array_map(function ($item) {
if (!is_numeric($item)) {
return esc_html__($item);
} else {
return $item;
}
}, $calculate_result[$option->get_slug()]['order_meta']);
$display_value = implode(', ', $calculate_result[$option->get_slug()]['order_meta']);
} else {
if (!is_numeric($calculate_result[$option->get_slug()]['order_meta'])) {
$display_value = esc_html__($calculate_result[$option->get_slug()]['order_meta']);
} else {
$display_value = $calculate_result[$option->get_slug()]['order_meta'];
}
}
$display_key = uni_cpo_sanitize_label($option->cpo_order_label());
$display_value = uni_cpo_replace_curly(
$display_value,
$formatted_vars,
$product_data,
$variables
);
$display_value = uni_cpo_get_proper_option_label_cart($display_value);
$display_key = uni_cpo_replace_curly(
$display_key,
$formatted_vars,
$product_data,
$variables
);
$display_key = trim($display_key, ' ');
$display_key = uni_cpo_get_proper_option_label_cart($display_key);
$item_data[$option->get_slug()]['display'] = $display_value;
}
$item_data[$option->get_slug()]['key'] = $display_key;
}
}
}
}
}
}
return $item_data;
}
add_filter('tinvwl_wishlist_item_meta_post', 'tinv_wishlist_item_meta_uni_woo_custom_product_options', 10, 3);
}
if (!function_exists('tinvwl_item_price_uni_woo_custom_product_options')) {
/**
* Modify price for Product Options and Price Calculation Formulas for WooCommerce Uni CPO.
*
* @param string $price Returned price.
* @param array $wl_product Wishlist Product.
* @param \WC_Product $product Woocommerce Product.
*
* @return string
*/
function tinvwl_item_price_uni_woo_custom_product_options($price, $wl_product, $product)
{
if (class_exists('Uni_Cpo')) {
$product_data = Uni_Cpo_Product::get_product_data_by_id($product->get_id());
if ('on' === $product_data['settings_data']['calc_enable']) {
$form_data = $wl_product['meta'];
$options_eval_result = array();
$variables = array();
$is_calc_disabled = false;
$formatted_vars = array();
$main_formula = $product_data['formula_data']['main_formula'];
$filtered_form_data = array_filter($form_data, function ($k) use ($form_data) {
return false !== strpos($k, UniCpo()->get_var_slug()) && !empty($form_data[$k]);
}, ARRAY_FILTER_USE_KEY);
if (!empty($filtered_form_data)) {
$posts = uni_cpo_get_posts_by_slugs(array_keys($filtered_form_data));
if (!empty($posts)) {
$posts_ids = wp_list_pluck($posts, 'ID');
foreach ($posts_ids as $post_id) {
$option = uni_cpo_get_option($post_id);
if (is_object($option)) {
$calculate_result = $option->calculate($filtered_form_data);
if (!empty($calculate_result)) {
$options_eval_result[$option->get_slug()] = $calculate_result;
}
}
}
}
}
array_walk($options_eval_result, function ($v) use (&$variables, &$formatted_vars) {
foreach ($v as $slug => $value) {
// prepare $variables for calculation purpose
$variables['{' . $slug . '}'] = $value['calc'];
// prepare $formatted_vars for conditional logic purpose
$formatted_vars[$slug] = $value['cart_meta'];
}
});
$variables['{uni_cpo_price}'] = $product->get_price('edit');
// non option variables
if ('on' === $product_data['nov_data']['nov_enable'] && !empty($product_data['nov_data']['nov'])) {
$variables = uni_cpo_process_formula_with_non_option_vars($variables, $product_data, $formatted_vars);
}
// formula conditional logic
if ('on' === $product_data['formula_data']['rules_enable'] && !empty($product_data['formula_data']['formula_scheme']) && is_array($product_data['formula_data']['formula_scheme'])) {
$conditional_formula = uni_cpo_process_formula_scheme($formatted_vars, $product_data);
if ($conditional_formula) {
$main_formula = $conditional_formula;
}
}
if ('disable' === $main_formula) {
$is_calc_disabled = true;
}
//
if (!$is_calc_disabled) {
$main_formula = uni_cpo_process_formula_with_vars($main_formula, $variables);
// calculates formula
$price_calculated = uni_cpo_calculate_formula($main_formula);
$price_min = $product_data['settings_data']['min_price'];
$price_max = $product_data['settings_data']['max_price'];
// check for min price
if ($price_calculated < $price_min) {
$price_calculated = $price_min;
}
// check for max price
if (!empty($price_max) && $price_calculated >= $price_max) {
$is_calc_disabled = true;
}
if (true !== $is_calc_disabled) {
// filter, so 3rd party scripts can hook up
$price_calculated = apply_filters(
'uni_cpo_in_cart_calculated_price',
$price_calculated,
$product,
$filtered_form_data
);
return wc_price($price_calculated);
} else {
return wc_price($price_max);
}
} else {
return wc_price(0);
}
}
}
return $price;
}
add_filter('tinvwl_wishlist_item_price', 'tinvwl_item_price_uni_woo_custom_product_options', 10, 3);
} // End if().