質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

①日本語と、②日本語以外の、2つの条件で振り分けるPHPのコードを知りたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,015

score 62

追記:
こちらの質問で解決していただきました。
アクセス元の言語設定によって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)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tomaa

    2020/03/17 16:43 編集

    コメントありがとうございます。wp-content > themes > テーマのフォルダ > functions.phpの最初の部分(<?php以下)で対応します。

    キャンセル

  • otn

    2020/03/17 18:45

    追加で聞くのなら質問に追記したほうがいいです。

    キャンセル

  • tomaa

    2020/03/17 18:47

    コード追加で、動作の確認はとれています。さきほどのコメントを編集しました。

    キャンセル

回答 2

+2

言語を指定するページを作成し、ユーザーに任意に選ばせることが肝要です。
選んだ言語はセッションにとっておけばよいでしょう。
言語選択ページは各ページからアイコンでリンクを貼ったり工夫してください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/17 17:07

    質問のコード見て解っちゃいたけどそりゃ無限ループするよね
    リダイレクトしてきたアクセスなのかそうでないのかを判別したり
    言語環境とURLが一致してればリダイレクトしないようにもしてないのだから

    キャンセル

  • 2020/03/17 17:07 編集

    $url=$_SERVER["SCRIPT_NAME"];
    $lang = preg_match("/^ja/",$_SERVER['HTTP_ACCEPT_LANGUAGE'])?"jp":"en";
    print_r([$url,$lang,$_SERVER['HTTP_ACCEPT_LANGUAGE']]);
    こちらに変えて試してみました。

    英語設定の場合:
    Array ( [0] => / index.php [1] => en [2] => en-US, en; q = 0.9, ja; q = 0.8)

    日本語設定の場合:
    Array ( [0] => / index.php [1] => jp [2] => ja, en-US; q = 0.9, en; q = 0.8)

    となります。
    ※表示されているコードはコピーできず手打ちしましたので、スペース等は実際のものと違うかもしれません。

    キャンセル

  • 2020/03/17 22:55

    ご協力ありがとうございました。
    元々、あるコードの改良をしたいという内容で質問させてもらっていましたが、改良の元のコード自体もうまく動きませんので、新しい質問を立てさせてもらいました。
    https://teratail.com/questions/247776

    キャンセル

checkベストアンサー

+1

参考コード(wordpressは知らないので正しいかどうか知りませんが)で、Accept-Languagejaenもないとき以外は期待通りに動いているなら、

Aの場合:

if ($result == '') {
  $result = 'Japanese'; <= これを 'English' に
  header("Location: /");
}


Bの場合:

if ($result == '') {
  $result = 'Japanese'; <= これを 'English' に
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/17 19:57

    私の回答は、
    > Accept-Languageにjaもenもないとき以外は期待通りに動いているなら、
    という前提です。
    > コード追加で、動作の確認はとれています。
    というコメントだったので。

    キャンセル

  • 2020/03/17 20:07 編集

    >これらコードを、どのファイルのどこに追加して、とかは分かっているのでしょうか?
    の答えとして、コード追加で、動作の確認はとれています。とコメントしていました(最初の回答のコードをfunctions.phpに加えると、そのコードの動作をするため)
    私の勘違いがあって申し訳ありませんでした。

    キャンセル

  • 2020/03/17 22:55

    ご協力ありがとうございました。
    元々、あるコードの改良をしたいという内容で質問させてもらっていましたが、改良の元のコード自体もうまく動きませんので、新しい質問を立てさせてもらいました。
    https://teratail.com/questions/247776

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る