0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WordPress国際化プラグインBogoで未翻訳言語の「記事が見つかりませんでした」を回避する

0
Last updated at Posted at 2026-02-11

 Bogo のカスタマイズおよび、WP External Links / SWELLテーマとの相性問題の解決について。

梗概

 Bogo はデフォルトで「最新の投稿」や「カテゴリ」「タグ」といった記事一覧ページに「訪問者が選択した言語の記事のみを表示する」という絞り込みをかけるのですが、その処理を停止したのでメモ。

Screenshot

 Bogo をごくごく一部の多言語化(配布物のライセンス整理と念のためのお問い合わせページ)に使っています。
 Bogo は必ず「一投稿につき一言語ずつ」言語ごとの投稿を作ることを前提としているプラグインで、カスタマイズなしで使うとその言語で翻訳されていない投稿は一覧に表示されません


 個人サイトですべての記事を翻訳投稿するというのはちょっと現実的でないので、一覧の絞り込みは停止することにしました。雑に機械翻訳にかけるぐらいならブラウザの翻訳機能を使ってもらったほうがいいでしょう。ブラウザの翻訳精度は時間が経つにつれて上がるだろうけど記事自体を雑に翻訳すると自分でメンテしない限り改善されません。

 ちなみにうちのサイト。

投稿一覧での言語による絞り込みを停止する

 Bogo 3.9.1 の管理画面にはこの機能を停止するオプションはありません。
 なので、functions.php をいじって停止することになります。

functions.php
// Bogo: 一覧ページで言語フィルタを無効化
add_action('parse_query', function ($query) {
   // 管理画面、サブクエリやシングルページには手をつけない
   if (is_admin() || ! $query->is_main_query() || $query->is_singular) {
       return;
   }

   // Bogoの言語フィルタを無効化
   $qv = &$query->query_vars;
   $qv['bogo_suppress_locale_query'] = true;
}, 11); // bogo_parse_queryより後 (10より上) にする

 parse_query は WordPress が内部で記事一覧を検索する前(WP_Query による検索クエリパース時)に呼び出されるアクションフックです。この時点ではまだ検索処理は実行されていないので、クエリを書き換えることができます。

 画面上ではくだんの機能を停止するオプションはないのですが、PHPから記事検索クエリを投げるときは 'bogo_suppress_locale_query' => true で止められます。
 ただし、bogo_suppress_locale_query を立てるとそのクエリでは Bogo の絞り込みは完全に停止するので、複数の言語に翻訳されている投稿は全言語別に表示されます。つまり「5周年記念」「5th Anniversary」等と言語ごとに同じ投稿が重複して表示されることになります。
 副作用もあるので、下記のクエリは触りません。

  • is_admin() → 管理画面。いじらない理由は言わずもがな
  • ! $query->is_main_query() → メインクエリでないもの。サイドバーのウィジェットなどが独自に行っている投稿取得処理は除外しています
  • is_singular → 単独投稿のページ。つまり投稿本文。これを除外しないとどの言語を選択してもすべての翻訳投稿が縦に並んで表示されるようになります

「最近の投稿」ウィジェットの言語による絞り込みを停止する

 これもフィルターフックwidget_posts_argsで止められます。引数として WP_Query::query_vars 相当の連想配列を渡されるので、bogo_suppress_locale_queryをセットして返すだけです。

functions.php
add_filter('widget_posts_args', function ($q) {
   $q['bogo_suppress_locale_query'] = true;
   return $q;
});

全言語並べて表示ではなく、一投稿一言語ずつフォールバックしたい場合は?

 翻訳のある投稿は優先的に表示するが、翻訳のない記事は別の言語の記事にフォールバックしたい場合。

 うちはそこまでやってないのですが、おそらくフィルターフックposts_joinposts_where、それにposts_groupbyないしthe_postsあたりをよしなに書き換えれば実現できます。Bogo標準の処理はbogo/includes/query.phpに綺麗にまとまっているので、SQLに明るい人なら比較的すんなりと実現できるんじゃないでしょうか。

Bogo と WP External Links を併用すると発生する問題とその対応

 WP External Links はサイト外へのリンクについてデフォルトで別タブで開くようにし、さらに外部リンクであることをアイコンで示せるプラグインです。

 Bogo はそのサイトのルートを返す関数 home_url() をフックして言語プレフィクスを付けて返すので、home_url() を基準に何か処理をするプラグインやテーマと併用すると問題が発生することがあります。

 WP External Links(WPEL)がその一つで、デフォルト言語以外が選択されていると他の言語のページを別のサイト扱いするようになります(共有型のサーバだと同じドメインをディレクトリ単位で異なるお客さんに貸し出していることもあるので、デフォルト設定としては妥当です)。

 WPELの場合は「外部リンクから除外する URL」の設定があるので、そこに本来のhome_urlを入れればOKです。

Bogo と SWELL を併用すると発生する問題とその対応

 一部のプラグインやテーマは、トップページやサイドバーはサイト管理者が設定を変えない限り表示が変わらないという前提でキャッシュします。Bogo は訪問者が選択している言語によってトップページやサイドバーの表示を変えるので、トップページ等に誤った言語の内容が表示されます

 SWELLもトップページ等の内容が固定的であることを期待してキャッシュするテーマですが、このキャッシュは設定で無効化できます。
image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?