如何在WordPress中将函数输出传递至另一函数(含类方法方案)
WordPress 基于IP国家代码的语言重定向插件修复方案
问题分析
你的代码主要存在以下几个问题导致功能失效:
- HTTP请求方法错误:GeoJS的IP查询接口需要GET请求,但你设置了
CURLOPT_POST => true,导致请求失败无法获取国家代码。 - JSON数据处理冗余:返回的JSON对象可以直接访问属性,无需循环遍历。
- 重定向条件硬编码:判断逻辑写死为检查
fr,没有使用动态获取的国家代码。 - 缺乏错误处理:未处理CURL请求失败、接口返回异常的情况。
- 无重复重定向防护:未判断当前URL是否已包含语言前缀,可能导致无限重定向。
修正后的完整代码
function get_user_country_code() { // 获取用户IP,兼容反向代理场景 $ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; // 处理多个代理IP的情况 $ip = explode(',', $ip)[0]; $ch = curl_init(); $curlConfig = array( CURLOPT_URL => "https://get.geojs.io/v1/ip/country/{$ip}.json", CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_TIMEOUT => 10, // 设置超时时间,避免阻塞 CURLOPT_POST => false, // 改为GET请求 ); curl_setopt_array($ch, $curlConfig); $response = curl_exec($ch); // 处理CURL请求错误 if(curl_errno($ch)) { curl_close($ch); return 'en'; // 请求失败时返回默认语言代码 } curl_close($ch); $data = json_decode($response); // 检查返回数据是否有效 if(!$data || !isset($data->country)) { return 'en'; } // 返回小写的国家代码 return strtolower($data->country); } function atv_redirect() { // 避免在后台或AJAX请求中执行重定向 if(is_admin() || wp_doing_ajax()) { return; } $country_code = get_user_country_code(); // 建立国家代码到语言前缀的映射,可根据需求扩展 $lang_map = array( 'fr' => 'fr', 'us' => 'en', 'gb' => 'en', 'ca' => 'en', // 添加更多国家-语言映射 ); // 获取当前应跳转的语言前缀,默认en $target_lang = isset($lang_map[$country_code]) ? $lang_map[$country_code] : 'en'; $target_prefix = "/{$target_lang}"; $current_uri = $_SERVER['REQUEST_URI']; // 检查当前URL是否已包含目标语言前缀,避免重复重定向 if(preg_match("/^\/{$target_lang}\//i", $current_uri)) { return; } // 检查当前URL是否是根路径,避免重复添加斜杠 $redirect_url = $target_prefix . ($current_uri === '/' ? '' : $current_uri); wp_safe_redirect(home_url($redirect_url), 302); // 使用302临时重定向,利于SEO exit; } add_action('template_redirect', 'atv_redirect');
关键改进点说明
- IP获取优化:兼容反向代理(如Nginx、Cloudflare)场景下的真实IP获取。
- CURL请求修复:改为GET请求,添加超时和错误处理,保证请求稳定性。
- 数据处理简化:直接访问JSON对象属性,避免冗余循环。
- 语言映射逻辑:通过数组建立国家代码到语言的对应关系,便于扩展。
- 重定向防护:判断当前URL是否已包含目标语言前缀,防止无限重定向。
- 场景排除:跳过后台和AJAX请求,避免干扰正常操作。
内容的提问来源于stack exchange,提问作者imagIne
相关产品推荐
相关产品推荐

