WordPressで第n階層のカテゴリー情報のみをすべて取得する方法

投稿者 : OSCA

[PR] "東野・岡村の旅猿"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

何回かに渡りWordPressのカテゴリー情報を取得する方法について解説しています。 前回は第一階層のカテゴリー情報を全て取得する方法について解説しました。 今回は逆に子・孫のカテゴリーとなるn階層のカテゴリー情報のみをすべて取得する方法について解説します。

本稿で解説すること

本稿で解説する「n階層のカテゴリー情報のみをすべて取得」とはどういうことかを説明します。

例として次のような階層のカテゴリーがあるとします。

親カテゴリー1
    - 子カテゴリー1
        - 孫カテゴリー1
        - 孫カテゴリー2
    - 子カテゴリー2
親カテゴリー2
    - 子カテゴリー3
        - 孫カテゴリー3
        - 孫カテゴリー4

このような場合に、次のようにカテゴリーを取得するできることを目指します。

  • 2階層目のみすべて : 「子カテゴリー1」「子カテゴリー2」「子カテゴリー3」
  • 3階層目のみすべて : 「孫カテゴリー1」「孫カテゴリー2」「孫カテゴリー3」「孫カテゴリー4

実現方法

それでは実現方法について解説していきます。 本稿では指定した深さの階層のカテゴリー情報を返却する関数を作っていきます。

1. 指定したカテゴリーの階層を算出する関数を用意する

まずは、便利のために「指定したカテゴリーの階層を算出する関数」を作ります。 関数は次の通りで、第一引数でカテゴリーIDを受け取り算出します。 関数の中身としてはたったの1行です。

function get_depth($id) {
    return count(get_ancestors($id, 'category'))+1;
}

この関数の実装上のポイントは、指定されたオブジェクトの祖先オブジェクトのIDを配列を返却してくれる関数 get_ancestors() です。 返却された配列の長さが祖先の数になりますから、それに1を足せば、指定したカテゴリの階層となります。

2. n階層のみを取得する関数を作成する

上で作成した関数 get_depth() を利用して、指定した階層のカテゴリーのみを返却してくれる関数を作成します。 関数は次の通りです。 第一引数に取得したいカテゴリーの階層の深さ($depth)を指定できます。

function get_categories_by_depth($depth) {
    $categories = array();
    foreach( get_categories() as $category ) {
        if( get_depth($category->term_id) == $depth ) {
            array_push($categories, $category);
        }
    }
    return $categories;
}

WordPress標準関数 get_categories() で全てのカテゴリー情報を取得したのち、階層が引数で指定した深さのカテゴリーのみに絞り込んで返却します。

3. 作成した関数を呼び出す

上で作成した関数は functions.php に定義しておいて、あとは必要となるテンプレートで次のように get_categories_by_depth() 関数を呼び出せばOKです。 次の例の場合は、2階層目のカテゴリー情報のみをすべて取得しています。

$categories = get_categories_by_depth(2);

まとめ

本稿では、指定した階層のカテゴリー情報をすべて取得する実現方法について解説しました。 本稿が皆さんのお仕事のお役に立てれば幸いです。

WordPressのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca