Remove Default Image Sizes
Overview
Remove default generated image sizes from WordPress uploads. The snippet filters the intermediate image size lists and unregisters the larger core sizes so new uploads generate fewer derivative files.
The default target list includes core image sizes, WooCommerce sizes, Bricks sizes, and WordPress' 1536x1536 / 2048x2048 advanced sizes.
Variants
- Procedural
- OOP
<?php
/**
* Remove Default Image Sizes
*
* intermediate_image_sizes filter -> https://developer.wordpress.org/reference/hooks/intermediate_image_sizes/
* intermediate_image_sizes_advanced -> https://developer.wordpress.org/reference/hooks/intermediate_image_sizes_advanced/
* remove_image_size() -> https://developer.wordpress.org/reference/functions/remove_image_size/
*/
add_filter( 'intermediate_image_sizes', 'mac_remove_default_image_sizes', 10, 1 );
if ( ! function_exists( 'mac_remove_default_image_sizes' ) ) {
/**
* @param string[] $sizes
* @return string[]
*/
function mac_remove_default_image_sizes( array $sizes ): array {
/** @var string[] $targets */
$targets = [
// Core
'thumbnail',
'medium',
'medium_large',
'large',
// Woo
'woocommerce_thumbnail',
'woocommerce_single',
'woocommerce_gallery_thumbnail',
// Bricks
'bricks_large_16x9',
'bricks_large',
'bricks_large_square',
'bricks_medium',
'bricks_medium_square',
];
foreach ( $sizes as $size_index => $size ) {
if ( in_array( $size, $targets, true ) ) {
unset( $sizes[ $size_index ] );
}
}
return $sizes;
}
}
add_filter( 'intermediate_image_sizes_advanced', function( array $sizes ): array {
// Core
unset(
$sizes['1536x1536'],
$sizes['2048x2048']
);
return $sizes;
});
add_action( 'init', function(): void {
remove_image_size( '1536x1536' );
remove_image_size( '2048x2048' );
});
<?php
/**
* Remove default WordPress image sizes.
*
* @package mac-core
*/
declare(strict_types=1);
namespace MacCore\Services\Media;
use MacCore\Contracts\Service;
final class RemoveDefaultImageSizes implements Service
{
/**
* Default image size slugs to remove.
*
* @var array<int,string>
*/
private const SIZES = [
'thumbnail',
'medium',
'medium_large',
'large',
'woocommerce_thumbnail',
'woocommerce_single',
'woocommerce_gallery_thumbnail',
'bricks_large_16x9',
'bricks_large',
'bricks_large_square',
'bricks_medium',
'bricks_medium_square',
];
/**
* Advanced core sizes.
*
* @var array<int,string>
*/
private const ADVANCED_SIZES = [
'1536x1536',
'2048x2048',
];
public function register(): void
{
\add_filter(
'intermediate_image_sizes',
[$this, 'filter_intermediate_sizes']
);
\add_filter(
'intermediate_image_sizes_advanced',
[$this, 'filter_advanced_sizes']
);
\add_filter(
'image_size_names_choose',
[$this, 'filter_size_names']
);
\add_action(
'init',
[$this, 'remove_registered_sizes']
);
}
public function filter_intermediate_sizes( array $sizes ): array
{
return \array_values(
\array_diff(
$sizes,
\array_merge( self::SIZES, self::ADVANCED_SIZES )
)
);
}
public function filter_advanced_sizes( array $sizes ): array
{
foreach ( \array_merge( self::SIZES, self::ADVANCED_SIZES ) as $size ) {
unset( $sizes[ $size ] );
}
return $sizes;
}
public function filter_size_names( array $sizes ): array
{
foreach ( \array_merge( self::SIZES, self::ADVANCED_SIZES ) as $size ) {
unset( $sizes[ $size ] );
}
return $sizes;
}
public function remove_registered_sizes(): void
{
foreach ( self::ADVANCED_SIZES as $size ) {
\remove_image_size( $size );
}
}
}