WordPress GeoIP场景下PHP header重定向忽略$redirectedBefore条件问题
问题根因
你代码的核心问题有3个:
- 没有判断当前访问的路径是否已经是德语版
/de/,如果这段重定向逻辑是全局加载的,那么就算跳转到德语页,也会重复触发判断逻辑 setcookie()设置的Cookie无法在当前请求的$_COOKIE全局变量中读取,只有下一次浏览器发起请求时才会携带该Cookie- 你的Cookie取值只有固定值
1,无法区分用户主动选择的语言偏好,比如用户主动切回英文站的需求无法被识别
修复方案
修改后的代码如下:
<?php require( dirname( __FILE__ ) . '/wp-load.php' ); // 先获取当前访问的路径,避免在德语页重复跳转 $current_path = $_SERVER['REQUEST_URI']; // 已经在德语站的情况下直接跳过逻辑 if (strpos($current_path, '/de/') === 0) { return; } $country = do_shortcode( '[geoip-country]' ); $redirectedBefore = isset($_COOKIE['langPref']); // 如果用户主动选了英文,直接跳过跳转 if ($redirectedBefore && $_COOKIE['langPref'] == 'en') { return; } if ( $country == 'DE' && !$redirectedBefore ) { setcookie("langPref", "de", 0, "/"); header("Location: /de/"); exit; } // 非德国用户、或者已经有偏好的用户,默认不跳转,需要切德语可以手动点击 // 注意:用户点击切换英文按钮的逻辑里,需要加一句 setcookie("langPref", "en", 0, "/"); ?>
额外注意事项
- 你之前写的
dirname( FILE )是错误的,魔术常量需要加双下划线,应该是dirname( __FILE__ ),否则会报未定义常量的错误 - 英文站点上的「切换到德语」按钮、德语站点上的「切换到英文」按钮,点击时需要单独设置
langPref的Cookie值为对应语言标识,保证用户主动选择的优先级高于地域自动判断
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

