カテゴリの一覧に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
