MENU

WordPressカテゴリの親子関係を取得する

当ページのリンクには広告(PR)が含まれていることがあります。
WordPressカテゴリの親子関係を取得する。カテゴリ一覧、親IDをたどる、階層として確認の処理例。

カテゴリの一覧にIDと名前が並んでいても、どれが親で、どれが子なのかは名前だけでは分かりません。WordPress REST APIのカテゴリには、親カテゴリのIDを示すparentがあります。カテゴリを変更する前に、この値から現在の階層を読み取れます。

サイト内の案内や記事台帳を作る場面なら、まず一覧を取得して、カテゴリまでの経路を表示する方法が使えます。同じ名前のカテゴリがあっても、IDを基準にすれば区別できます。ここでは、カテゴリの追加・移動・統合は行いません。

目次

カテゴリを省略せず取得する

一覧の窓口は/wp-json/wp/v2/categoriesです。階層の点検では、記事が入っていないカテゴリも含めるようにhide_empty=falseを明示し、id,name,parentを取得します。

GET /wp-json/wp/v2/categories?per_page=100&hide_empty=false&_fields=id,name,parent

100件を超える場合は、応答の総ページ数を見て次のページも取得します。ある子カテゴリだけを取って、親カテゴリを取得し忘れると、正常な階層まで「親がない」と判定してしまいます。まず、取得した一覧に全カテゴリが含まれるか確かめてください。

parent=0は親カテゴリを持たない項目です。0をカテゴリIDとして検索する必要はありません。0以外なら、同じ一覧からそのIDの項目を探して、さらに親をたどります。

親から子の経路を表示する

架空のカテゴリで、業務効率化の下にCSV、CSVの下に集計を置きます。次の関数は、IDが12なら業務効率化 / CSV / 集計を返します。

def category_paths(items):
    by_id = {item["id"]: item for item in items}
    if len(by_id) != len(items):
        raise ValueError("カテゴリIDが重複しています")

    def path(category_id):
        names, seen = [], set()
        while category_id != 0:
            if category_id in seen:
                raise ValueError("親子関係が循環しています")
            seen.add(category_id)
            if category_id not in by_id:
                raise ValueError("親カテゴリが一覧にありません")
            item = by_id[category_id]
            names.append(item["name"])
            category_id = item["parent"]
        return " / ".join(reversed(names))

    return {item["id"]: path(item["id"]) for item in items}

sample = [
    {"id": 10, "name": "業務効率化", "parent": 0},
    {"id": 11, "name": "CSV", "parent": 10},
    {"id": 12, "name": "集計", "parent": 11},
]
print(category_paths(sample)[12])

名前が同じカテゴリでも、別のIDなら別の項目として扱います。by_idは名前ではなくIDをキーにした対応表です。重複IDや、たどっている間に同じIDへ戻る状態では、表示を続けず例外にします。これは取得データの不備を見つけるための確認で、APIが通常そのような階層を作るという意味ではありません。

親が見つからないとき

最初にページ分割、includeやparentなどの絞り込み、hide_emptyを見直します。部分的な取得結果なら、その外側に親が存在する可能性があります。見つからないからといって、子カテゴリの親を0へ書き換えないようにします。

APIの取得結果と管理画面が違って見える場合は、同じサイト、同じカテゴリIDを見ているかを確認します。表示名だけの比較では、似た名前や同名項目を取り違える場合があります。カテゴリ一覧のJSONを取得日時と一緒に残しておけば、後日の変更とも比べられます。

階層の深さを表示できても、その分類が読者に分かりやすいかは別の判断です。この表は現在の関係を見える形にする資料として使い、分類の変更は対象記事と導線を確認したあとに検討します。

関連する記事

WordPressカテゴリ・タグをREST APIで取得する方法

WordPress REST APIでできること|全体像と始め方

公式資料

Categories – REST API Handbook | Developer.WordPress.org

Global Parameters – REST API Handbook | Developer.WordPress.org

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次