サブカテゴリ毎に記事をまとめて表示2

前回の記事で不満だった部分を解消してみた。
具体的には以下のようにする

  1. 親カテゴリのトップページにサブカテゴリの一覧を表示
  2. 各サブカテゴリ毎に記事をまとめて表示

前回で解決できなかった問題は自動でサブカテゴリの一覧を取得してループさせながら各HTMLを出力させる事。
そもそもつまづきの原因はサブカテゴリのIDを取得できなかったから。
逆に言うと「親カテゴリに属するサブカテゴリのIDを全て取得」できれば実現可能という事になる。
そこでかなり微妙ながらサブカテゴリのIDを取得するように試みた。

まずはサブカテゴリを取得する

wp_list_categories(‘引数’)

カテゴリ一覧を取得できる。引数に親カテゴリのIDを指定すればサブカテゴリの一覧が取得できる。

echo
すぐに出力するかPHPのデータとして利用するか
title_li
タイトル
style
リスト形式で出力するか<br>で出力するか
child_of
親カテゴリのIDを指定

他に必要であれば足す。ここで変更するのはchild_ofだけで、他は全て下と同じで構わない。

[php]
/*
これで$subCategoriesにサブカテゴリが配列として収められる。
$subCategories[0] = <a href="サブカテゴリのURL">サブカテゴリ名</a>
*/
$subCategories = explode(‘<br />’, wp_list_categories(‘echo=0&title_li=&style=none&child_of=3’));
[/php]

次にサブカテゴリの名前だけを取得してそこからIDを取得する。
下はサブカテゴリ名からIDを取得する関数。

get_cat_ID(‘カテゴリ名’)

引数にカテゴリ名を指定するとIDが取得できる。

上記関数でIDが取得できるのが分かったので、先の$subCategories 配列からサブカテゴリ名だけを抽出してIDを取得すれば良いかと。
そこで何となく怪しい正規表現を駆使して$catList配列からサブカテゴリ名を抽出していき、IDを取得していく。

[php]
//IDを入れる配列を宣言
$catIDs = array();
//リンク付サブカテゴリを入れる配列を宣言
$catList = array();

//正規表現を作成
$reg = ‘/<a.*?>(.*)?<.*/si’;

foreach($subCategories as $cat) {
if(preg_match($reg, $cat, $value)) {
//カテゴリ名からIDを取得して配列に追加
array_push($catIDs, get_cat_ID($value[1]));
array_push($catList, $cat);
}
}
[/php]

本当にこんな正規表現で大丈夫かしら?と不安一杯だが、少なくとも私の環境では大丈夫なので良しとする。
これで、
【 $catList 】にリンク付きのサブカテゴリ一覧
【 $catIDs 】にサブカテゴリのID一覧
が取得できる。

※ この記事よりスマートなサブカテゴリの取得方法がありますので併せて読んでみてください。

IDまで取得できれば後はループで回していけばOKではないかと。
以下が一連のコード。

[php]
<?php
//親カテゴリに属するサブカテゴリを配列で取得
$subCategories = explode(‘<br />’, wp_list_categories(‘echo=0&title_li=&style=none&child_of=3’));

$catIDs = array();
$catList = array();

//正規表現を作成
$reg = ‘/<a.*?>(.*)?<.*/si’;

/*
サブカテゴリ名だけを取得後、
サブカテゴリに対応するIDを取得して配列に追加
*/
foreach($subCategories as $cat) {
if(preg_match($reg, $cat, $value)) {
//カテゴリ名からIDを取得して配列に追加
array_push($catIDs, get_cat_ID($value[1]));
array_push($catList, $cat);
}
}

//ループしてHTMLを作成
for($i=0; $i<count($catIDs); $i++) {
?>

<h3 class="title"><?php echo $catList[$i]; ?></h3>
<ul class="ul-content-list">
<?php if (have_posts()) : query_posts(‘posts_per_page=5&cat=’ . $catIDs[$i] . ‘&orderby=ID&order=desc’); ?>
<?php while (have_posts()) : the_post(); ?>
<li><?php the_time(‘y-m-d’); ?>&nbsp;&nbsp;<a href="<?php the_permalink() ?>" class="bluelink"><?php the_title(); ?></a></li>
<?php endwhile; endif; wp_reset_query(); ?>
</ul>

<?php } ?>
[/php]

もうちょっとまともなやり方があれば、誰か教えてください。