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

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

新規登録して質問してみよう
ただいま回答率
85.37%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

4187閲覧

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

tomaa

総合スコア84

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/03/17 06:48

編集2020/03/18 12:26

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/03/17 07:31

どのレベルの質問かわからないのですが、PHPの読み書きはできますか?
tomaa

2020/03/17 07:33

PHPの読み書きはできません。ですので、参考のコードをコピペして利用したいと思っています。
otn

2020/03/17 07:40

これらコードを、どのファイルのどこに追加して、とかは分かっているのでしょうか? Accept-Languageに en が入ってないことは考えられないので、このままでもいいと思いますが。
tomaa

2020/03/17 09:46 編集

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

2020/03/17 09:45

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

2020/03/17 09:47

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

回答2

0

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

投稿2020/03/17 07:06

yambejp

総合スコア116468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomaa

2020/03/17 07:11

ご回答ありがとうございます。今回は質問の仕様のとおりで、ユーザー言語を選ぶウェルカムページ無しで、ブラウザーの言語設定等を条件にしたい状況です。
yambejp

2020/03/17 07:59 編集

振り分け的にこんな感じですかね $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; }
tomaa

2020/03/17 07:54 編集

今試してみたのですが、日本語の設定でブラウザー(chrome)からアクセスすると、通常どおり表示されますが、 英語の設定でブラウザー(chrome)からアクセスすると、sample.com/enにリダイレクトされて、以下のエラーがでます。 This page isn’t working sample.com redirected you too many times. Try clearing your cookies. ERR_TOO_MANY_REDIRECTS
yambejp

2020/03/17 07:53 編集

$url=$_SERVER["SCRIPT_NAME"]; $lang = preg_match("/^ja/",$_SERVER['HTTP_ACCEPT_LANGUAGE'])?"jp":"en"; print_r([$url,$lang,$_SERVER['HTTP_ACCEPT_LANGUAGE']]); だとなんて表示されますか? (urlの方は不味そうなデータはマスクしてもらって結構です)
tomaa

2020/03/17 07:55

すみません、今、前回のコメントを修正しました。英語の設定でアクセスすると、エラーがでます。
yambejp

2020/03/17 08:01

ごめんなさい、パターン文字が間違ってました
KazuhiroHatano

2020/03/17 08:07

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

2020/03/17 08:09 編集

$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) となります。 ※表示されているコードはコピーできず手打ちしましたので、スペース等は実際のものと違うかもしれません。
tomaa

2020/03/17 13:55

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

0

ベストアンサー

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

Aの場合:

PHP

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

Bの場合:

PHP

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

投稿2020/03/17 09:54

otn

総合スコア85778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomaa

2020/03/17 10:13

ご回答ありがとうございます。教えていただいたコードでためしたのですが、英語の言語設定にしてもリダイレクトされませんでした。 リンクを貼っているサイトのコードのままでもリダイレクトされませんでした(URLは調整済み)
tomaa

2020/03/17 10:31

質問に追記しましたが、他のコードを参考にすると、エラーが出てしまいます。
otn

2020/03/17 10:57

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

2020/03/17 13:12 編集

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

2020/03/17 13:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問