wordpress:記事を削除するときに添付されている画像も一緒に削除する
wordpressでブログを書いていると記事とともに溜まっていくのが画像です。
記事を削除しても画像は削除されないため、どんどんたまってデータベースやサーバスペースを圧迫することも。
ですので、記事を削除するときに添付している画像も一緒に削除してしまうコードを作ってみましたのでよろしければ。
※記事下部にある「注意事項」は必ず読んでください。
コード
add_action('before_delete_post', 'custom_delete_post_attachment'); function custom_delete_post_attachment($post_id) { $args = array( 'post_parent' => $post_id, 'post_type' => 'attachment', 'numberposts' => -1, 'post_status' => 'any' ); $attachments = get_children($args); foreach($attachments as $attachment) { wp_delete_post($attachment->ID); } }
これだけです。
※この処理が実行されるのはゴミ箱に入れた時ではなく完全に削除した時です。
before_delete_post
アクション「before_delete_post」は削除を実行する前に処理する内容を書きます。
最初は普通に「delete_post」で試したんですがダメでした。そりゃそうですよね。
削除した後だと、メディアの「アップロード先」も消えてしまいますので添付された画像は無しと判断されます。
custom_delete_post_attachment
実際の処理です。
before_delete_postは記事IDを引数として設定することができます。削除する記事のIDですね。
get_children
この関数で添付ファイルを引っ張れるみたいです。他リビジョンとかもできるみたい。
要するに指定した記事IDに紐づくデータを取得ってことですね。
- post_parent
削除する記事IDを指定 - post_type
attachmentで添付ファイル - numberposts
-1で全部 - post_statu
anyで全てのステータス
上記の設定では画像以外のファイル(動画やPDF)も削除されるので、画像のみにしぼりたい場合は
'post_mime_type' => 'image'
を追加してください。
wp_delete_post
この関数で削除を行います。
wp_delete_postはそのデータがファイルであればサーバからも削除してくれるので便利です。
記事IDを取得できるので特定のポストタイプのみこの処理を実行するというカスタムも可能ですね。
if(get_post_type($post_id) == 'ポストタイプ名') { //ここに削除処理 }
削除の確認
まずは画像入りの記事を作成。
メディアライブラリを確認。
先ほど投稿した記事が「アップロード先」に出ているのが確認できます。
FTPでサーバを確認。
サーバにはアップロードされた画像の他にリサイズされた画像があります。
作成したコードを追加後に記事を削除。
メディアライブラリから消えました。
FTPでサーバを確認。
サーバからもオリジナル画像・リサイズされた画像ともに消えています。
注意事項
この処理は1画像1記事の使用のみ有効です。
1つの画像を複数の記事に使用している場合はこのコードは使用しないでください。
2つの記事で1つの画像を使用。
メディアライブラリのデータ。
2つの記事に使用されていても「アップロード先」に登録されているのは1つのみ。
最初に使用した記事が登録されています。
テスト記事1を削除。
テスト記事1を使用した場合、この「テスト記事1」がアップロード先に登録されている画像が削除されますので「テスト記事2」を開いた時に画像は表示されません。
なくなってるわけですからね。
ちなみに「テスト記事2」を削除した場合は何もおこりません。