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 / classes / multi-currency / geolocation / Geolocation.php
woocommerce-multilingual / classes / multi-currency / geolocation Last commit date
Geolocation.php 1 week ago GeolocationBackendHooks.php 4 years ago GeolocationFrontendHooks.php 4 years ago
Geolocation.php
110 lines
1 <?php
2
3 namespace WCML\MultiCurrency;
4
5 use WPML\FP\Fns;
6 use WPML\FP\Obj;
7 use WPML\FP\Relation;
8 use WPML\FP\Logic;
9
10 class Geolocation {
11
12 const DEFAULT_COUNTRY_CURRENCY_CONFIG = '/res/geolocation/country-currency.json';
13
14 const MODE_BY_LANGUAGE = Settings::MODE_BY_LANGUAGE;
15 const MODE_BY_LOCATION = Settings::MODE_BY_LOCATION;
16
17 public static function isUsed() {
18 global $woocommerce_wpml;
19
20 $useDefaultCurrencyByLocation = function() use ( $woocommerce_wpml ) {
21 return (bool) wpml_collect( $woocommerce_wpml->get_setting( 'default_currencies', [] ) )
22 ->first( Relation::equals( 'location' ) );
23 };
24
25 return wcml_is_multi_currency_on()
26 && ( Settings::isModeByLocation() || $useDefaultCurrencyByLocation() );
27 }
28
29 private static function getCountryByUserIp() {
30 wp_cache_add_non_persistent_groups( __CLASS__ );
31
32 $isResolved = Logic::complement( Relation::equals( false ) );
33 $key = 'country';
34 $country = wp_cache_get( $key, __CLASS__ );
35
36 if ( ! $isResolved( $country ) ) {
37 $geolocationData = \WC_Geolocation::geolocate_ip( \WC_Geolocation::get_ip_address(), true );
38 $country = Obj::propOr( false, 'country', $geolocationData );
39
40 if ( $isResolved( $country ) ) {
41 wp_cache_add( $key, (string) $country, __CLASS__ );
42 }
43 }
44
45 return (string) $country;
46 }
47
48 private static function parseConfigFile() {
49 $config = [];
50 $configuration_file = WCML_PLUGIN_PATH . self::DEFAULT_COUNTRY_CURRENCY_CONFIG;
51
52 if ( file_exists( $configuration_file ) ) {
53 $json_content = file_get_contents( $configuration_file );
54 $config = json_decode( $json_content, true );
55 }
56
57 return $config;
58 }
59
60 public static function getOfficialCurrencyCodeByCountry( $country ) {
61 return Obj::prop( $country, self::parseConfigFile() );
62 }
63
64 public static function getUserCountry(){
65 if ( defined( 'WCML_GEOLOCATED_COUNTRY' ) ) {
66 return WCML_GEOLOCATED_COUNTRY;
67 }
68
69 $allUserCountries = [
70 'billing' => self::getUserCountryByAddress( 'billing' ),
71 'shipping' => self::getUserCountryByAddress( 'shipping' ),
72 'geolocation' => self::getCountryByUserIp()
73 ];
74
75 $userCountry = $allUserCountries['billing'] ?: $allUserCountries['geolocation'];
76
77 return apply_filters( 'wcml_geolocation_get_user_country', $userCountry, $allUserCountries );
78 }
79
80 private static function getUserCountryByAddress( $addressType ){
81 $orderCountry = self::getUserCountryFromOrder( $addressType );
82
83 if( $orderCountry ){
84 return $orderCountry;
85 }
86
87 $current_user_id = get_current_user_id();
88
89 if ( $current_user_id ) {
90 $customer = new \WC_Customer( $current_user_id, (bool) WC()->session );
91
92 return 'shipping' === $addressType ? $customer->get_shipping_country() : $customer->get_billing_country();
93 }
94
95 return '';
96 }
97
98 private static function getUserCountryFromOrder( $addressType ) {
99 $country = '';
100 $isWcAjax = Relation::propEq( 'wc-ajax', Fns::__, $_GET );
101
102 if ( $isWcAjax( 'update_order_review' ) && isset( $_POST['country'] ) ) {
103 $country = $_POST['country'];
104 } elseif ( $isWcAjax( 'checkout' ) && isset( $_POST[ $addressType . '_country' ] ) ) {
105 $country = $_POST[ $addressType . '_country' ];
106 }
107
108 return wc_clean( wp_unslash( $country ) );
109 }
110 }