【WP】特定の親カテゴリに所属する全ての子カテゴリの最新記事一覧を作る方法

特定の親カテゴリに所属する全ての子カテゴリの最新記事一覧を作る方法

意外と融通の効かないWPのカテゴリ構成

今回はワードプレス関連の記事になります。WP案件の中で、右の画像のようなカテゴリ構成の状態で親カテゴリID1とID5は別ページで、それぞれのページで所属している子カテゴリ含めてそのカテゴリの新着情報一覧を作成しようとしていました。もしかするとプラグインで同等の事がサクっと出来てしまうかもしれませんが、公式でない場合マルウェアに感染するリスクや他のプラグインとの相性なども有るため今回はphp手書きでの対応の紹介となります。

カテゴリーサンプルイメージ

早速、親カテゴリID1の最新記事一覧を作っていきます。出力の際に「日時」「カテゴリ名」「タイトル」といった具合に出力し「カテゴリ名」は所属する親カテゴリ名で出力しようと思っています。右のイメージは完成図です。

完成予想図

それならば、query_posts()で子カテゴリのIDを指定して出力すればいいか。と深く考えずにコーディングしてしまいました。

<?php
if (query_posts(‘cat=1,2,3,4’)):;
while(have_posts()) : the_post();
?>

しかし、よくよく考えるとこの方法だと後々子カテゴリが増えた時に手動対処しなくちゃならない訳であまり使い勝手が良くないと思い何とか動的に出来ないものかと試行錯誤・・・

get_term_children()で子カテゴリを取得して出力

「親カテゴリ 子カテゴリ 取得」と検索をかけると色々出てきました。get_term_children()で親カテゴリを指定してその親カテゴリに所属する、子カテゴリを取得することが出来ると知り早速コーディング。

<table>
<?php
$cat = get_the_category(); // 表示中の記事のカテゴリ
$parent_cat_id = $cat[0]->term_id; // 親カテゴリのIDを取得
$categories = get_term_children($parent_cat_id, ‘category’);//親カテのIDを第一引数に指定し$categoriesに代入し所属する子カテゴリのidを全て取得
foreach ($categories as $key => $value) {//所得した子カテゴリ情報は配列の為foreachで回して「.=」で「$categories_num」に付け足して代入
$categories_num .= $value . ‘,’;
}
if (query_posts(“cat=$categories_num”)):;//全カテゴリidをquery_postsのidに指定
while(have_posts()) : the_post();
$parent_cat = get_category( $parent_cat_id ); // 親カテゴリの情報(オブジェクト)を取得
$cat_name = $parent_cat->cat_name;
?>
<tr>
<td><?php the_time(‘Y/m/d’); ?></td>
<td><?php echo $cat_name; ?></td>
<td><a href=”<?php the_permalink(); ?>”><?php the_title();?></a></td>
</tr>
<?php endwhile;?>
<?php else: ?>
<tr>
<td colspan=”3″>現在ニュースはありません。</td>
</tr>
<?php endif; ?>
<?php wp_reset_query(); ?>
</table>

さあ、早速出力結果を確認だ!!と意気揚々とブラウザを見ると・・・。「あれ?・・・なんか表示件数が少ないぞ・・・」右のイメージは出力された結果のキャプチャです。よくよく見ると親カテにのみチェックが入っている記事(ID1に属する記事)が出ていない模様。

親カテゴリのみにチェックが入っている記事が表示されていないイメージ

get_term_children()で取得できるのは子カテゴリのみ

なんとget_term_children()では指定された子カテゴリの情報が取得出来るだけで、その親カテまでは取得出来ない模様。それなら親カテのidを付け足せばいい訳で、

<?php
$cat = get_the_category(); // 表示中の記事のカテゴリ
$parent_cat_id = $cat[0]->term_id; // 親カテゴリのIDを取得
$categories = get_term_children($parent_cat_id, ‘category’);
foreach ($categories as $key => $value) {
$categories_num .= $value . ‘,’;
}
$categories_num .= $parent_cat_id;//foreachのループ終了後親カテidを$categories_numに続けて代入
if (query_posts(“cat=$categories_num”)):;
while(have_posts()) : the_post();
$parent_cat = get_category( $parent_cat_id ); // 親カテゴリの情報(オブジェクト)を取得
$cat_name = $parent_cat->cat_name;
?>

ようやく希望通りの出力になりました。これで子カテゴリが増えても問題なし!!