7

On my site I have multiple authors, who can add/edit/delete custom posts and upload (attach) images to those posts. The problem is - when they delete their posts, attachments stay on the server. So, I would like to get rid of all files attached to the post when it gets deleted. Can anyone share and example how it's done?

4 Answers 4

4

WP does not do this by default since there is no guarantee that attachment isn't still being used by some other post.

Basic logic would be to hook into delete_post, query for child attachments and run wp_delete_attachment() on each.

I did quick search in plugin repository and came up with tiny plugin that does just that (seems unmaintained so test before use) - Post Data Delete Advanced.

2
  • 5
    Just to note, following your basic logic, I had success when using before_delete_post rather than delete_post. Perhaps by the time delete_post is run, the post's metadata has been removed (which is needed for wp_delete_attachment to function properly). Commented Aug 15, 2014 at 16:21
  • Same here... after running some tests I've noticed when you delete the post 'post_parent' data gets removed from all related attachments. Commented Sep 28, 2019 at 17:05
16

I wrote the following function that uses the logic suggested by @rarst in his answer.

add_action( 'before_delete_post', function( $id ) {
  $attachments = get_attached_media( '', $id );
  foreach ($attachments as $attachment) {
    wp_delete_attachment( $attachment->ID, 'true' );
  }
} );

IMPORTANT: Keep in mind it will only be called when the posts are permanently deleted from the trash! If you want to change this behaviour, include the following line in your wp-config.php file:

define('EMPTY_TRASH_DAYS', 0);

If this constant is set to 0, the trash functionality will be disabled and the 'Delete Permanently' button will appear instead of 'Trash' button. If you click 'Delete Permanently' button, the item will immediately be deleted without any alert message.

(From the Codex)

2
  • 1
    Worked for me - Added a check to only apply this on a specific post type, and everything worked like a charm.
    – Stender
    Commented Dec 6, 2017 at 10:08
  • Doesn't work in my case, the post is deleted and the attachment is deleted from media library, but the file with it's other sizes still exist in the folder. Commented Apr 9, 2020 at 22:47
4

Expanding on other answers here for use with only a specific post type.

add_action( 'before_delete_post', 'delete_all_attached_media' );

function delete_all_attached_media( $post_id ) {

  if( get_post_type($post_id) == "post" ) {
    $attachments = get_attached_media( '', $post_id );

    foreach ($attachments as $attachment) {
      wp_delete_attachment( $attachment->ID, 'true' );
    }
  }

}

This will delete all attached media when a post is permanently deleted.

0

Any one still looking for a simple solution then try the following plugin it works with normal post/page, and custom post types - Delete Post with Attachments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.