WordPressのメディアファイルは、記事とは別にpost_idが割り振られています。
メディアファイルのpost_idを調べたいと思った時に知識不足でハマったことがあったのでメモしておきたいと思います。
メディアファイルのpost_typeは?
メディアファイルはpost_idがありますが、投稿タイプ(post_type)はpostではありません。
post_typeの指定が必要なクエリでは、メディアファイルのpost_typeを正しく指定する必要があります。
メディアファイルの投稿タイプは、attachmentです。
- Post (Post Type: ‘post’)
- Page (Post Type: ‘page’)
- Attachment (Post Type: ‘attachment’)
- Revision (Post Type: ‘revision’)
- Navigation menu (Post Type: ‘nav_menu_item’)
- Block templates (Post Type: ‘wp_template’)
- Template parts (Post Type: ‘wp_template_part’)

メディアファイルはpost_typeだけ指定してもクエリ結果が返ってこない
添付ファイルのデフォルトの投稿ステータスが inherit であることに注意する。
post_statusを意図的に指定しないと結果が返ってきません。
$args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'post_mime_type' => 'image/gif',
);

アイキャッチ画像が記事に登録される仕組み
アイキャッチ画像は、各記事(post、page、カスタム投稿)のpost_metaの_thumbnail_idフィールドにメディアファイルのpost_idが保存されることで、関連付けされています。
2つの要件を満たせば、記事にアイキャッチ画像を指定できます。
- アイキャッチに指定する画像は、メディアファイルのpost_idがある
- メディアファイルのpost_idが、アイキャッチを指定する記事のpost_metaの_thumbnail_idフィールドに登録されている
アイキャッチ画像が無い記事をクエリしたい
記事の数が増えてくると、アイキャッチ画像が設定されていない記事を探すのは結構大変です。
wp_queryでアイキャッチ画像が設定されていない記事を抽出できれば、アイキャッチ画像を自動的に設定するということも可能です。
自分で頑張らなくても、xo-featured-image-toolsを使えば、アイキャッチ画像を一括して自動的に設定できます。
$args = array(
'post_type' => 'post',
'posts_per_page' => '-1',
'post_status'=>'publish',
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'NOT EXISTS'
)
)
);
アイキャッチ画像の関連付けを一括で削除したい
アイキャッチ画像を削除したい場合は、関連付けを解除するだけでよいので、post_metaの_thumbnail_idフィールドを削除すればよいです。
DBクエリで削除するのが簡単ですので、wp cliを使います。
接頭辞が”wp_”ではないケースでは、wp_config.phpに書かれている接頭辞に修正が必要です。
wp db query 'DELETE FROM wp_postmeta WHERE meta_key="_thumbnail_id"' --quiet
あくまでも関連付けを削除するだけなので、メディアファイルの画像が削除されることも、メディアファイルのpost_idが消えることもありません。
アイキャッチ画像を自動で設定したい
記事のアイキャッチ画像を自動で設定したい場合は、プラグインが便利です。
この手のプラグインは、save_postフックを使い、the_contentを見て画像を抽出してアイキャッチ画像を自動で設定してくれます。
外部画像非対応

外部画像にも対応

