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.

I'd like to run an SQL query to find all featured images from posts and delete the file itself and any references to it.

Can anyone tell me how to accomplish this? Many thanks!

share|improve this question
    
Anyone have an update to this? I get the same error. –  Jae Mar 16 '12 at 20:20
    
@Jae Check my latest edit. I put it in plugin form. –  Brian Fegter Aug 4 '12 at 15:20

2 Answers 2

up vote 3 down vote accepted

A MYSQL Query cannot delete the files themselves. You will have to use wp_delete_attachment(). The following is a proof-of-concept for you to alter how you please. The featured image is stored in postmeta as _thumbnail_id. wp_delete_attachment() does the rest for you.

<?php
/*
Plugin Name: Delete All Featured Images
Description: Delete all featured images by visiting /?delete-featured-images=1
Version: 0.1
Author: Brian Fegter
Author URI: http://coderrr.com
License: GPL3v2
*/

# USAGE: visit http://yourdomain.com/?delete-featured-images=1

add_action('init', 'foo_bar_delete_featured', 0);
function foo_bar_delete_featured(){

    # Check for logged in state
    if(!is_user_logged_in())
        return;

    # Check for admin role
    if(!current_user_can('manage_options'))
        return;

    # Check for query string
    if(isset($_GET['delete-featured-images']) && $_GET['delete-featured-images'] == 1){
        global $wpdb;

        # Run a DQL to get all featured image rows
        $attachments = $wpdb->get_results("SELECT * FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id'");

        foreach($attachments as $attachment){

            # Run a DML to remove this featured image row
            $wpdb->query("DELETE FROM $wpdb->postmeta WHERE meta_id = '$attachment->meta_id' LIMIT 1");

            # Delete attachment DB rows and files
            wp_delete_attachment($attachment->meta_value, true);

            # Print to screen
            show_message('Attachment #$attachment->meta_value deleted.');
        }
        exit;
    }
}
share|improve this answer
    
Thanks for this. I placed it in a PHP file called "remove-featured.php", put that in my root and ran it, but I get the following error: Fatal error: Call to a member function get_results() on a non-object in C:\wamp\www\clients\rusty-rambles\remove-featured.php on line 3 Screenshot: cl.ly/EhqW –  AlecRust Mar 3 '12 at 18:15
    
@alecrust you cannot run it outside wordpress, put it in functions.php and make sure you remove it after first usage. –  amit Aug 4 '12 at 14:23
    
@alecrust Check out the latest edit. I formatted it as a plugin. You have to be logged in and an admin to run it. –  Brian Fegter Aug 4 '12 at 15:21
    
@amit Thanks :) –  Brian Fegter Aug 4 '12 at 15:33

Use this query to remove thumbnails images and associated metadata from database

global $wpdb;

$attachments = $wpdb->get_results( "
     SELECT * 
     FROM $wpdb->postmeta 
     WHERE meta_key = '_thumbnail_id'
" );

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

$wpdb->query( "
    DELETE FROM $wpdb->postmeta 
    WHERE meta_key = '_thumbnail_id'
" );
share|improve this answer

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.