wp_delete_attachment():メディア(画像など)をファイルごと消す(WordPress)

メディアライブラリの画像などを、データベースの記録とサーバーのファイルの両方から消します。WordPress が自動で作った小さいサイズの画像も一緒に消えます。

書き方

wp_delete_attachment( int $post_id, bool $force_delete = false ): WP_Post|false|null
  • $post_id:消すメディアの ID です。
  • $force_delete:true にすると、ゴミ箱を通さずにすぐ消します。メディアのゴミ箱(MEDIA_TRASH)を使っていないサイトでは、どちらでもすぐ消えます。
  • 戻り値:消せたら消したメディアの情報、消せなかったら false か null です。

使い方の例

消す前に、記事の本文やアイキャッチで使われていないかを確かめてから消します。

function my_delete_unused_attachment( $attachment_id ) {
    global $wpdb;

    $file = basename( get_attached_file( $attachment_id ) );
    $stem = preg_replace( '/\.[^.]+$/', '', $file );

    // 本文にファイル名(小さいサイズの名前も含む)が書かれていないか
    $in_content = $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_status <> 'inherit' AND post_content LIKE %s",
        '%' . $wpdb->esc_like( $stem ) . '%'
    ) );

    // アイキャッチに使われていないか
    $as_thumbnail = $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM {$wpdb->postmeta} WHERE meta_key = '_thumbnail_id' AND meta_value = %d",
        $attachment_id
    ) );

    if ( $in_content || $as_thumbnail ) {
        return false; // 使われているので消さない
    }
    return wp_delete_attachment( $attachment_id, true );
}

REST API で消すときは、DELETE /wp-json/wp/v2/media/{ID}?force=true です。force=true を付けないと 501 になり、消えません。

よくある間違い

  • 本文に画像の URL を直接書いている記事を見落とす。メディアを消しても本文の URL は残るので、画像が表示されなくなります(リンク切れ)。小さいサイズの画像は「名前-1024×538.png」のように名前の後ろが変わるので、拡張子を外した名前で探します。
  • アイキャッチ(_thumbnail_id)や、テーマ・プラグインの設定に入っている画像を見落とす。
  • 消す前のバックアップを取らない。ファイルは戻せないので、消す前にサーバーのバックアップがあるかを確かめます。

関連する関数

  • get_attached_file():メディアのファイルの場所を取る
  • attachment_url_to_postid():画像の URL からメディアの ID を調べる
  • wp_delete_post():投稿を消す

逆引きリファレンスの一覧へ

サイドバー

よく使うカスタマイズ

最近の記事

  1. Fstyle Final Output Replacer のルールの一覧(generator タグを消す 2 つのルール)

Profile

PAGE TOP