对我来说,这一直是一个问题-缺少按需调整图像大小,如果有很多大小,则会产生大量文件!
我能理解你努力背后的逻辑-问题是,add_image_size
只有在上传时才能真正发挥作用。像这样的is_page_template(..)
永远都是false
.
快速google 挖出来的Aqua Resizer, 旨在解决此问题的脚本。而不是使用add_image_size
, 您使用aq_resize
直接在主题中,如果图像的大小不存在,则会动态创建并缓存它。
事实上,我在多个具有多种图像大小的网站上使用了类似但不同的技术。您仍然可以节省WordPress为上传的每个图像生成每个大小的开销-它们是在请求时动态生成的(缓存)。不同之处在于,您可以像往常一样简单地使用WP的所有标准图像功能和模板标记!
此外,正如@Waqas所提到的,当您从媒体库中删除图像时,使用Aqua Resizer将留下孤立文件。使用我的技术,所有文件都将被删除,因为它们已保存到数据库&;WordPress认可。
/**
* Resize internally-registered image sizes on-demand.
*
* @link http://wordpress.stackexchange.com/q/139624/1685
*
* @param mixed $null
* @param int $id
* @param mixed $size
* @return mixed
*/
function wpse_139624_image_downsize( $null, $id, $size ) {
static $sizes = array(
\'post-thumbnail\' => array(
\'height\' => 350,
\'width\' => 1440,
\'crop\' => true,
),
\'standard_box\' => array(
\'height\' => 215,
\'width\' => 450,
\'crop\' => true,
),
\'default_image\' => array(
\'height\' => 9999,
\'width\' => 691,
\'crop\' => false,
),
\'gallery\' => array(
\'height\' => 900,
\'width\' => 9999,
\'crop\' => false,
),
\'gallery_thumb\' => array(
\'height\' => 450,
\'width\' => 450,
\'crop\' => true,
),
);
if ( ! is_string( $size ) || ! isset( $sizes[ $size ] ) )
return $null;
if ( ! is_array( $data = wp_get_attachment_metadata( $id ) ) )
return $null;
if ( ! empty( $data[\'sizes\'][ $size ] ) )
return $null;
if ( $data[\'height\'] <= $sizes[ $size ][\'height\'] && $data[\'width\'] <= $sizes[ $size ][\'width\'] )
return $null;
if ( ! $file = get_attached_file( $id ) )
return $null;
$editor = wp_get_image_editor( $file );
if ( ! is_wp_error( $editor ) ) {
$data[\'sizes\'] += $editor->multi_resize(
array(
$size => $sizes[ $size ],
)
);
wp_update_attachment_metadata( $id, $data );
}
return $null;
}
add_filter( \'image_downsize\', \'wpse_139624_image_downsize\', 10, 3 );
在实践中:
wp_get_attachment_image( $id, \'gallery\' ); // Resized if not already
wp_get_attachment_image_src( $id, \'standard_box\' ); // Resized if not already
the_post_thumbnail(); // You get the idea!
// And so forth!
我打算把它变成一个插件,可以自动转换所有
add_image_size
调用按需调整大小,请注意此空间!