WordPressの「wp_list_categories」で特定のカテゴリーの投稿数が1,000件以上など、カンマ付きの投稿数をa要素内に含めるにはこうやる

WordPressのカテゴリーの一覧を出力するのに便利な「wp_list_categories」ですが、出力する際にちょっとカスタマイズしたいことがあります。

例えば、カッコ「()」付きの投稿数をa要素内に含めたい場合。

カッコ「()」付きの投稿数を・・・

wp_list_categories04

a要素内に含めたい

wp_list_categories03

そんな時は、以下のように今まで書いていました。

//すぐに出力せずに一旦$categoriesに格納
$categories = wp_list_categories('echo=0&show_count=1');

//カッコ「()」付きの投稿数が見つかった場合はクラス名を付与して「a要素内」に含める
$categories = preg_replace('/<\/a> \(([0-9]+)\)/', ' <span class="count">(\\1)</span></a>', $categories );

//出力
echo $categories;

上の方法でOKだと思ったんですが・・・これだと1,000件以上の投稿数があった場合は、「preg_replace」でマッチする条件からはずれてしまい、投稿数をa要素内に含めることができないです。

理由はカンマ「,」が入っているからです。

ですので、カンマが入る投稿数がある場合は注意が必要ですね。

他の方法を調べました

少し調べましたが、フォーラムの投稿「[解決済み] [閉] カテゴリーの投稿数を出力する際、Aタグの内側に表示させたい。 (7 件の投稿)」に書かれている以下の方法を使っても結果は同じでした。

//この方法でもカンマ付き投稿数の場合はマッチしない。a要素内に入れられない
$categories = preg_replace('/<\/a>\s*\((\d+)\)/',' ($1)</a>',$categories);

そもそも投稿数周りのコードってどうなっているんだろう

「wp_list_categories」を使ってカテゴリーの一覧を出力する際には、デフォルトでは「walker_category」クラスを使っています。

下のコードは「walker_category」クラス内で投稿数について書かれている部分を抜き出したものです。

カテゴリーの投稿数に関するコード

$link .= ' (' . number_format_i18n( $category->count ) . ')';

カテゴリーの投稿数をカンマ区切りで表示するため「number_format_i18n」を使って3ケタずつ区切っていますね。(「number_format_i18n」については以前記事にしましたので、以下のリンクをご参考ください。)

どういう仕組みで投稿数が表示されるのかを理解しました。

カンマ付きの投稿数の場合は、こうやって解決する

というわけで、以下のようなコードを書くとカンマ付きで投稿数が区切られていてもa要素内に含めることができます。

1,000件など、カンマ付きの投稿数をa要素内に含める

 $categories = preg_replace('/\<\/a\> \((.*)\)/', ' <span class="count">($1)</span></a>', $categories );

参考にしたのはこちらの記事「How to include the post-count of a category to link-item when listing categories?」でした。

細かいことですが、気が付けませんでした・・・似たようなことで困っている方はご参考ください。

著者:bouya Imamura