MENU

WordPress APIの埋め込み取得入門

当ページのリンクには広告(PR)が含まれていることがあります。
WordPress APIの埋め込み取得入門。記事と関連情報、埋め込みで取得、欠けた情報も確認の処理例。

WordPressから記事一覧を取り出したあと、著者IDやカテゴリIDの数字だけが残ると、共有用の一覧としては読みづらくなります。著者名を調べるために記事ごとに別のリクエストを重ねる前に、_embedで関連データをまとめて取得する方法を確認できます。

埋め込み取得は記事本文へ外部の画面を貼る機能とは異なります。APIの応答に、関連する著者や分類のデータを含める指定です。取得先が公開を認めている情報の範囲で使います。

目次

著者と分類を一緒に求める

_embed=author,wp:termを付けると、著者と分類の関連データを求められます。返す項目も絞る場合は、_linksと_embeddedを残します。_fieldsにタイトルだけを指定すると、後で必要になる関連データが応答から外れてしまいます。

GET /wp-json/wp/v2/posts?per_page=10&_embed=author,wp:term&_fields=id,title,author,categories,tags,_links,_embedded

authorは著者との関連、wp:termはカテゴリやタグなどの分類との関連を表す名前です。対象を指定しない_embedでは他の関連データも含まれ得るため、記事台帳に必要なものだけを選びます。関連先がすべて埋め込まれる保証はありません。公式資料では、埋め込み可能とされたリンクが対象になると説明されています。

分類の二重の配列を読む

分類のデータはカテゴリやタグなどの種類ごとに配列へまとめられます。カテゴリの配列とタグの配列をひと続きのID一覧だと思って読むと、取り出す位置がずれます。次の例はカテゴリ名だけを抽出します。

from html import unescape

def article_row(post):
    embedded = post.get("_embedded", {})
    authors = embedded.get("author", [])
    author = authors[0].get("name", "") if authors else ""
    categories = []
    for group in embedded.get("wp:term", []):
        if not isinstance(group, list):
            continue
        for term in group:
            if term.get("taxonomy") == "category":
                categories.append(unescape(term.get("name", "")))
    return {
        "id": post["id"],
        "author": author or "未取得",
        "categories": categories,
    }

sample = {
    "id": 42,
    "_embedded": {
        "author": [{"id": 7, "name": "担当A"}],
        "wp:term": [
            [{"taxonomy": "category", "name": "業務効率化"}],
            [{"taxonomy": "post_tag", "name": "CSV"}],
        ],
    },
}
print(article_row(sample))

架空の入力では、著者が「担当A」、カテゴリが「業務効率化」の1件になります。「CSV」はタグなので、カテゴリ欄には入れません。元のカテゴリIDは記事側のcategoriesにも残しておくと、名前が変更されたときの照合に使えます。

未取得を未設定にしない

_embeddedや著者情報が返らなかったとき、この例は著者を「未取得」とします。記事に著者がいないと決めたわけではありません。取得項目の絞り込み、関連リンク、アクセス権やサイト側の拡張によって、応答の形を確認する必要があります。

カテゴリの空配列も同様です。記事側にはカテゴリIDがあるのに名前が取得できなかった場合は、分類APIを別に参照して補うか、確認対象として残します。取得できなかった名前を、既定のカテゴリ名で埋めると誤った台帳になります。

一覧の件数は別に照合する

埋め込み取得を指定しても、記事一覧のページ分割は必要です。per_page=10は10件を求める指定で、記事全体の件数ではありません。応答ヘッダーの総件数・総ページ数を見て、全ページを取れたか確認します。

この例のPython処理は架空の応答から表示用の行を作るところまでです。実サイトの著者情報を取得した結果や、通信回数が何割減ったといった実測値は示していません。実際の台帳では投稿ID、分類ID、取得日時を残し、名前を表示する列と照合用の列を分けると更新を追いやすくなります。

関連する記事

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

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

公式資料

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

Categories – REST API Handbook | Developer.WordPress.org

この記事を書いた人

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

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

目次