Страновой редирект работает только на промежуточный сайт, а не на живой сайт

Я пытаюсь:
Выполните перенаправление на основе 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

Решение

Я не проверял их, но вот пара идей:

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 (в случае, если какая-либо задержка в этот поиск), чтобы улучшить скорость загрузки (еще не проверял это время).

0

Другие решения

Других решений пока нет …