这一直是我的烦恼-缺少按需调整图像大小,如果文件大小很多,最终可能会产生大量文件!
我可以看到您的努力背后的逻辑-问题是,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
调用转换为按需调整大小,因此请留意这个空间!