Research
The question Filter For Featured Image lead to this answer: How to hook update_post_meta and delete_post_meta?.
Coupled with the a fine global variable ($_wp_additional_image_sizes
) revealed here: How to get a list of all the possible thumbnail sizes set within a theme, bring us to the code that catches the "Use as featured image" action click.
Code
This code is fired at each "Use as featured image" click. It then goes through all Additional Image Sizes and deletes them, keeping the default WordPress ones (thumbnail, medium, large).
Test this code throughly before going LIVE.
GPL Code. No warranty granted. Check the comments.
/**
DRAWBACK
- Setting the Featured Image can be done ONLY ONCE
-- When first setting the FI, all other attachments intermediate sizes will be deleted
-- If swapping the FI, the first image's remaining intermediate will be deleted, and the second DON'T HAVE any additional intermediates!
TODO: Restoring deleted intermediates
- this post may have an answer: https://wordpress.stackexchange.com/a/8082/12615
*/
add_action( 'added_post_meta', 'wpse_57369_selective_delete_intermediates', 10, 4 );
add_action( 'updated_post_meta', 'wpse_57369_selective_delete_intermediates', 10, 4 );
/**
* Catches the "Used as featured image" action
*/
function wpse_57369_selective_delete_intermediates( $meta_id, $post_id, $meta_key, $meta_value )
{
if ( '_thumbnail_id' == $meta_key )
{
global $_wp_additional_image_sizes;
/**
* The global holds all additional image sizes and contains this:
*
array(
['post-thumbnail'] => array(
['width'] => 1000
['height'] => 288
['crop'] => 1
)
['large-feature'] => array(
['width'] => 1000
['height'] => 288
['crop'] => 1
)
['small-feature'] => array(
['width'] => 500
['height'] => 300
['crop'] =>
)
)
*/
// Populate a new array with single values based on the keys of the global
$all_sizes = array();
foreach ( $_wp_additional_image_sizes as $key => $value )
{
$all_sizes[] = $key;
}
// Retrieve all attachments of current post/page/cpt
$all_attachs = get_children( array(
'post_parent' => $post_id,
'post_type' => 'attachment',
'numberposts' => -1,
'post_mime_type' => 'image'
));
// Determine upload path
$uploads = wp_upload_dir();
$path_pos = strpos( $uploads['basedir'], 'wp-content/' ); // start position of the string
$base_path = substr( $uploads['basedir'], 0, $path_pos); // path before wp-content, e.g., /etc/public_html/
// Loop through all attachments
foreach ( $all_attachs as $key => $value )
{
// This is the featured image
if ( $key == $meta_value)
{
wpse_57369_delete_files( $key, $all_sizes, $base_path, 'small-feature' );
}
// Rest of attached images
else
{
wpse_57369_delete_files( $key, $all_sizes, $base_path, false );
}
}
}
}
/**
* Delete all custom intermediates files, except when $keep_size is defined
*/
function wpse_57369_delete_files( $ID, $all_sizes, $base_path, $keep_size=false )
{
foreach ( $all_sizes as $intermediate )
{
/* We need to know the image url [0] and if it exists [3] */
$the_url = wp_get_attachment_image_src( $ID, $intermediate );
/* If additional image exist, go ahead */
if( $the_url[3] )
{
// Path of the image to be deleted
$url_pos = strpos( $the_url[0], 'wp-content/' );
$url_end = substr( $the_url[0], $url_pos);
// Delete all intermediates
if ( !$keep_size )
{
// loga( $ID . ' - ' . $intermediate, 'delete-me');
unlink( $base_path . $url_end );
}
// Featured image, Selective delete
else
{
// Delete intermediate
if ( $intermediate != $keep_size )
{
// loga( $ID . ' - ' . $intermediate, 'delete-me');
unlink( $base_path . $url_end );
}
// Keep intermediate, no action needed
// PROBABLY, RESTORING AN INEXISTENT IMAGE SIZE MUST BE DONE HERE
else
{
// loga( $ID . ' - ' . $intermediate, 'keep-me');
}
}
}
}
}
function loga()
{
// This is the FireBug FirePHP console call
// http://www.firephp.org/HQ/Use.html
}
Result
Folder contents after uploading images, no Feature Image set yet
Folder contents after setting fondo-restauraciones
as the Featured Image
Other Notes
For dealing with ALL extra image sizes (WordPress defaults and custom defined) use:
$all_sizes = get_intermediate_image_sizes();
/**
* $all_images contains all intermediate image sizes, WordPress default and declared custom sizes:
*
array(
[0] => 'thumbnail'
[1] => 'medium'
[2] => 'large'
[3] => 'post-thumbnail'
[4] => 'large-feature'
[5] => 'small-feature'
)
*/