Đây luôn là một lỗi cho tôi - việc thiếu kích thước hình ảnh theo yêu cầu và số lượng tệp tiếp theo bạn có thể kết thúc nếu bạn có nhiều kích cỡ!
Tôi có thể thấy logic đằng sau những nỗ lực của bạn - vấn đề là, add_image_size
chỉ thực sự phát huy tác dụng tại điểm tải lên. Như vậy, is_page_template(..)
sẽ luôn luôn như vậy false
.
Một google nhanh chóng đào lên Aqua Resizer , một kịch bản được thiết kế để giải quyết vấn đề này. Thay vì sử dụng add_image_size
, bạn sử dụng aq_resize
trực tiếp trong chủ đề của mình và nếu kích thước của hình ảnh không tồn tại, nó sẽ được tạo và lưu vào bộ nhớ cache khi đang di chuyển.
Trong thực tế, tôi đã sử dụng một kỹ thuật tương tự, mặc dù khác nhau, trên một số trang web có nhiều kích cỡ hình ảnh. Bạn vẫn tiết kiệm được chi phí của WordPress khi tạo mọi kích thước cho mọi hình ảnh được tải lên - chúng được tạo nhanh chóng (& được lưu trong bộ nhớ cache) như khi chúng được yêu cầu. Khác biệt ở chỗ, là bạn có thể chỉ cần sử dụng tất cả các chức năng hình ảnh và thẻ mẫu tiêu chuẩn của WP như bình thường!
Ngoài ra, như @Waqas đã đề cập, sử dụng Aqua Resizer sẽ để lại các tệp mồ côi khi bạn xóa một hình ảnh khỏi thư viện phương tiện của mình. Với kỹ thuật của tôi, tất cả các tệp sẽ bị xóa, vì chúng được lưu vào cơ sở dữ liệu và được WordPress công nhận.
/**
* 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 );
Và trong thực tế:
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!
Tôi dự định biến nó thành một plugin sẽ tự động chuyển đổi tất cả các add_image_size
cuộc gọi thành thay đổi kích thước theo yêu cầu, vì vậy hãy xem dung lượng này!