You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WordPress中将函数输出传递至另一函数(含类方法方案)

WordPress 基于IP国家代码的语言重定向插件修复方案

问题分析

你的代码主要存在以下几个问题导致功能失效:

  1. HTTP请求方法错误:GeoJS的IP查询接口需要GET请求,但你设置了CURLOPT_POST => true,导致请求失败无法获取国家代码。
  2. JSON数据处理冗余:返回的JSON对象可以直接访问属性,无需循环遍历。
  3. 重定向条件硬编码:判断逻辑写死为检查fr,没有使用动态获取的国家代码。
  4. 缺乏错误处理:未处理CURL请求失败、接口返回异常的情况。
  5. 无重复重定向防护:未判断当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:43:34