geno/wp-content/plugins/ti-woocommerce-wishlist/integrations/uni-woo-custom-product-options.php

280 lines
8.5 KiB
PHP
Raw Normal View History

2024-02-01 17:24:18 +05:30
<?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().