如何只在需要的时候生成缩略图?

时间:2012-05-25 作者:chifliiiii

我有1000张图片。如何使wordpress仅在需要时生成thumb。例如,主滑块将只使用10幅图像,我不希望其他1000幅图像生成缩略图,因为这是对空间和资源的浪费。

是否有一种方法可以仅在需要时激发add\\u image\\u size?

谢谢

UPDATE 正如您所提到的,并不是真正添加需要激发的image\\u大小。当我使用the_post_thumbnail(\'slider-thumb\');也许这会减慢图像的第一个视图,但该视图通常是我在实际查看帖子时生成的,所以我不在乎。

因此,在我的帖子、slider、博客缩略图、公文包缩略图等中,我得到了1000幅图像,我只想为slider调整10幅图像的大小。我看到了为其他990幅图像生成缩略图所浪费的大量资源。

希望现在清楚了,对不起我的英语

11 个回复
最合适的回答,由SO网友:Chris_O 整理而成

看看奥托的Dynamic Image Resizer plugin

该插件改变了WordPress创建图像的方式,使其仅在实际使用图像时才生成图像。由此创建的图像将保存在正常的上载目录中,以便以后由Web服务器快速发送。结果是节省了空间(因为图像只在需要时创建),上传图像的速度更快(因为它不再生成上传图像)。

SO网友:Patrick

将其放入主题函数文件中。它将阻止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\']
            );
        }

SO网友:Josh

不幸的是,@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);

SO网友:EAMann

事实上add_image_size() 不会生成缩略图,它只是将图像大小注册为WordPress可用的大小。

通常,缩略图是在首次上载图像时生成的。这是一个自动过程,因此您不必担心以后会生成它们。这样想吧——如果在速度较慢的服务器上生成缩略图需要1-2秒的时间,而你一直等到它被请求时,你就迫使请求者每幅图像再等待1-2秒才能看到内容。提前完成这项工作要容易得多,即在上传图像时。

同时,如果您必须在不同的时间处理缩略图,您可能需要看一下Viper\'s Regenerate Thumbnails 插件。它使用按需操作重新生成所有图像缩略图。。。但您可以使用类似的代码仅在需要时生成缩略图。

SO网友:MathSmath

是否有一种方法可以仅在需要时激发add\\u image\\u size?

不完全是这样。但您可以在生成缩略图之前过滤注册大小的列表。wp\\u generate\\u attachment\\u metadata()函数(调用生成缩略图的函数)有一个名为“intermediate\\u image\\u size\\u advanced”的过滤器,可以在生成文件之前操作大小数组。您可以在添加特定“类型”的图像时使用此过滤器,然后立即将其删除。

我想你最大的挑战是找出如何区分需要额外尺寸的图像和不需要额外尺寸的图像。

SO网友:kaiser

您可以使用my(而不是Ottos)"Dynamic Image Resize" 1)插件。

“动态图像调整大小”是一个WordPress(MU-)插件,它提供了一个短代码和一个模板标签来调整“飞行中”的图像大小,无需TimThumb,但具有WP核心功能。

该插件附带一个模板标记和shortcode

刚刚了解了Ottos插件。命名冲突不是有意的

SO网友:user2128576

您可以尝试此插件:https://wordpress.org/plugins/optimize-images-resizing

它根据您注册的图像大小调整图像大小,但仅在需要时调整。还可以清理现有图像大小,以便它们可以重新生成。

SO网友:Björn

WP Performance Pack 插件提供了“改进的图像处理”,它基于Ottos动态图像大小调整器,但包括许多改进,例如:首先,它与最新WordPress版本(3.9.1)兼容,使用WP\\U image\\u编辑器,可以关闭缩略图保存(但可以缓存缩略图,并且CDN支持正在进行),重新生成缩略图集成(删除现有缩略图)等等。

SO网友:Jack Miller

这里还有另一种方法:它与404HTTP错误处理挂钩。也就是说,当缩略图不可用时,找到原始图像并创建缩略图。请注意,这并不能真正解决您的问题,因为它不会阻止上载过程中缩略图的生成。

还要注意,恶意用户可能会使用此插件创建任意数量的缩略图,从而耗尽磁盘空间。

注意:此插件可以使用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();
}

SO网友:Krishna Shah

在其他地方,所有制作的尺寸都适用,但只有在媒体上传时,如果您想上传特定的尺寸,下面是它的代码。以下是更多说明的链接-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;
}

SO网友:gorodezkiy

您也可以尝试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

结束

相关推荐

Load images after page load

我刚刚听说,通过使用一些javascript,可以在整个页面加载完成后加载页面,当我搜索时,我发现LazyLoad, 但最新的浏览器似乎不支持它。我的网站有一些图片,因为哪些网站速度变慢,是否可以在页面加载完成后加载图片?