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


13

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

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

我已经看到一些删除原始文件但不替换原始文件的功能,这意味着以后无法重新生成缩略图。我需要更换它,以便用户可以上传较大的图像,并且图像会自动缩小并存储,以备将来需要时调整大小。

Answers:


10

将其添加到主题文件夹中的functions.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');

1
如果此解决方案有效,那么制作一个插件将非常有用。
阿列克谢(Alexey)2012年

我刚刚再次尝试过,但是首先我添加了一个新的尺寸(称为“全尺寸”),该尺寸为2048x1536(是我需要的两倍),现在一切正常,原始图像保存为原来的两倍。而不是很多次,只要我需要它们(我希望将来保留)就可以了。谢谢!
肖恩

很棒的东西,很高兴为您解决了!
Paul Phillips

这段代码从我的functions.php文件中删除了所有内容。我在WP编辑器和FTP中签入,文件为空。必须从备份中还原文件。:(
jlg

1
@Ciprian您必须设置一个脚本来遍历所有脚本。我确定有一种WordPress方式来获取所有附件信息,但是$ wpdb-> get_col('从wp_posts处的SELECT ID,其中post_type =“ attachment” ORDER BY id'); 将工作以获取图像的发布ID列表。也许添加:AND post_mime_type =“ image / jpeg”也不限于jpeg。每个图像的实际位置保存在wp_postmeta中。
保罗·菲利普斯

3

上面的解决方案中有一个令人讨厌的错误。该解决方案可以用作新图像的附件,但对于旧图像,则绝对不能与之相比,$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'];

2

我可以建议对上述答案的代码进行更新吗?不幸的是,在较新版本的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'];

0

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

我上面的代码有问题,实际上对我有用的是更改这些行:

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";
    }

我在此处发布了完整的代码和更多说明: 删除原始图像-保留缩略图吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.