我怎样才能使wordpress仅在需要时生成拇指。例如主页滑块将仅使用10张图像,而我不希望其他1000张图像生成该缩略图,因为这会浪费空间和资源。
有一种方法仅在需要时触发add_image_size?
感谢
UPDATE正如您所提到的,add_image_size并不是真正需要触发的内容。最好是在我使用the_post_thumbnail('slider-thumb')时触发图像调整大小;
这可能会减慢图像的第一个视图,但是该视图通常是由我在实际查看帖子时生成的所以我不在乎。
因此,在我的帖子,滑块,博客缩略图,作品集缩略图等之间,我得到了1000张图像,并且我只想为滑块重新调整10张图像的大小,我看到了很多浪费的资源生成其他990张图像的缩略图大小。
希望现在清除,对不起我的英语
#1 楼
看看Otto的Dynamic Image Resizer插件该插件改变了WordPress创建图像的方式,使之
仅当它们实际用于某处时,才生成图像
飞。这样创建的图像将保存在正常的上载目录中,以供Web服务器稍后快速发送。结果是
节省了空间(因为仅在需要时才创建图像),并且
上传图像的速度要快得多(因为它不再在上载时生成图像
)。
评论
请注意,该插件在将图像添加到旧帖子时遇到问题。欢迎补丁。
–奥托
2012年5月26日下午2:18
那正是我想要的。我会试一试。因此,它仅适用于新帖子?
– chifliiiii
2012年5月26日16:04
对于现在接触本文的人来说,这是一个正在积极开发的类似插件:wordpress.org/plugins/fly-dynamic-image-resizer
–蒂姆·马隆(Tim Malone)
16 Mar 23 '16 at 1:08
#2 楼
将其放在主题函数文件中。上传时,它将阻止Wordpress创建除3种默认大小以外的任何内容。然后以尚未生成的特定大小请求图像时,将仅创建一次。
/>
add_filter('image_downsize', 'ml_media_downsize', 10, 3);
function ml_media_downsize($out, $id, $size) {
// If image size exists let WP serve it like normally
$imagedata = wp_get_attachment_metadata($id);
if (is_array($imagedata) && isset($imagedata['sizes'][$size]))
return false;
// Check that the requested size exists, or abort
global $_wp_additional_image_sizes;
if (!isset($_wp_additional_image_sizes[$size]))
return false;
// Make the new thumb
if (!$resized = image_make_intermediate_size(
get_attached_file($id),
$_wp_additional_image_sizes[$size]['width'],
$_wp_additional_image_sizes[$size]['height'],
$_wp_additional_image_sizes[$size]['crop']
))
return false;
// Save image meta, or WP can't see that the thumb exists now
$imagedata['sizes'][$size] = $resized;
wp_update_attachment_metadata($id, $imagedata);
// Return the array for displaying the resized image
$att_url = wp_get_attachment_url($id);
return array(dirname($att_url) . '/' . $resized['file'], $resized['width'], $resized['height'], true);
}
add_filter('intermediate_image_sizes_advanced', 'ml_media_prevent_resize_on_upload');
function ml_media_prevent_resize_on_upload($sizes) {
// Removing these defaults might cause problems, so we don't
return array(
'thumbnail' => $sizes['thumbnail'],
'medium' => $sizes['medium'],
'large' => $sizes['large']
);
}
评论
该文件管理器应该是WordPress中的标准文件。为什么要为每个图像生成每种尺寸?我将此代码添加到我的自定义主题。谢谢
– Michaelkay
2014年5月23日在17:19
很好,但是如果我只需要一个自定义尺寸,它仍然会生成所有图像。
– Gijs
15年1月10日在19:44
当我使用高级自定义字段中的图像对象时发生
– Gijs
15年1月10日在20:26
如果先前定义了add_image_size且图像尺寸刚刚更改,则无法使用
–本杰明·因塔尔(Benjamin Intal)
15年1月21日在10:19
@Michaelkay这种方法会降低性能。当上传图片并生成各种尺寸的图片时,意味着上传者是耐心的。此代码使您的访问者必须更加耐心,并且Google已经证明,加载时间超过2秒的网站会使50%的人流失。另外,如果您的站点有数百个并发访问,这将使您的服务器停机。
–汤姆·罗格罗(Tom Roggero)
19年3月8日在16:01
#3 楼
不幸的是,@ Patrick的答案破坏了WP 4.4中引入的srcset函数。幸运的是,我们只需要添加两个附加功能即可!首先,我们需要将所有已注册的缩略图大小临时重新引入到图像元数据中,以便可以将其视为:
function bi_wp_calculate_image_srcset_meta($image_meta, $size_array, $image_src, $attachment_id){
//all registered sizes
global $_wp_additional_image_sizes;
//some source file specs we'll use a lot
$src_path = get_attached_file($attachment_id);
$src_info = pathinfo($src_path);
$src_root = trailingslashit($src_info['dirname']);
$src_ext = $src_info['extension'];
$src_mime = wp_check_filetype($src_path);
$src_mime = $src_mime['type'];
$src_base = wp_basename($src_path, ".$src_ext");
//find what's missing
foreach($_wp_additional_image_sizes AS $k=>$v)
{
if(!isset($image_meta['sizes'][$k]))
{
//first, let's find out how things would play out dimensionally
$new_size = image_resize_dimensions($image_meta['width'], $image_meta['height'], $v['width'], $v['height'], $v['crop']);
if(!$new_size)
continue;
$new_w = (int) $new_size[4];
$new_h = (int) $new_size[5];
//bad values
if(!$new_h || !$new_w)
continue;
//generate a filename the same way WP_Image_Editor would
$new_f = wp_basename("{$src_root}{$src_base}-{$new_w}x{$new_h}." . strtolower($src_ext));
//finally, add it!
$image_meta['sizes'][$k] = array(
'file' => $new_f,
'width' => $new_w,
'height' => $new_h,
'mime-type' => $src_mime
);
}
}
return $image_meta;
}
add_filter('wp_calculate_image_srcset_meta', 'bi_wp_calculate_image_srcset_meta', 10, 4);
然后我们需要遍历比赛并生成所有丢失的缩略图:
function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){
//get some source info
$src_path = get_attached_file($attachment_id);
$src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME));
//the actual image metadata (which might be altered here)
$src_meta = wp_get_attachment_metadata($attachment_id);
//an array of possible sizes to search through
$sizes = $image_meta['sizes'];
unset($sizes['thumbnail']);
unset($sizes['medium']);
unset($sizes['large']);
$new = false;
//loop through sources
foreach($sources AS $k=>$v)
{
$name = wp_basename($v['url']);
if(!file_exists("{$src_root}{$name}"))
{
//find the corresponding size
foreach($sizes AS $k2=>$v2)
{
//we have a match!
if($v2['file'] === $name)
{
//make it
if(!$resized = image_make_intermediate_size(
$src_path,
$v2['width'],
$v2['height'],
$v2['crop']
)){
//remove from sources on failure
unset($sources[$k]);
}
else
{
//add the new thumb to the true meta
$new = true;
$src_meta['sizes'][$k2] = $resized;
}
//remove from the sizes array so we have
//less to search next time
unset($sizes[$k2]);
break;
}//match
}//each size
}//each 404
}//each source
//if we generated something, update the attachment meta
if($new)
wp_update_attachment_metadata($attachment_id, $src_meta);
return $sources;
}
add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5);
评论
提醒一下,这将使您无法正常耕种!我花了几个小时才发现这是罪魁祸首。我正在研究解决方案...
–ConstantinGroß
18年2月22日在7:25
#4 楼
实际上,add_image_size()
不会生成缩略图,它只是注册一个可供WordPress使用的图像大小。通常,缩略图是在首次上传图像时生成的。这是一个自动过程,因此您不必担心以后生成它们。可以这样考虑-如果在慢速的服务器上生成缩略图需要1-2秒的时间,而您一直等到收到请求,则强制被请求者每张图像再等待1-2秒才能看到内容。提前执行此操作要容易得多-即在上传图像时。
同时,如果您绝对必须在其他时间处理缩略图,则可能需要查看一下毒蛇的Regenerate Thumbnails插件。它使用按需操作来重新生成所有图像缩略图...但是您可以使用类似的代码仅在需要时生成缩略图。
评论
我认为您没有明白这一点。他想控制需要缩略图的图像。因此,有些图像根本不需要调整大小。
– imrek
15年3月21日在16:55
大多数人会在插入照片时测试页面(我想说的还不错),它们会导致生成所需的文件,一次又一次地完成。就我而言,我已注册了标头图像尺寸。我上传的20张图片中大约有1张实际上是用于标题的。因此,我的图书馆中20张图片中有19张浪费了空间。
– JpaytonWPD
16 Dec 5'在0:55
#5 楼
只有在需要时才可以触发add_image_size吗?
不完全是。但是您可以在生成缩略图之前过滤已注册尺寸的列表。 wp_generate_attachment_metadata()函数(调用生成缩略图的函数)具有一个名为“ intermediate_image_sizes_advanced”的过滤器,该过滤器使您可以在生成文件之前操纵大小数组。每当您要添加某种“类型”的图像时,都可以使用此过滤器,然后在之后立即将其删除。
我想您的最大挑战是弄清楚如何区分那些需要多余的尺寸,不需要的尺寸。
评论
例如,当我上载媒体时,我必须添加一个选项或复选框来选择要生成的夹心拇指。听起来不错,但我不知道该怎么做
– chifliiiii
2012年5月25日23:19
#6 楼
您可以使用我(不是Ottos)的“动态图像调整大小” 1)插件。“动态图像调整大小”是一种WordPress(MU-)插件,提供了简码和模板标签。无需TimThumb,但具有WP核心功能即可“在飞行中”调整图像大小。
该插件还带有模板标签和简码。
1)刚发现有关Ottos插件的信息。命名冲突不是故意的。
#7 楼
您可以尝试使用此插件:https://wordpress.org/plugins/optimize-images-resizing
它会根据您注册的图像大小来调整图像大小,但仅在需要时才会显示。
还可以清理现有的图像大小,以便重新生成。
#8 楼
WP Performance Pack插件提供了“改进的图像处理”,它基于Ottos Dynamic Image Resizer,但包括许多改进,例如:首先,它与最新的WordPress版本(3.9.1)兼容,使用WP_Image_Editor,可以保存缩略图可以关闭(但可以缓存它们并且可以使用CDN支持),重新生成Thumbails集成(以删除现有缩略图)等等。#9 楼
在其他地方,所有设定的大小都可以使用,但是如果您要上载特定的大小,则仅在媒体上载时可用,以下是该代码。这是更多描述的链接-https://developer.wordpress.org/reference/hooks/wp_handle_upload_prefilter/add_filter('wp_handle_upload_prefilter', 'custom_upload_filter' );
function custom_upload_filter( $file ) {
foreach ( get_intermediate_image_sizes() as $size ) {
if ( !in_array( $size, array( 'thumbnail', 'medium', 'medium_large', 'large' ) ) ) {
remove_image_size( $size );
}
}
return $file;
}
#10 楼
您也可以尝试Aqua Resizer-https://github.com/syamilmj/Aqua-Resizer/它只是一个文件。
您可以像这样使用它:
$img_src = aq_resize( $img_src, $width = null, $height = null, $crop = null, $single = true, $upscale = false );
$img_src = aq_resize( $img_src, 150, 150); // resized
$img_src = aq_resize( $img_src, 150, 150, true); // cropped
$img_src = aq_resize( $img_src, 150, 150, null, null, true); // image with 120x120 for example will be upscaled up to 150x150
#11 楼
这里是另一种方法:它与404 HTTP错误处理挂钩。即,当缩略图不可用时,找到原始图像并创建缩略图。请注意,这并不能真正解决您的问题,因为它无法阻止上传过程中生成缩略图。请注意,恶意用户可能会使用此插件来创建任意数量的缩略图,从而耗尽您的精力。磁盘空间。
注意:此插件可以使用Pluginception轻松安装。
<?php
/*
Plugin Name: Create thumbnails on demand
Plugin URI:
Description: Create thumbnails instead of showing 404. Use in combination with "Broken Link Checker" to create all missing thumbnails.
Version: 0.1
Author: Jack Miller
Author URI:
License:
License URI:
*/
add_filter('status_header', 'createThumbIf404');
function createThumbIf404($httpCodeString) //e.g. HTTP/1.1 200 OK
{
global $wp_query;
error_reporting(E_ALL);
ini_set('display_errors', 1);
$httpCode = explode(" ", $httpCodeString);
$httpCode = $httpCode[1];
if ($httpCode == "404") {
$requestUri = $_SERVER["REQUEST_URI"];
$regex = '/^\/(wp-content\/uploads\/(?:[a-zA-Z0-9]*\/){2})(.*)-(.*)x(.*)\.jpg$/';
preg_match($regex, $requestUri, $groups);
if (sizeof($groups) === 5) {
$baseDir = $groups[1];
$baseName = $groups[2];
$sizeX = $groups[3];
$sizeY = $groups[4];
$oriImg = ctod_checkFile($baseDir, $baseName);
if ($oriImg != null) {
$image = wp_get_image_editor($baseDir . $oriImg);
if (!is_wp_error($image)) {
$image->resize($sizeX, $sizeY, true);
$thumb = $baseDir . $baseName . '-' . $sizeX . 'x' . $sizeY . '.jpg';
$image->save($thumb);
ctod_sendImageAndExit($thumb);
}
}
}
}
}
//finds original image within $baseDir with $baseName.
//Returns file name including extension of original image or null.
function ctod_checkFile($baseDir, $baseName)
{
$arr = array(
".jpg",
".JPG",
".jpeg",
".JPEG"
);
foreach ($arr as &$ext) {
if (file_exists($baseDir . $baseName . $ext)) {
return $baseName . $ext;
}
}
return null;
}
//Read file at $path from disk and return it as HTTP JPG image request.
function ctod_sendImageAndExit($path)
{
$fp = fopen($path, 'rb');
header("Content-Type: image/jpeg");
header("Content-Length: " . filesize($path));
fpassthru($fp);
exit();
}
评论
与最初的990张未使用的图像相比,如何从额外的990张图像生成的缩略图浪费更多的空间和资源?仅上传您正在使用的图像是否更有意义?即使更多熟练的程序员提出反对您想法的有效论据,我也觉得很有趣。我看到了一些插件和主题,这些插件和主题可以上传图像而不会产生拇指(现在不确定是哪个)。但是我对您的问题的最大怀疑是:您什么时候需要它?什么是过滤器?
你误会我的意思。我在帖子中使用了990张图片,只是在首页滑块中不使用。其中有些我需要投资组合的拇指,另一些需要博客拇指的手指,等等