2022/CVE-2022-0412/vultarget/ti-woocommerce-wishlist/integrations/woocommerce-custom-fields.php
<?php
/**
 * TI WooCommerce Wishlist integration with:
 *
 * @name WooCommerce Custom Fields
 *
 * @version 2.3.2
 *
 * @slug woocommerce-custom-fields
 *
 * @url https://codecanyon.net/item/woocommerce-custom-fields/11332742
 *
 */

// If this file is called directly, abort.
if (!defined('ABSPATH')) {
	exit;
}

// Load integration depends on current settings.
global $tinvwl_integrations;

$slug = "woocommerce-custom-fields";

$name = "WooCommerce Custom Fields";

$available = class_exists('WCCF');

$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('tinvwl_item_price_woocommerce_custom_fields')) {

	/**
	 * Modify price for WooCommerce Custom Fields.
	 *
	 * @param string $price Returned price.
	 * @param array $wl_product Wishlist Product.
	 * @param \WC_Product $product Woocommerce Product.
	 *
	 * @return string
	 */
	function tinvwl_item_price_woocommerce_custom_fields($price, $wl_product, $product)
	{

		if (class_exists('WCCF') && isset($wl_product['meta']['wccf']['product_field'])) {

			$posted = array();

			foreach ($wl_product['meta']['wccf']['product_field'] as $key => $value) {
				$posted[$key] = array('value' => $value);
			}

			$price = wc_price(WCCF_Pricing::get_adjusted_price($product->get_price(), $wl_product['product_id'], $wl_product['variation_id'], $posted, 1, false, false, $product, false));
		}

		return $price;
	}

	add_filter('tinvwl_wishlist_item_price', 'tinvwl_item_price_woocommerce_custom_fields', 10, 3);
} // End if().

if (!function_exists('tinv_wishlist_item_meta_woocommerce_custom_fields')) {

	/**
	 * Set description for meta  WooCommerce Custom Fields
	 *
	 * @param array $meta Meta array.
	 * @param array $wl_product Wishlist Product.
	 * @param \WC_Product $product Woocommerce Product.
	 *
	 * @return array
	 */
	function tinv_wishlist_item_meta_woocommerce_custom_fields($item_data, $product_id, $variation_id)
	{

		if (class_exists('WCCF') && isset($item_data['wccf'])) {

			$id = ($variation_id) ? $variation_id : $product_id;
			$product = wc_get_product($id);
			if ($product) {

				// Get fields to save values for
				$fields = WCCF_Product_Field_Controller::get_filtered(null, array(
					'item_id' => $product_id,
					'child_id' => $variation_id,
				));

				// Set quantity
				$quantity = 1;
				$quantity_index = null;
				$display_pricing = null;

				// Check if pricing can be displayed for this product
				if ($display_pricing === null) {
					$display_pricing = !WCCF_WC_Product::skip_pricing($product);
				}

				foreach ($fields as $field) {

					// Check how many times to iterate the same field (used for quantity-based product fields)
					if ($quantity_index !== null) {
						$iterations = ($quantity_index + 1);
						$i = $quantity_index;
					} else {
						$iterations = ($field->is_quantity_based() && $quantity) ? $quantity : 1;
						$i = 0;
					}

					// Start iteration of the same field
					for ($i = $i; $i < $iterations; $i++) {

						// Get field id
						$field_id = $field->get_id() . ($i ? ('_' . $i) : '');

						// Special handling for files
						if ($field->field_type_is('file')) {
							//just skip this field type because we can't save uploaded data.
						} // Handle other field values
						else {

							// Check if any data for this field was posted or is available in request query vars for GET requests
							if (isset($item_data['wccf']['display']['product_field'][$field_id])) {

								// Get field value
								if (isset($item_data['wccf']['display']['product_field'][$field_id])) {
									$field_value = $item_data['wccf']['display']['product_field'][$field_id];
								}

								// Prepare multiselect field values
								if ($field->accepts_multiple_values()) {

									// Ensure that value is array
									$value = !RightPress_Help::is_empty($field_value) ? (array)$field_value : array();

									// Filter out hidden placeholder input value
									$value = array_filter((array)$value, function ($test_value) {
										return trim($test_value) !== '';
									});
								} else {
									$value = stripslashes(trim($field_value));
								}

								$item_data[] = array(
									'key' => $field->get_label(),
									'display' => $field->format_display_value(array('value' => $value), $display_pricing),
								);

							}
						}
					}
				}

				unset($item_data['wccf']);
				unset($item_data['wccf_ignore']);
			}
		}

		return $item_data;
	}

	add_filter('tinvwl_wishlist_item_meta_post', 'tinv_wishlist_item_meta_woocommerce_custom_fields', 10, 3);
} // End if().
