WordPressで任意のカテゴリー毎の新着記事一覧を作る方法

かねてからやりたいなと思ってたカテゴリー毎に分けた新着一覧。
WordPressへの実装方法はいろいろあると思います。わたしはこうやりましたという一例を紹介します。

正直、パフォーマンスとかそういった部分は分からないので、もっと良い方法はあるかもしれません。
では、どうぞ!

概要

登録してあるカテゴリー全部を表示させるやり方はネットに転がってましたが、
任意のカテゴリーのやり方はわたしが探した範囲ではありませんでした。

どうやって拾ってこようかなーと考えて、
管理画面のどこかに新しくどこかにフィールド作るのもいいかなと思いましたが、なんか面倒くさそうだな・・・と思い、

結局、WordPressに標準で用意されているメニューを利用することに。

わたしの場合は、トップに表示させているグローバルメニューと兼用で使うことにしましたが、
違うのにしたい方は新しく作るのもありかと思います。

このメニューに登録した情報を読み取って一覧で表示できるようにカスタマイズしました。

具体的な手順

(わたしの場合・・、)WordPressのカスタマイズは基本的には関数探しです。
マッチしそうな関数があればできるし、なければできない。至ってシンプル。

メニューからカテゴリIDを抜き出し一覧で表示させる。
この流れがWordPressの関数を使ってできそうだったので、これでやっていきます。

メニューの内容取得

wp_get_nav_menu_items($menu_name);

関数リファレンス/wp get nav menu items – WordPress Codex 日本語版

引数には「メニューID、名前またはスラッグ」のどれかを入れてあげてください。
具体的には、メニューで登録した際の「メニュー名」でOKです!
list-menu

この辺も管理画面から行えるようにしたほうがいいんでしょうが、わたしはテンプレートに直打ちです。

なかなかいい感じの関数で、メニューに登録したいろんな情報(オブジェクト)を返してくれます。
今回利用させてもらうのは、

  • object
  • object_id
  • title

の3つの値。

メニューからメニューの内容取得

$test_menu = wp_get_nav_menu_items("test");
foreach ($test_menu as $test_cate) {
    if ($test_cate->object != "category") {
        continue;
    }
    $test_category_id = $test_cate->object_id;
}

wp_get_nav_menu_itemsの値を適当な変数に入れて、foreaxchで回してます。
わたしの場合はグローバルメニューでカテゴリー以外のメニュー(TOPとか)も入っているので、カテゴリー以外は弾く処理を行っています。
それ以外は、カテゴリーIDを取得して$test_category_idに代入。

この処理を、メニューの数だけ繰り返します。

一覧表示の処理

いつもの記事一覧処理をカテゴリーIDの数だけ繰り返すイメージです。
HTMLタグで表示させるところはそれぞれのテンプレートのやり方があると思うので省略します。(ご自身のcategory.phpとかarchive.phpとかの書き方を参考にして作ってください。)

$args = array('posts_per_page' => 5, 'category__in' => $test_category_id,);
$test_query = new WP_Query( $args );
echo $test_cate->title;
if ( $test_query->have_posts() ) {
    while ( $test_query->have_posts() ) {
        $test_query->the_post();
            // 記事一覧を表示させるHTMLタグとかを記入。
    }
}
wp_reset_postdata();

カテゴリーごとに5件の新着記事を表示する処理を行っています。

コードをまとめると

$test_menu = wp_get_nav_menu_items("test");
foreach ($test_menu as $test_cate) {
    if ($test_cate->object != "category") {
        continue;
    }
    $test_category_id = $test_cate->object_id;

    $args = array('posts_per_page' => 5, 'category__in' => $test_category_id,);
    $test_query = new WP_Query( $args );
    echo $test_cate->title;  // 各カテゴリーのタイトル
    if ( $test_query->have_posts() ) {
        while ( $test_query->have_posts() ) {
            $test_query->the_post();
            // 記事一覧を表示させるHTMLタグとかを記入。
        }
    }
    wp_reset_postdata();
    echo get_category_link($test_category_id); // 各カテゴリー一覧へのリンク
}

おそらく必要な値は取れてきていると思うので、あとは好きな様にカスタマイズしてください!

コードの記入場所

カテゴリーごとの新着一覧を出したいのは、おそらくトップページだと思うので、
front-page.phpもしくは、home.phpを書き換えるか、

固定ページで専用テンプレート作ってそれを当てるのも良いかと思います。
(WordPressの管理画面のカスタマイズでトップページを任意の固定ページにするっていうのがあるはずです。)

お好きな方でカスタマイズしちゃってください!
わたしは小テーマとしてhome.php作ってコードを書き換えてます。(もちろん親のテーマを直接書き換えても問題ありません。)

まとめ

WordPressで任意のカテゴリー毎の新着記事一覧を作る方法でした。
たぶんやり方はいろいろあると思うので、もっと効率のよいやり方があればそちらを利用するのが良いかと思います。