Bogoでカテゴリーの投稿数のカウントを言語毎に行う

Bogoを使って多言語サイトを作っているとサイドバーのアーカイブウィジェットやカテゴリーウィジェットで表示される該当項目の数が全言語の投稿数になってしまうことに気付いた。例えばあるカテゴリーに日本語の記事が3件、英語の記事が2件あると、現在表示しているページと無関係に 記事数:5 として表示されてしまう。クリックするとBogoが有効に働いて現在の言語の記事のみがリストアップされるので日本語ページからだと3件の日本語記事だけが正しく表示される。このブログの場合、日本語だと結構投稿数も増えているので 件数:5 と出て実際は記事が3本しかなくても大した問題ではないかとも思う。しかし英語の記事は翻訳が追い付かず全然進んでいないので、その場合現在の表示言語が英語の場合、英語の記事が無い月やカテゴリーは記事数ゼロとなるべきなのに日本語の記事数が表示されてしまう。クリックすると英語の記事は無いので当然空のページが現れてしまう。とりあえず英語モードでは記事数表示オプションを無しとすることでサイトを立ち上げてはみたものの悔しいので何とか対策すべく調べ始めた。

検索するとカテゴリーについては二件のブログで同様の問題を抱えて対策された方が見つかった。そのうちの片方は真似をしてみたが何故か効果が無かったので、もう一つを試したところ上手く動作した。https://narwhale.net/post-366/ それがこちらのサイトである。wp_list_categories関数をフックしてWP_Queryで取得した正しい言語毎の投稿数に書き換えて表示する仕組みとのこと。functions.php に10行のコードをコピー&ペーストするだけで簡単だった。下に結果を示す。日本語と英語それぞれの言語表示で、投稿数カウントが異なっているのがわかる。

以下に使用したコードを示す。

// カテゴリーの表示数を言語毎にカウントする。
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 );

これでOK!と思ったのであるが、実は少しだけ問題が残っている。あるカテゴリー記事一覧を表示させると当該カテゴリーについてのみ、件数表示が全言語合計になってしまう。下の例では英語表示でDIYカテゴリーの記事一覧5件を示しているが、ウィジェットに表示される記事数が日本語との合計の36となってしまっている。次のAudioカテゴリーは2件と正しいままである。

気持ち悪いのだが原因も対策も思いつかないし、またカテゴリー一覧を開いた状態で当該カテゴリーの記事数をチェックする必要はないので実質的には訪問者に不都合は無いと考え、とりあえず放置することにした。

以上、カテゴリーについては容易な対策を考案してくださった先駆者がいて助かった。この場を借りてお礼申し上げたい。もう一方のアーカイブの表示件数修正についてはネットで情報が見つからず少し手間が掛かった。次の投稿を参照されたい。

コメント

タイトルとURLをコピーしました