PluginProbe ʕ •ᴥ•ʔ
WPML Multilingual & Multicurrency for WooCommerce / 5.5.7
WPML Multilingual & Multicurrency for WooCommerce v5.5.7
5.5.7 5.3.8 5.3.9 5.4.3 5.4.4 5.4.5 5.5.1 5.5.1.1 5.5.2.2 5.5.2.3 5.5.3 5.5.3.1 5.5.4 5.5.5 5.5.6 trunk 0.9 1.0 1.1 1.2 1.3 1.4 1.5 2.0 2.2 2.3 2.3.1 2.3.2 3.0 3.0.1 3.1 3.2 3.2.1 3.2.2 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.4 3.4.1 3.4.2 3.4.3 3.5 3.5.1 3.5.2 3.5.3 3.5.4 3.5.5 3.6 3.6.1 3.6.10 3.6.11 3.6.2 3.6.3 3.6.4 3.6.5 3.6.5.1 3.6.6 3.6.7 3.6.8 3.6.9 3.7 3.7.1 3.7.10 3.7.11 3.7.12 3.7.13 3.7.14 3.7.15 3.7.16 3.7.2 3.7.3 3.7.4 3.7.5 3.7.6 3.7.7 3.7.8 3.7.9 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.9.0 3.9.1 3.9.1.1 3.9.2 3.9.3 3.9.4 3.9.5 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.10.4 4.11.2 4.11.3.2 4.11.5 4.11.6 4.12.1 4.12.4 4.12.5 4.12.6 4.2.0 4.2.0.1 4.2.1 4.2.1.1 4.2.10 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.7.1 4.2.8 4.2.8.1 4.2.9 4.3.0 4.3.1 4.3.2 4.3.2.1 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.4.0 4.4.1 4.4.2 4.4.2.1 4.5.0 4.6.0 4.6.1 4.6.2 4.6.2.1 4.6.3 4.6.5 4.6.6 4.6.7 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 4.8.0 4.9.0 4.9.1 5.0.1 5.0.2 5.1.1 5.1.2 5.1.3 5.2.0 5.2.1 5.3.2 5.3.3.1 5.3.4 5.3.5 5.3.6 5.3.7
woocommerce-multilingual / compatibility / WcCompositeProducts / MulticurrencyHooks.php
woocommerce-multilingual / compatibility / WcCompositeProducts Last commit date
CompositedProductHooks.php 4 weeks ago Factory.php 4 weeks ago JobHooks.php 4 weeks ago MulticurrencyHooks.php 4 weeks ago class-wcml-composite-products.php 4 weeks ago
MulticurrencyHooks.php
97 lines
1 <?php
2
3 namespace WCML\Compatibility\WcCompositeProducts;
4
5 use WCML_Compatibility_Helper;
6
7 class MulticurrencyHooks implements \IWPML_Action {
8
9 const PRICE_FILTERS_PRIORITY_AFTER_COMPOSITE = 99;
10
11 private $woocommerce_wpml;
12
13 public function __construct( \woocommerce_wpml $woocommerce_wpml ) {
14 $this->woocommerce_wpml = $woocommerce_wpml;
15 }
16
17 public function add_hooks() {
18 if ( is_admin() ) {
19 add_action( 'wcml_after_save_custom_prices', [ $this, 'update_composite_custom_prices' ], 10, 4 );
20 } else {
21 add_filter( 'get_post_metadata', [ $this, 'filter_composite_product_cost' ], 10, 3 );
22 $this->add_price_rounding_filters();
23 }
24 }
25
26 public function update_composite_custom_prices( $productId, $productPrice, $customPrices, $code ){
27 if( WCML_Compatibility_Helper::get_product_type( $productId ) === 'composite' ) {
28 update_post_meta( $productId, '_bto_base_regular_price' . '_' . $code, $customPrices['_regular_price' ] );
29 update_post_meta( $productId, '_bto_base_sale_price' . '_' . $code, $customPrices['_sale_price' ] );
30 update_post_meta( $productId, '_bto_base_price' . '_' . $code, $productPrice );
31 }
32 }
33
34 public function filter_composite_product_cost( $value, $objectId, $metaKey ) {
35 if ( in_array( $metaKey, [
36 '_bto_base_regular_price',
37 '_bto_base_sale_price',
38 '_bto_base_price'
39 ] ) ) {
40 $original_id = $this->woocommerce_wpml->products->get_original_product_id( $objectId );
41
42 $cost_status = get_post_meta( $original_id, '_wcml_custom_prices_status', true );
43
44 $currency = $this->woocommerce_wpml->multi_currency->get_client_currency();
45
46 if ( $currency === wcml_get_woocommerce_currency_option() ) {
47 return $value;
48 }
49
50 $cost = get_post_meta( $original_id, $metaKey . '_' . $currency, true );
51
52 if ( $cost_status && ! empty( $cost ) ) {
53 return $cost;
54 } else {
55 remove_filter( 'get_post_metadata', [ $this, 'filter_composite_product_cost' ], 10 );
56
57 $cost = get_post_meta( $original_id, $metaKey, true );
58
59 add_filter( 'get_post_metadata', [ $this, 'filter_composite_product_cost' ], 10, 3 );
60
61 if ( $cost ){
62 return $this->woocommerce_wpml->multi_currency->prices->convert_price_amount( $cost, $currency );
63 }
64 }
65 }
66
67 return $value;
68 }
69
70 public function add_price_rounding_filters() {
71 $filters = [
72 'woocommerce_product_get_price',
73 'woocommerce_product_get_sale_price',
74 'woocommerce_product_get_regular_price',
75 'woocommerce_product_variation_get_price',
76 'woocommerce_product_variation_get_sale_price',
77 'woocommerce_product_variation_get_regular_price'
78 ];
79
80 foreach( $filters as $filter ){
81 add_filter( $filter, [ $this, 'apply_rounding_rules' ], self::PRICE_FILTERS_PRIORITY_AFTER_COMPOSITE );
82 }
83 }
84
85 public function apply_rounding_rules( $price ) {
86 if ( $price && is_composite_product() ) {
87 $current_currency = $this->woocommerce_wpml->multi_currency->get_client_currency();
88
89 if ( $current_currency !== wcml_get_woocommerce_currency_option() ) {
90 $price = $this->woocommerce_wpml->multi_currency->prices->apply_rounding_rules( $price, $current_currency );
91 }
92 }
93
94 return $price;
95 }
96 }
97