追記:
こちらの質問で解決していただきました。
アクセス元の言語設定によってURLを振り分けるPHPのコードがうまく機能しない
ご協力いただきました皆様ありがとうございました。
マルチサイト化した複数のwordpressサイトを、アクセス元の条件によって表示させる方法を知りたいです。
例えば、同じサーバーの中にマルチサイトを利用して、2つのwordpressサイトを作ります。
- A:sample.com
- B:sample.com/en
最初のアクセスに利用するドメインは、Aのsample.comのみで、
- 日本からのアクセスの場合→A:sample.com
- 海外から(日本語設定以外)のアクセスの場合(またはブラウザの検索条件を日本語以外にしている場合)→B:sample.com/en
というように、1つのURLのみの使用で、アクセス元やブラウザーの条件によって、A、Bへアクセスが変わるようにしたいのです。
下記のサイトの解説が参考になりますが、
海外からのアクセスを振り分ける[php]
紹介されているコードは、アクセス元が英語の設定の時に、B:sample.com/enへアクセスされる内容かと思います。
このコードを参考に、アクセス元が日本語の設定の時のみ、A:sample.comへアクセスされ、
日本語以外の設定の時は全て、B:sample.com/enへアクセスされるには、どのようにコードを変えれば良いか知りたいです。
◆参考コード
・A:海外からのアクセスを「php」で判別して振り分ける方法
<?php $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $languages = array_reverse($languages); $result = ''; foreach ($languages as $language) { if (preg_match('/^en/i', $language)) { $result = 'English'; header("Location: /english"); } elseif (preg_match('/^ja/i', $language)) { $result = 'Japanese'; header("Location: /"); } } if ($result == '') { $result = 'Japanese'; header("Location: /"); }
・B:海外用ページから日本語ページにアクセスした時を判別する
<?php $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $languages = array_reverse($languages); $result = ''; foreach ($languages as $language) { if (preg_match('/^en/i', $language)) { $result = 'English'; } elseif (preg_match('/^ja/i', $language)) { $result = 'Japanese'; } } if ($result == '') { $result = 'Japanese'; } if(is_home()){ $lang = $_GET["lang"]; if(!$lang&&$result=='English'){ header("Location: /english?lang=en"); } }
◆追記①
こちらのサイトのコードも参考にすると、
WordPressで多言語サイトを作成し、言語設定によってページをリダイレクトさせる
ブラウザーでアクセスした際に下記のエラーがでます。
サイトに重大なエラーがありました。 WordPress でのデバッグをさらに詳しく見る。
参考コード
$url = str_replace('/jp/', '/us/', $url);
を自分のサイトに対応させるために、
$url = str_replace('/', '/en/', $url);に変えて動作を確認しています。
<?php /* * ブラウザ(スマホの場合は端末)の言語設定を取得 * 言語設定は複数されている可能性があることを考慮 */ $languagesConfigurations = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $languagesConfigurations = array_reverse($languagesConfigurations); $http = is_ssl() ? 'https' . '://' : 'http' . '://'; $url = $http . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; if ($_SESSION["isRedirect"] !== 1) { $_SESSION["isRedirect"] = 1; /* * 言語設定の内容を1つ1つ解析する。 * array_reverseをしているので、 * 1番最後に取り出すデータ=優先度の高い言語設定となる。 * ・言語設定にen,fr,itのいずれかが含まれている場合は、USサイトにリダイレクト * ・言語設定にjaが含まれている場合は、日本語サイトをそのまま表示 * ・あんまりなさそうだが、言語設定が何かの理由で取得できない場合は * 日本語サイトそのまま表示するという設定内容 */ foreach ($languagesConfigurations as $language) { if (preg_match('/^en/i', $language)) { $result = 'English'; $url = str_replace('/jp/', '/us/', $url); // URLのうち/jp/の部分のみを/us/に置き換え } elseif (preg_match('/^ja/i', $language)) { $result = 'Japanese'; } } /* * 英語だった場合はリダイレクト * 日本語だった場合はリダイレクトせずセッションを削除 */ if ($result === 'English') { header("Location: " . $url); } else if ($result === 'Japanese') { unset($_SESSION["isRedirect"]); } else { unset($_SESSION["isRedirect"]); } } else if ($_SESSION["isRedirect"] === 1) { unset($_SESSION["isRedirect"]); }
追記②
回答でいただいたコードはエラーが出ますが、英語設定でアクセスするとリダイレクトはされます。
$url=$_SERVER["SCRIPT_NAME"]; $lang = preg_match("/^ja/",$_SERVER['HTTP_ACCEPT_LANGUAGE'])?"jp":"en"; if($lang=="en" and ! preg_match("/^/en/",$url)){ //修正 header("Location: /en"); exit; }else if($lang=="jp" and preg_match("/^/en/",$url)){ header("Location: /"); exit; }
◆開発環境
CentOS (7 x86_64)
Apache (2.4.6 CentOS)
PHP (7.1.33)
wordpress(5.2.5)
回答2件
あなたの回答
tips
プレビュー