PluginProbe ʕ •ᴥ•ʔ
WPML Multilingual & Multicurrency for WooCommerce / trunk
WPML Multilingual & Multicurrency for WooCommerce vtrunk
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 1 month ago Factory.php 1 month ago JobHooks.php 1 month ago MulticurrencyHooks.php 1 month ago class-wcml-composite-products.php 1 month 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