wordpress - Woocommerce 使用 WC_Geolocation() 按国家/地区自动检测用户货币
问题描述
我正在尝试创建一个功能来根据用户国家/地区强制在网站中使用货币
我已经这样做了,但我的问题是:
如果我将网站货币更改为美元并且用户尝试将货币从货币切换器更改为 SAR
价格金额会改变,但货币是美元,价格也不正确
这是我做的代码
function get_user_geo_country(){
// global $woocommerce;
$geo = new WC_Geolocation(); // Get WC_Geolocation instance object
$user_ip = $geo->get_ip_address(); // Get user IP
$user_geo = $geo->geolocate_ip( $user_ip ); // Get geolocated user data.
$country = $user_geo['country']; // Get the country code
return $country; // return the country name
}
function HF_list_currencies() {
$new_currency_list = new WCML_Multi_Currency();
$active_currencies = $new_currency_list ->get_currencies(true);
$currencies_list = array();
foreach($active_currencies as $key => $val):
$currencies_list[] = $key;
endforeach;
return json_encode( $currencies_list );
}
if ( ! function_exists( 'get_country_currency' ) ) {
/**
* get_country_currency.
*
* 237 countries.
* Two-letter country code (ISO 3166-1 alpha-2) => Three-letter currency code (ISO 4217).
*/
function get_country_currency($code = NULL) {
global $woocommerce;
$currencies = array(
'AF' => 'AFN',
'AL' => 'ALL',
'DZ' => 'DZD',
'AS' => 'USD',
'AD' => 'EUR',
'AO' => 'AOA',
'AI' => 'XCD',
'AQ' => 'XCD',
'AG' => 'XCD',
'AR' => 'ARS',
'AM' => 'AMD',
'AW' => 'AWG',
'AU' => 'AUD',
'AT' => 'EUR',
'AZ' => 'AZN',
'BS' => 'BSD',
'BH' => 'BHD',
'BD' => 'BDT',
'BB' => 'BBD',
'BY' => 'BYR',
'BE' => 'EUR',
'BZ' => 'BZD',
'BJ' => 'XOF',
'BM' => 'BMD',
'BT' => 'BTN',
'BO' => 'BOB',
'BA' => 'BAM',
'BW' => 'BWP',
'BV' => 'NOK',
'BR' => 'BRL',
'IO' => 'USD',
'BN' => 'BND',
'BG' => 'BGN',
'BF' => 'XOF',
'BI' => 'BIF',
'KH' => 'KHR',
'CM' => 'XAF',
'CA' => 'CAD',
'CV' => 'CVE',
'KY' => 'KYD',
'CF' => 'XAF',
'TD' => 'XAF',
'CL' => 'CLP',
'CN' => 'CNY',
'HK' => 'HKD',
'CX' => 'AUD',
'CC' => 'AUD',
'CO' => 'COP',
'KM' => 'KMF',
'CG' => 'XAF',
'CD' => 'CDF',
'CK' => 'NZD',
'CR' => 'CRC',
'HR' => 'HRK',
'CU' => 'CUP',
'CY' => 'EUR',
'CZ' => 'CZK',
'DK' => 'DKK',
'DJ' => 'DJF',
'DM' => 'XCD',
'DO' => 'DOP',
'EC' => 'ECS',
'EG' => 'EGP',
'SV' => 'SVC',
'GQ' => 'XAF',
'ER' => 'ERN',
'EE' => 'EUR',
'ET' => 'ETB',
'FK' => 'FKP',
'FO' => 'DKK',
'FJ' => 'FJD',
'FI' => 'EUR',
'FR' => 'EUR',
'GF' => 'EUR',
'TF' => 'EUR',
'GA' => 'XAF',
'GM' => 'GMD',
'GE' => 'GEL',
'DE' => 'EUR',
'GH' => 'GHS',
'GI' => 'GIP',
'GR' => 'EUR',
'GL' => 'DKK',
'GD' => 'XCD',
'GP' => 'EUR',
'GU' => 'USD',
'GT' => 'QTQ',
'GG' => 'GGP',
'GN' => 'GNF',
'GW' => 'GWP',
'GY' => 'GYD',
'HT' => 'HTG',
'HM' => 'AUD',
'HN' => 'HNL',
'HU' => 'HUF',
'IS' => 'ISK',
'IN' => 'INR',
'ID' => 'IDR',
'IR' => 'IRR',
'IQ' => 'IQD',
'IE' => 'EUR',
'IM' => 'GBP',
'IL' => 'ILS',
'IT' => 'EUR',
'JM' => 'JMD',
'JP' => 'JPY',
'JE' => 'GBP',
'JO' => 'JOD',
'KZ' => 'KZT',
'KE' => 'KES',
'KI' => 'AUD',
'KP' => 'KPW',
'KR' => 'KRW',
'KW' => 'KWD',
'KG' => 'KGS',
'LA' => 'LAK',
'LV' => 'EUR',
'LB' => 'LBP',
'LS' => 'LSL',
'LR' => 'LRD',
'LY' => 'LYD',
'LI' => 'CHF',
'LT' => 'EUR',
'LU' => 'EUR',
'MK' => 'MKD',
'MG' => 'MGF',
'MW' => 'MWK',
'MY' => 'MYR',
'MV' => 'MVR',
'ML' => 'XOF',
'MT' => 'EUR',
'MH' => 'USD',
'MQ' => 'EUR',
'MR' => 'MRO',
'MU' => 'MUR',
'YT' => 'EUR',
'MX' => 'MXN',
'FM' => 'USD',
'MD' => 'MDL',
'MC' => 'EUR',
'MN' => 'MNT',
'ME' => 'EUR',
'MS' => 'XCD',
'MA' => 'MAD',
'MZ' => 'MZN',
'MM' => 'MMK',
'NA' => 'NAD',
'NR' => 'AUD',
'NP' => 'NPR',
'NL' => 'EUR',
'AN' => 'ANG',
'NC' => 'XPF',
'NZ' => 'NZD',
'NI' => 'NIO',
'NE' => 'XOF',
'NG' => 'NGN',
'NU' => 'NZD',
'NF' => 'AUD',
'MP' => 'USD',
'NO' => 'NOK',
'OM' => 'OMR',
'PK' => 'PKR',
'PW' => 'USD',
'PA' => 'PAB',
'PG' => 'PGK',
'PY' => 'PYG',
'PE' => 'PEN',
'PH' => 'PHP',
'PN' => 'NZD',
'PL' => 'PLN',
'PT' => 'EUR',
'PR' => 'USD',
'QA' => 'QAR',
'RE' => 'EUR',
'RO' => 'RON',
'RU' => 'RUB',
'RW' => 'RWF',
'SH' => 'SHP',
'KN' => 'XCD',
'LC' => 'XCD',
'PM' => 'EUR',
'VC' => 'XCD',
'WS' => 'WST',
'SM' => 'EUR',
'ST' => 'STD',
'SA' => 'SAR',
'SN' => 'XOF',
'RS' => 'RSD',
'SC' => 'SCR',
'SL' => 'SLL',
'SG' => 'SGD',
'SK' => 'EUR',
'SI' => 'EUR',
'SB' => 'SBD',
'SO' => 'SOS',
'ZA' => 'ZAR',
'GS' => 'GBP',
'SS' => 'SSP',
'ES' => 'EUR',
'LK' => 'LKR',
'SD' => 'SDG',
'SR' => 'SRD',
'SJ' => 'NOK',
'SZ' => 'SZL',
'SE' => 'SEK',
'CH' => 'CHF',
'SY' => 'SYP',
'TW' => 'TWD',
'TJ' => 'TJS',
'TZ' => 'TZS',
'TH' => 'THB',
'TG' => 'XOF',
'TK' => 'NZD',
'TO' => 'TOP',
'TT' => 'TTD',
'TN' => 'TND',
'TR' => 'TRY',
'TM' => 'TMT',
'TC' => 'USD',
'TV' => 'AUD',
'UG' => 'UGX',
'UA' => 'UAH',
'AE' => 'AED',
'GB' => 'GBP',
'US' => 'USD',
'UM' => 'USD',
'UY' => 'UYU',
'UZ' => 'UZS',
'VU' => 'VUV',
'VE' => 'VEF',
'VN' => 'VND',
'VI' => 'USD',
'WF' => 'XPF',
'EH' => 'MAD',
'YE' => 'YER',
'ZM' => 'ZMW',
'ZW' => 'ZWD',
);
if($code != NULL):
$code = strtoupper($code);
if( isset($currencies[$code]) ):
$currencies_list = json_decode( str_replace('\\', '', HF_list_currencies()), true);
return @!in_array($currencies[$code], $currencies_list) ? get_woocommerce_currency() : $currencies[$code];
// break;
else:
return get_woocommerce_currency();
// break;
endif;
else:
return get_woocommerce_currency();
// break;
endif;
}
}
function currency_detected() {
global $auto_detected_currency;
$auto_detected_currency = isset($_COOKIE['auto_detected_currency']) ? true : false;
}
add_action('after_theme_setup', 'currency_detected');
function geo_client_currency($client_currency){
global $auto_detected_currency, $woocommerce;
if( $auto_detected_currency != 1 ):
// setcookie('auto_detected_currency', 1, time()+3600);
$auto_detected_currency = 1;
$user_country = get_user_geo_country();
$user_currency = get_country_currency( $user_country );
// echo $auto_detected_currency;
$client_currency = $user_currency;
endif;
return $client_currency;
}
add_filter('wcml_client_currency','geo_client_currency');
解决方案
推荐阅读
- linux - 使用 cut 组合 csv 文件以选择一列并粘贴以组合文件
- python - 如何在 Django Rest Framework 中为基于函数的视图添加过滤
- ios - 过多的脏内存
- flutter - 如何实现自定义微调器以在颤动中选择时间
- css - 如何通过 select2 显示完整的大文本选项(没有水平滚动)?参考图片
- php - 具有多态关系的 Laravel 全局访问
- python - GeoPandas 地图:以国家为中心(并在经度 180 度处加入分割几何图形)
- reactjs - 在react redux和saga中调度完成后获取状态变量?
- python - on_click(x, y, button, pressed) 不起作用,分配前引用了局部变量“pressed”
- kubernetes - 如何解决谷歌云上的“所有主机都被其他资源占用”?