Tự động thay thế hình ảnh được tải lên ban đầu với kích thước hình ảnh lớn


13

Vì người dùng của chúng tôi thường xuyên tải lên ~ 6 MB hình ảnh để sử dụng trên trang web (và không quá quen thuộc với cách thay đổi kích thước của chúng trước tiên), WordPress lưu trữ bản gốc cũng như thay đổi kích thước của chúng thành nhiều kích thước khác nhau.

Tôi muốn một chức năng hoặc plugin lấy hình ảnh được tải lên, thay đổi kích thước của nó thành một cái gì đó dễ quản lý hơn và sau đó thay thế bản gốc.

Tôi đã thấy một số chức năng xóa bản gốc nhưng không thay thế nó, có nghĩa là không thể tạo lại hình thu nhỏ vào một ngày sau đó. Tôi cần thay thế cái này để người dùng có thể tải lên một hình ảnh lớn và nó sẽ tự động thay đổi kích thước và lưu trữ để thay đổi kích thước trong tương lai nếu cần.

Câu trả lời:


10

Thêm phần này vào tệp tin.php trong thư mục chủ đề. Nó thay thế hình ảnh gốc bằng hình ảnh lớn được đặt trong cài đặt. Bạn có thể muốn thiết lập một định dạng hình ảnh mới và sử dụng nó làm kích thước ban đầu mới.

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
Nếu giải pháp này hoạt động, nó sẽ rất hữu ích để tạo một plugin.
Alexey

Tôi vừa thử lại lần nữa, nhưng trước tiên tôi đã thêm một kích thước mới (được gọi là 'fullsize') là 2048x1536 (lớn gấp đôi so với tôi cần) và bây giờ tất cả đều hoạt động, hình ảnh gốc được lưu lại chỉ bằng hai lần lớn như tôi cần chúng (mà tôi muốn giữ cho tương lai) thay vì nhiều lần. Cảm ơn!
Shaun

Công cụ tuyệt vời, vui mừng nó làm việc cho bạn!
Paul Phillips

Mã này đã xóa mọi thứ khỏi tập tin tests.php của tôi. Tôi đã kiểm tra trình soạn thảo WP và FTP và tập tin trống. Phải khôi phục tập tin từ bản sao lưu. :(
jlg

1
@Ciprian Bạn sẽ phải thiết lập một kịch bản để lặp lại tất cả chúng. Tôi chắc chắn có một cách WordPress để nhận tất cả thông tin tệp đính kèm nhưng $ wpdb-> get_col ('id id TỪ wp_posts WHERE post_type = "tệp đính kèm" ORDER BY id'); sẽ làm việc để có được một danh sách Id bài đăng cho hình ảnh. Có thể thêm: AND post_mime_type = "image / jpeg" để giới hạn chỉ jpeg. Vị trí thực tế của mỗi hình ảnh được giữ trong wp_postmeta.
Paul Phillips

3

Có một lỗi khó chịu trong giải pháp trên. Giải pháp hoạt động như một nét quyến rũ cho hình ảnh mới, nhưng đối với hình ảnh cũ, bạn không bao giờ nên so sánh với $upload_dir['path']vì đó là thư mục tải lên hiện tại của tháng hiện tại.

Thay thế như sau:

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

2

Tôi có thể đề nghị một bản cập nhật cho mã của câu trả lời trên không? Thật không may, trong các phiên bản mới hơn của Wordpress, 'đường dẫn' không còn được cung cấp cho các kích thước tệp. Vì vậy, để làm cho nó hoạt động trên các bài đăng tải cũ hơn, trước tiên chúng ta nên lấy thư mục con hiện tại từ ảnh gốc và sử dụng phần này để tạo đường dẫn vị trí cho ảnh lớn.

Vì vậy, thay thế dòng này:

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

bởi 2 dòng này:

$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

Tôi đã đăng bài này lên một câu hỏi tương tự khác ở đây nhưng nghĩ rằng nó đáng để đăng lại.

Tôi đã có vấn đề với mã ở trên và những gì làm việc cho tôi về cơ bản là thay đổi các dòng này:

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);

với:

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

Tôi đã đăng mã đầy đủ của mình và giải thích thêm ở đây: Xóa hình ảnh gốc - giữ hình thu nhỏ?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.