【WordPress】多言語化(その3):カテゴリーの投稿数を言語別にする【Bogo】

その2の続き。

英語記事も試験的に書いてみたり、ほぼ英語版の土台が出来た。

ただ、1点だけどうしても直したい、気持ち悪い箇所がある。それは…

ウィジェットに使用しているカテゴリーの投稿数が言語別にならない。

どうやらBogoはそういう仕様だそうで。

でも「WordPress カテゴリー 投稿数 言語別」や「WordPress category lang (locale)」でググってもそれらしき方法は書いていない。みんな困ってない?それとも私が簡単なやり方を見逃してる?

「カテゴリーを言語別で設定して、カスタムメニューで対応する」と言う案もあり、まぁそれでもいいかと流されそうになったが、どうしても気に入らない。カテゴリーを翻訳した意味が無くなるし、英語記事を作成した際にひと手間&ケアレスミスが増えるから。

もう色々と調べた。WordPressのソースも漁った。実際に色々試してみた。
自作ウィジェットまで手を出した。

で、妥協点として、カテゴリーリストを作成する標準関数「wp_list_categories」をフックして、投稿数を書き換える方法をとった。

注意!

以下の方法は私の環境でとりあえず上手くいった方法です。大したことをやっている訳ではありませんが、もし実施する際は事前にファイルマネージャに入る方法の確認やバックアップを取ることをお奨めします。

既にカテゴリーをカスタマイズしている方や、プラグインの有無などで上手くいかない可能性もあります。自己責任で行って下さい。

環境:
WordPress 5.6.1
カテゴリ関連のプラグインとしては「Category Order and Taxonomy Terms Order」を使用しています。

方法:

まず、カテゴリーウィジェットを確認。「投稿数を表示」にチェックが入っているか。まぁこれを行いたい方はチェックが入っているかと思いますが。

で、テーマのカスタマイズ。テーマエディターから「functions.php」に以下を追加。

function wp_list_categories_by_lang( $output, $args ) {
  $lang = get_locale();
  preg_match_all( '/<li class="cat-item cat-item-(\d+)"/', $output, $matches );
  foreach ( $matches[1] as $id ) {
    $q = new WP_Query( array( 'post_type' => 'post', 'cat' => $id, 'lang' => $lang ) );
    $output = preg_replace( '/(<li class="cat-item cat-item-' . $id . '">.+)\(\d+\)/', '$1 (' . $q->found_posts . ')', $output );
  }
  return $output;
}
add_filter( 'wp_list_categories', 'wp_list_categories_by_lang', 10, 2 );

何をやっているかというと、

  • wp_list_categoriesで出力されるカテゴリーhtmlの完成形が$outputに入っており、そこからフックして投稿数を書き換える。
  • <li>タブの中にカテゴリーID(term_id)があるのでpreg_match_all関数ですべて抜き出し、foreachで回す。
  • カテゴリーIDを基にWP_Queryで言語別、カテゴリ別の記事を取得。その中に投稿数も入っている。
  • preg_replaceで投稿数をクエリで取得した投稿数に置換。
  • 全部回したら$outputを返す(表示する)

いやぁ、強引ですね。本当は1行ずつカテゴリ取得して処理、表示したいのだが、そこまで調査できなかった。親子カテゴリなどの階層作りもなんか大変そうだったので。

この方法であれば、階層も崩れずに投稿数を上書きすることが出来る。はず。

問題点

これで上手くいくと思われる。(上手くいかなかったら戻してください)
ただ、これもいくつかの問題点がある。

投稿数が0のカテゴリーも表示されてしまう。

言語別で作成されていない記事がある場合、そのカテゴリーの記事が無い場合は「(0)」として表示されてしまう。
これは私のサイトでは英語記事が日本語記事に追いつく予定(目標、理想、夢…)なので、一時的には仕方なしと割り切る。

あんまり効率が良く無さそう。

これはちゃんと計測してないのでわからないが、カテゴリ毎に「クエリで取得→置換」をやっているので、あまり効率が良いとは言えない。まぁでもこれは「wp_list_categories」のフックなので致し方ない。
特にカテゴリが多いサイトは影響が大きくなりそう。

昨今はサイトの表示スピードで検索ランキングなどのレートが変わるとも言われているので、特に気にする方は計測して使用するか判断しても良いかもしれない。

あとがき

数時間で調査して作成したので止むなしのところもあるが、とりあえず投稿数は言語別になった。

もうちょっと上手く書けそうだが、そこまでのボリュームにならなかったのが幸いか。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする