自动替换大图片尺寸的原始上传图片

时间:2012-08-31 作者:Shaun

由于我们的用户定期上传约6MB的图片供网站使用(而且不太熟悉如何先调整大小),WordPress会存储原始图片,并将其调整为几种不同的大小。

我想要一个函数或插件,它可以获取上传的图像,将其大小调整为更易于管理的大小,然后替换原始图像。

我见过一些删除原始缩略图但不替换它的函数,这意味着以后无法重新生成缩略图。我需要这个被替换,以便用户可以上传一个大图像,它会自动缩小大小,并存储,以便将来需要时调整大小。

4 个回复
最合适的回答,由SO网友:Paul Phillips 整理而成

将此添加到函数中。主题文件夹中的php文件。它将使用“设置”中设置的大图像替换原始图像。您可能需要设置新的图像格式,并将其用作新的原始大小。

function replace_uploaded_image($image_data) {
      // if there is no large image : return
  if (!isset($image_data[\'sizes\'][\'large\'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir[\'basedir\'] . \'/\' .$image_data[\'file\'];
  // $large_image_location = $upload_dir[\'path\'] . \'/\'.$image_data[\'sizes\'][\'large\'][\'file\']; // ** This only works for new image uploads - fixed for older images below.
  $current_subdir = substr($image_data[\'file\'],0,strrpos($image_data[\'file\'],"/"));
  $large_image_location = $upload_dir[\'basedir\'] . \'/\'.$current_subdir.\'/\'.$image_data[\'sizes\'][\'large\'][\'file\'];

  // delete the uploaded image
  unlink($uploaded_image_location);

  // rename the large image
  rename($large_image_location,$uploaded_image_location);

  // update image metadata and return them
  $image_data[\'width\'] = $image_data[\'sizes\'][\'large\'][\'width\'];
  $image_data[\'height\'] = $image_data[\'sizes\'][\'large\'][\'height\'];
  unset($image_data[\'sizes\'][\'large\']);

  return $image_data;
}

add_filter(\'wp_generate_attachment_metadata\',\'replace_uploaded_image\');

SO网友:timocouckuyt

上面的解决方案中有一个讨厌的bug。该解决方案对新图像很有吸引力,但对于旧图像,您永远不应该与$upload_dir[\'path\'] 因为这是当月的当前上载文件夹。

更换以下部件:

//$large_image_location = $upload_dir[\'path\'] . \'/\'.$image_data[\'sizes\'][\'large\'][\'file\'];
$large_image_location = $upload_dir[\'basedir\'] . \'/\'.$image_data[\'sizes\'][\'large\'][\'path\'];

SO网友:leendertvb

我可以建议更新上述答案的代码吗?不幸的是,在新版本的Wordpress中,不再为文件大小提供“路径”键。因此,要使其在较旧的上传后工作,我们应该首先从原始图像中获取当前细分曲面,并使用它为大型图像创建位置路径。

因此,请替换此行:

$large_image_location = $upload_dir[\'basedir\'] . \'/\'.$image_data[\'sizes\'][\'large\'][\'path\'];
通过以下两行:

$current_subdir = substr($image_data[\'file\'],0,strrpos($image_data[\'file\'],"/"));
$large_image_location = $upload_dir[\'basedir\'] . \'/\'.$current_subdir.\'/\'.$image_data[\'sizes\'][\'large\'][\'file\'];

SO网友:Pitchpole

我在这里发布了另一个非常类似的问题,但认为值得转载。

我对上面的代码有问题,对我有效的是基本上改变了这些行:

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);
使用:

    $file_to_be_copied = $large_image_location; 
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\\n";
    }
我在这里发布了我的完整代码和更多解释:Delete original image - keep thumbnail?

结束

相关推荐

images in wordpress themes

我正在用wordpress开发一个php主题。我想在网站上显示图像。所以我的问题是什么是最佳实践1) 使用数据库服务器的“图像”或“二进制数据”数据类型将图像本身存储在表中。或2) 将图像作为文件存储在文件系统中,并在表中创建一条记录,其中包含该图像的确切路径。。尽量少打扰数据库。