Перенаправление по стране работает только для пробного сайта, а не для живого сайта

Я пытаюсь: сделать перенаправление на основе 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? я действительно не знаю, что делать дальше ... это так запутанно, поскольку он работает безупречно на моем промежуточном сервере, а не на моем реальном сервере, а код и базы данных идентичны.


person Fruxelot    schedule 04.09.2015    source источник


Ответы (1)


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

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

person andersryanc    schedule 28.04.2016