0

私はしようとしています: 訪問者の IP に基づいてリダイレクトを行います。私の Web サイトは wpengine でホストされており、IP に基づいてユーザーの国を取得できる GEO 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で行われた設定でしょうか? ここからどこへ行くべきか本当にわかりません...ライブサーバーではなくステージングサーバーで完璧に動作し、コードとデータベースが同一であるため、非常に混乱しています。

4

1 に答える 1

0

私はこれらをテストしていませんが、ここにいくつかのアイデアがあります:

1) 現在の WPML 言語のチェックを追加して、ユーザーが既に EN サイトにいる場合、ユーザーをリダイレクトし続けないようにする必要があるかもしれません。

2)あなたの設定はa$_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 チェックを自分で実装しましたが、もう 1 つ考えられるのは、代わりに 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)。

この 2 番目の例では、最初にユーザーのブラウザー言語をチェックして、ターゲット言語 (この場合は en-AU) が含まれているかどうかを確認します。これにより、GeoIP ルックアップをスキップできる可能性があります (そのルックアップ) を使用して読み込み速度を向上させます (実際にはそのルックアップ時間をまだテストしていません)。

于 2016-04-28T18:26:56.930 に答える