サポート » プラグイン » プラグインBOGOを使用してのユーザー言語判別と転送について

  • 解決済 Yuji Simada

    (@yuji-simada)


    はじめまして。最近ワードプレスでサイトを作り始めたものです。
    現在は多言語対応のサイトを作る予定をしております。
    私のレベル的には自作のHTML5のレスポンシブ対応で作る、PHPのプログラムは一応作れる、ワードプレスについては仕組みをあまり分かっていないという程度です。
    また、ロケールやWPのリライトルールなどに関してもあまり分かっていません。
    実現したいプログラムは日本以外の方がサイトを閲覧された場合は英語のインデックスページを自動的に参照し、日本の方がサイトを閲覧された場合は日本のインデックスページを参照しにいくというものです。

    最近、プラグインの「BOGO」を使用して、テストでサイトを作ってみました。
    確かに日本語のページと英語のページがヒモづいていて、日本語のページを参照したときに英語のボタンを押せば英語表示のページが表示されるようになりました。
    しかし、私が実現したいのは日本以外の方が例えばインデックスページを見に来た場合に英語のインデックスページにリダイレクトされるような仕組みがあればいいな、と思っております。
    別のテストサイトで以下のようなPHPプログラムを入れればブラウザの主言語を判別してリダイレクトして日本語、あるいは英語のページに飛ぶことは検証できました。
    <?php
    // Usage: $a = ブラウザが発行する言語コード
    // ※ $_SERVER[‘HTTP_ACCEPT_LANGUAGE’] に代入されている
    // 言語名の統一を行う。
    function langcode01($a){
    $lang = substr($a, 0, 2); // ※ドイツ語類はすべて “de” を返す
    // アラビア語 ?????
    if($lang == “ar”) { $b = “ar”; } // アラビア語
    // ドイツ語 ??????
    if($lang == “de”) { $b = “de”; } // ドイツ語
    // 英語 ???????
    if($lang == “en”) { $b = “en”; } // 英語
    // スペイン語 ?????
    if($lang == “es”) { $b = “es”; } // スペイン語
    // フランス語 ?????
    if($lang == “fr”) { $b = “fr”; } // フランス語
    // イタリア語 ?????
    if($lang == “it”) { $b = “it”; } // イタリア語
    // オランダ語 ?????
    if($lang == “nl”) { $b = “nl”; } // オランダ語
    // ノルウェー語 ????-
    if($lang == “nn”) { $b = “nn”; } // ノルウェー語
    if($lang == “nb”) { $b = “nn”; } // ノルウェー語
    if($lang == “no”) { $b = “nn”; } // ノルウェー語
    // ポルトガル語 ????-
    if($lang == “pt”) { $b = “pt”; } // ポルトガル語
    // ルーマニア語 ????-
    if($lang == “ro”) { $b = “ro”; } // ルーマニア語
    // ロシア語 ??????
    if($lang == “ru”) { $b = “ru”; } // ロシア語
    // セルビア語 ?????
    if($lang == “sr”) { $b = “sr”; } // セルビア語/キリル
    // スウェーデン語 ????
    if($lang == “sv”) { $b = “sv”; } // スウェーデン語
    // ウズベク語 ?????
    if($lang == “uz”) { $b = “uz”; } // ウズベク語/キリル
    // 中国語 ??????-
    if($lang == “zh”) { $b = “zh”; } // 中国語
    // その他 ??????-
    if(empty($b)) { $b = $a; } // 入力値をそのまま返す。
    return $b;
    } // ED: function

    // europashe Sprache
    $tmp[‘v’] = “English”; $tmp[‘c’] = “eng”; $tmp[‘c’] = “en”; $lang[]=$tmp;
    $tmp[‘v’] = “eutsch”; $tmp[‘c’] = “deu”; $tmp[‘c’] = “de”; $lang[]=$tmp;
    $tmp[‘v’] = “Francias”; $tmp[‘c’] = “fra”; $tmp[‘c’] = “fr”; $lang[]=$tmp;
    // asianische Sprache
    $tmp[‘v’] = “日本語”; $tmp[‘c’] = “jpn”; $tmp[‘c’] = “ja”; $lang[]=$tmp;
    $tmp[‘v’] = “中文(簡体)”;$tmp[‘c’] = “chs”; $tmp[‘c’] = “zh”; $lang[]=$tmp;
    $tmp[‘v’] = “中文(繁体)”;$tmp[‘c’] = “cht”; $tmp[‘c’] = “zh”; $lang[]=$tmp;

    if(!empty($_SERVER[‘HTTP_ACCEPT_LANGUAGE’])){
    $lgs = $_SERVER[‘HTTP_ACCEPT_LANGUAGE’];
    $ein = explode(“,”, $lgs);
    foreach($ein as $zwei){
    $drei = explode(“;”, $zwei);
    $fier[] = $drei[0];
    }
    foreach($fier as $fuenf){
    if(!empty($fuenf)){
    $first_lang[] = langcode01($fuenf);
    }
    }
    }

    //$lang は include() された $langset 内で代入されている
    foreach($first_lang as $flang){
    if(empty($c)){
    foreach($lang as $ls){
    if($ls[‘c’] == $flang){ $c = $ls[‘c’]; }
    }
    }
    }
    if(empty($c)){ $c = “eng”; }
    //return $c;

    //リダイレクト
    if($c == “ja”){
    header(‘Location: (日本のページURL)’);
    exit;
    }else{
    header(‘Location: (英語のページのURL)’);
    exit;
    }

    あとはこれを日本語のページAのロード?(初期表示時)に動かしてページAの英語ページに飛ばせればよいような気がするのですが、いかがでしょうか?
    そもそもBOGOの仕組み、ワードプレスの仕組みがあまり分かっていない上でこんなことを実現するのは難しいのかもしれませんが、どなたかよくワードプレスや「BOGO」についてご存知の方に教えていただきたいと考えております。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター Takayuki Miyoshi

    (@takayukister)

    Accept-Language ヘッダーからブラウザの言語選好を得る処理については Bogo の関数 bogo_http_accept_languages() が使えます。

    $preferred_langs = bogo_http_accept_languages();
    
    # $preferred_langs => [0 => 'ja', 1 => 'en', 2 => 'de']
    
    # 優先順に並んだ配列を返すので先頭の言語(上の例では ja)を使います。

    リダイレクト処理については副作用が大きいので Bogo は提供しません。ですがすでにご自身でかなり近いところまで行っているようなので、たぶん大丈夫でしょう。

    今回のようなリダイレクト処理には template_redirect のアクションフックを利用するのが最適です。

    https://codex.wordpress.org/Plugin_API/Action_Reference/template_redirect

    サンプルコードも載っているので参考にしてください。

    トピック投稿者 Yuji Simada

    (@yuji-simada)

    コメントありがとうございます。
    functions.phpを書きなおして検証しました。
    アクションフックを利用してWP外のサイトに英語、日本語別々のサイトにリダイレクトすることに成功しました。
    しかし、同じようにURLをWP本体(自分のWP内)に書き変えて試したところ、リダイレクトループが発生してしまいました。
    少しネットで調べてみるとwp-includes/template-loader.phpの
    do_action(‘template_redirect’);
    をコメントアウトすると治るとか色々書いてあったのですが、あまり良い策のような気はしません。
    BOGOの内容とは外れてしまうかもしれないのですが、解決策はご存知でしょうか?
    また、「リダイレクト処理については副作用が大きいので Bogo は提供しません。」と言われている副作用の内容が気になります。
    よろしくお願いいたします。

    モデレーター Takayuki Miyoshi

    (@takayukister)

    リダイレクトして飛んだ先でも同じ処理が走っていたら当然そうなるんじゃないですか?

    例えばリダイレクトする URL に http://example.com/ja/xxx?redirected=1 みたいなパラメタを付けて、リダイレクト処理の前に $_GET['redirected'] の有無をチェックするとか、同じような方法を cookie を使ってやるとか、いろいろ工夫の仕様はあると思います。

    「リダイレクト処理については副作用が大きいので Bogo は提供しません。」と言われている副作用の内容が気になります。

    まさに今回のようなトラブルが起こるということです。こういうことは自分が何をやろうとしているのか理解した上で自己責任で実装できる場合に限ってやるようなことだというのが、この事例からよくわかると思います。プラグインがそこまで面倒見ようとするのは間違っています。

    トピック投稿者 Yuji Simada

    (@yuji-simada)

    コメントありがとうございます。
    確かにそうですね。リダイレクトループが発生しますね。

    今回作ろうとしているサイトは日本でも海外でも閲覧できるサイトです。
    基本的に、海外の方のアクセスが圧倒的に多いサイトです。
    ですので、英語のページを閲覧してほしいとは思っていました。
    しかし、色々調べていると疑問点もあります。
    「リダイレクト処理を実装するとグーグルのクローラーは日本語、英語のページを問題なく回ってくれるのかはなはだ疑問」
    少し調べてみるとグーグルでも多言語サイトを作る場合、リダイレクトは非推奨のようですね。

    結論としては、リダイレクトはできるが、問題が発生する可能性は高い気がします。
    ですので、今回はリダイレクト処理は実装せずに、素直に日本語、英語のページを分けようと思います。
    ありがとうございました。

    ただ、今後ワードプレスやプラグインBOGOについてよく勉強してから実装するかもしれません。ですので、最後にはなると思いますが、ワードプレスについてBOGOの処理で使っている技術、BOGOの詳細な処理内容など記載されているドキュメント、サイトなどあれば教えていただきたく存じます。また、ワードプレス全般について勉強会などもあれば参加してみたいです。
    よろしくお願いいたします。

    モデレーター Takayuki Miyoshi

    (@takayukister)

    そうですね、絶対必要ということでないなら、こういう場合のリダイレクトはないほうがいいと思います。Bogo は rel-alternate-hreflang の言語アノテーションに対応しているので、通常英語サイトを閲覧しているユーザーはほっておいても検索経由で英語版ページにたどりつくはずです。

    Bogo の技術資料は残念ながらまだありません。いずれその辺も整備したいと考えています。いろいろと面白い処理をしているので、もし興味があったらプラグインのソースコードをのぞいてみてください。それから勉強会の情報は WordBench で得られると思います。

    トピック投稿者 Yuji Simada

    (@yuji-simada)

    わかりました。そのあたりもあまり不勉強なもので、良く分かっていないのですが、私などが自分で一から作るよりもずっと配慮されてプラグインを作られているのだと思います。
    英語サイトを見ているユーザーが英語版ページにたどり着くのであれば、非常に安心です。
    ありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「プラグインBOGOを使用してのユーザー言語判別と転送について」には新たに返信することはできません。