画像をある記事へアップロードしたのに、アイキャッチが変わらない。逆に、アイキャッチとして表示されている画像が「未添付」に見える。この2つは、WordPressで同じ関係を表しているとは限りません。
メディア側のpostは関連付けられた投稿、記事側のfeatured_mediaはアイキャッチのメディアIDです。画像の使われ方を点検するときは、親投稿とアイキャッチを分けて確認します。未添付という表示だけを根拠に、画像を削除しないようにしてください。
二つのIDが指す方向
架空の記事42とメディア90を考えます。記事のfeatured_mediaが90なら、その記事はメディア90をアイキャッチとして参照しています。一方、メディア90のpostが0でも、そのことだけでは記事42で使われていないとは言えません。
| 取得するもの | 見る項目 | 分かること |
|---|---|---|
| 記事 | featured_media | アイキャッチとして選んだメディアID |
| メディア | post | メディアに関連付けられた投稿ID |
| 記事本文 | content | 本文中の画像やリンクとしての利用 |
画像を取得する窓口は/wp-json/wp/v2/media/90、記事は/wp-json/wp/v2/posts/42です。画像のpostを読むことと、記事のfeatured_mediaを読むことは、別々の照合になります。
保存した一覧から対応表を作る
次は取得済みデータを想定した、架空の配列だけの例です。投稿42と43が同じ画像90をアイキャッチに使い、画像91は本文などで使われているか未確認という状態を表します。
def media_usage(posts, media_items):
featured_by = {}
for post in posts:
media_id = post.get("featured_media", 0)
if media_id:
featured_by.setdefault(media_id, []).append(post["id"])
rows = []
for item in media_items:
rows.append({
"media_id": item["id"],
"parent_post": item.get("post", 0),
"featured_by": featured_by.get(item["id"], []),
})
return rows
posts = [
{"id": 42, "featured_media": 90},
{"id": 43, "featured_media": 90},
]
media_items = [{"id": 90, "post": 0}, {"id": 91, "post": 42}]
print(media_usage(posts, media_items))
画像90のparent_postは0ですが、featured_byは[42, 43]になります。画像91は親投稿42を持ち、アイキャッチとして参照する記事は、この入力の範囲では見つかりません。どちらも削除してよいという結果ではありません。
空の一覧から判断しない
featured_byが空なら、最初に渡した記事一覧の範囲を確認します。公開記事しか取っていなければ、下書きや予約記事の参照は含まれません。ページ分割で一部しか取得していない可能性もあります。取得範囲が不足した対応表を、サイト全体の利用状況に読み替えないことが必要です。
また、記事本文に画像URLを直接書いた場合や、テーマの設定、ブロック、外部のページから参照された場合は、このコードでは分かりません。メディアIDだけでなくURLで使われる場面もあるため、ID一覧だけで完全な未使用判定をする設計にはしません。
点検後に見る公開ページ
アイキャッチの設定を確かめるときは、APIのIDに加えて、実際の記事ページや記事一覧の表示も見ます。キャッシュやテーマの表示設定によって、API上の値と見えている画像の確認が別になることがあります。
差し替えを行う場合は、元のメディアIDと参照する記事、旧画像のURLを控えます。このページの処理は対応表の作成だけなので、親投稿の付け替えや画像削除は実行しません。まず、画像1件に対して「親投稿」「アイキャッチで使う記事」「本文での利用」を並べ、分かる範囲と未確認の範囲を書き分けてください。
関連する記事
WordPressメディアAPIで画像をアップロードする基本
WordPress REST APIでアイキャッチ画像を設定する方法
