首页 > 解决方案 > WordPress:始终为自定义图像大小创建图像,即使上传的图像小于自定义大小

问题描述

我想在 WordPress 中生成额外的图像大小。WP 让你可以add_image_size这样使用:

// Make sure featured images are enabled
add_theme_support( 'post-thumbnails' );

// Add featured image sizes
add_image_size( 'original-img', 2000, 99999 );

如果图像有最小值。宽度为 2000px,将生成图像大小。但是,如果图像较小,则不会生成自定义尺寸。

无论上传的图像大小如何,是否有任何选项可以每次创建自定义图像大小的图像?或者也许可以额外保存原始图像?

解释我为什么要实现:我需要在我的图像上添加水印,但还需要没有水印的原始图像(或非常大的图像)。

我也尝试使用“大”图像,但这里同样的问题。通过上传小于 1024 像素的图像,将不会创建图像大小。

标签: wordpress

解决方案


wp_generate_attachment_metadata如果尚未创建上传的图像,您可以在那里挂接并复制上传的图像。我在下面包含了执行此操作的代码。

将此添加到您的functions.php。每个步骤都被注释以解释它的作用,但基本上是在上传过程中:

  • 我们检查 WP 是否创建了您的自定义尺寸
  • 如果是,什么都不做
  • 否则创建一个名为 imagename-WxH.extn 的图像副本(egif 上传的图像是 cat.jpg 并且是 700x520px,我们的副本将被调用cat-700x520px.jpg
  • 将复制的图像添加为您的自定义尺寸original-img

然后你可以original-img在你的代码中使用你的自定义尺寸并且总是有一个图像。

// Make sure featured images are enabled
add_theme_support( 'post-thumbnails' );

// Add featured image sizes
add_image_size( 'original-img', 2000, 99999 );


// Hook into the upload process
add_filter('wp_generate_attachment_metadata','copy_original_img');
// Check if the original image was added, if not make a copy and add it as original-img
function copy_original_img($image_data) {

    // if the original-img was created, we don't need to do anything
    if (isset($image_data['sizes']['original-img']))
        return;

    // 1. make a copy of the uploaded image to use for original-img

    $upload_dir     = wp_upload_dir();
    $uploaded_img   = $image_data['file'];
    $img_w          = $image_data['width'];
    $img_h          = $image_data['height'];

    // construct the filename for the copy in the format: imagename-WxH.extn
    $path_parts = pathinfo($uploaded_img);
    $new_img = $path_parts['filename']."-".$img_w."x".$img_h.".".$path_parts['extension'];

    // make a copy of the image 
    $img_to_copy = $upload_dir['path'] . '/'.$uploaded_img;
    $new_img_path = $upload_dir['path'] . '/'.$new_img;
    $success = copy($img_to_copy,$new_img_path);


    // 2. If the image was copied successfully, add it into the image_data to be returned:
    if ($success){
        $image_data['sizes']['original-img']['file']        = $new_img;
        $image_data['sizes']['original-img']['width']       = $img_w ; // same as uploaded width
        $image_data['sizes']['original-img']['height']      = $img_h; // same as uploaded height
        $image_data['sizes']['original-img']['mime-type']   = mime_content_type($new_img_path);
    }

    return $image_data;
}

推荐阅读