我想: 根据访问者的IP进行重定向,我的网站托管在wpengine,他们有一个GEO IP服务,我可以根据他们的IP获取用户所在的国家/地区。如果您从瑞典,丹麦或挪威访问该网站,您将不会被重定向但留在页面上http://www.centuri.se但如果您不是来自这些国家,您将被重定向到该网站的英文版本翻译成wpml ...所以你将转到这个页面...... http://www.centuri.se/en/这是翻译过的。
我正在使用这段代码进行重定向。
<?php
// THE COOKIE NAME
$cookie_name = "country";
// ACCEPTED COUNTRIES THAT SKIPS THE REDIRECT
$countries = array('se','dk','no');
// CHECK IF YOUR COOKIE IS SET
if (!isset($_COOKIE[$cookie_name])) {
// GET USER INFO
$userInfo = do_shortcode('[geoip-country]');
// GET COUNTRY INTO LOWERCASE
$country = strtolower($userInfo);
//SET COOKIE BASED ON COUNTRY NAME FROM USER
setcookie('country', $country, time() + (3600 * 24 * 30), '/');
if(!in_array($country, $countries)) {
//Set a cookie to tell that this user has been redirected
setcookie('redirect', 1, time() + (3600 * 24 * 30), '/');
wp_redirect( home_url() . '/en/' ); exit;
}
}
?>
在我的wpengine登台服务器上,这个解决方案完美无缺,您可以自己测试http://centuri.staging.wpengine.com但是当这个脚本应用于我的实时服务器时,我被重定向到http://www.centuri.se/en/en并将收到404消息 - 我试图将重定向的一部分从home_url()切换到site_url(),而不是看到任何差异,但如果我在我的实时服务器上这样做,这将给我一个重定向循环。我现在已经对我的直播网站发表了评论,因为它会让我的网站崩溃。
这可能是在WPML中完成的任何设置吗?我真的不知道从哪里开始......它太混乱了,因为它在我的登台服务器上运行完美,而不是我的实时服务器,而且代码和数据库完全相同。
答案 0 :(得分:0)
我没有测试过这些,但是,这里有几个想法:
1)您可能只需要添加对当前WPML语言的检查,以确保一旦用户已经在EN网站上,就不会继续重定向用户。
2)你设置$_COOKIE['redirect']
但没有做任何事情。你可以检查你在哪里检查另一个cookie(我不确定cookie是否会被设置并立即可用,但如果你在循环中重定向)。
<?php
// THE COOKIE NAME
$cookie_name = "country";
// ACCEPTED COUNTRIES THAT SKIPS THE REDIRECT
$countries = array('se','dk','no');
// CHECK IF YOUR COOKIE IS SET
if (
!isset( $_COOKIE[$cookie_name] )
// Check redirect cookie??
// && !isset( $_COOKIE['redirect'] )
) {
// GET USER INFO
$userInfo = do_shortcode('[geoip-country]');
// GET COUNTRY INTO LOWERCASE
$country = strtolower($userInfo);
// SET COOKIE BASED ON COUNTRY NAME FROM USER
setcookie('country', $country, time() + (3600 * 24 * 30), '/');
if (
// Don't redirect if current country is in skip list
!in_array($country, $countries)
// Also Check WPML lang code global to make sure the user
// isn't already on the english site
&& ICL_LANGUAGE_CODE !== 'en'
) {
// Set a cookie to tell that this user has been redirected
setcookie( 'redirect', 1, time() + (3600 * 24 * 30), '/' );
wp_redirect( home_url() . '/en/' ); exit;
}
}
我最近刚刚自己实施了WPEngine GeoIP检查,你可能会考虑另一件事是直接使用他们的PHP类而不是do_shortcode
(看起来这可能对你有用,但这是另一种方法)。
add_action( 'init', 'country_geo_redirect' );
function country_geo_redirect() {
$geo = WPEngine\GeoIp::instance();
$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
if (
!is_admin() && // Let's not redirect the admin panel
!in_array( $GLOBALS['pagenow'], array( 'wp-login.php', 'wp-register.php' ) ) &&
$_SERVER['HTTP_HOST'] !== 'example.com.au' && // Make sure we aren't already on this domain
(
strpos( strtolower( $lang ), 'en-au' ) > -1 // Check the user's browser languages for what we are targeting
|| $geo->country() == 'AU' // Fallback to using WPEngine's GeoIP Check if Browser lang doesn't include en-AU
)
) {
wp_redirect( 'http://example.com' . $_SERVER['REQUEST_URI'] , 301 );
exit;
}
}
你必须记住,使用他们的班级($geo = WPEngine\GeoIp::instance();
)时,它无法确定用户的国家/地区,除非它在init
行动中运行(如果你直接运行它)在您的functions.php文件中,$country = $geo->country();
将返回NULL
)。
在第二个例子中,我还首先检查用户的浏览器语言,看它是否包含目标语言(在这种情况下为en-AU),以便我可以跳过GeoIP查找(如果有的话)该查找中的任何延迟)以提高加载速度(尚未实际测试该查找时间)。