Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Note

Use at your own risk, it is buggy and I have run across a couple instances where it would delete ALL attachments. Unsure why.

Is it possible to delete media associated with a page when that page is deleted? I know in the Insert Media page you can filter by images "Uploaded to this page" so could I get a list of those and just delete them as the page is being deleted?

Right now I'm playing around with hooking into Delete Post. Right now... it does nothing but I think I'm getting somewhere with it.

function del_post_media($pid) {
    $query = "DELETE FROM wp_postmeta
            WHERE ".$pid." IN
            (
            SELECT id
            FROM wp_posts
            WHERE post_type = 'attachment'
            )";
    global $wpdb;
    if ($wpdb->get_var($wpdb->prepare($query))) {
        return $wpdb->query($wpdb->prepare($query));
    }
    return true;
}
add_action('delete_post', 'del_post_media');
share|improve this question
    
Be careful about deleting references to media that are used elsewhere e.g. other posts or if your post has been shared on social media. –  Gilbert Aug 19 '13 at 19:37
    
Well if I force the user to upload the same image twice (if they want the same image for 2 different pages) it will rename one of the images, so it should be fine. –  Howdy_McGee Aug 19 '13 at 20:32
add comment

2 Answers

up vote 4 down vote accepted

How about this? It adapts an example on the get_posts() function reference page.

function delete_post_media( $post_id ) {

    $attachments = get_posts( array(
        'post_type'      => 'attachment',
        'posts_per_page' => -1,
        'post_status'    => 'any',
        'post_parent'    => $post_id
    ) );

    foreach ( $attachments as $attachment ) {
        if ( false === wp_delete_attachment( $attachment->ID ) ) {
            // Log failure to delete attachment.
        }
    }
}
share|improve this answer
add comment

I suppose you're looking for something like this...?

function delete_associated_media($id) {
    // check if page
    if ('page' !== get_post_type($id)) return;

    $media = get_children(array(
        'post_parent' => $id,
        'post_type' => 'attachment'
    ));
    if (empty($media)) return;

    foreach ($media as $file) {
        // pick what you want to do
        wp_delete_attachment($file->ID);
        unlink(get_attached_file($file->ID));
    }
}
add_action('before_delete_post', 'delete_associated_media');
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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