Xóa hình ảnh gốc - giữ hình thu nhỏ?


8

Tôi đang sử dụng rất nhiều hình thu nhỏ nhưng không bao giờ là tệp gốc. Để tiết kiệm dung lượng, tôi muốn ngăn bản gốc được lưu trên đĩa nhưng chỉ giữ hình thu nhỏ 100px. Tôi có thể làm cái này như thế nào?

Cảm ơn, Dennis


1
có thể là một ý tưởng có thể không tải lên hình ảnh lớn ở nơi đầu tiên?

2
Không phải là một lựa chọn vì các bài nộp có nguồn gốc đám đông :)
FLX

1
Liệu một kịch bản cron đi qua và định kỳ xóa bản gốc sẽ là một tùy chọn?
Joshua

vui lòng xem câu trả lời của tôi cho cùng một câu hỏi wordpress.stackexchange.com/questions/17719/iêu
Cristian

Nếu bạn đã có một số hình ảnh và khám phá điều này sau, hãy sử dụng tiện ích mở rộng này: wordpress.org/plugins/regenerate-thumbnails Nó gọi hook được sử dụng trong các câu trả lời của Cristian và SimonSimCity
SimonSimCity

Câu trả lời:


11
add_filter( 'wp_generate_attachment_metadata', 'delete_fullsize_image' );
function delete_fullsize_image( $metadata )
{
    $upload_dir = wp_upload_dir();
    $full_image_path = trailingslashit( $upload_dir['basedir'] ) . $metadata['file'];
    $deleted = unlink( $full_image_path );

    return $metadata;
}

Tuyệt vời, nó hoạt động! Vấn đề duy nhất (nhỏ) tôi gặp phải là khi tôi nhìn vào Thư viện phương tiện, nó không hiển thị hình ảnh vì hình ảnh đầy đủ (rõ ràng) đã bị xóa. Có cách nào để đặt hình thu nhỏ làm Biểu tượng Thư viện Phương tiện không? Ví dụ: i.imgur.com/koijq.png (trên cùng đang sử dụng phương thức của bạn, dưới cùng là bản gốc không xóa)
FLX

Nếu bạn thử làm mới cmd tôi nghĩ WP đủ thông minh để sử dụng phiên bản khác. Tôi đã sử dụng phương pháp này một thời gian trước đây để không thể nhớ. Tôi phải chơi xung quanh nó. Xin lỗi tôi không có câu trả lời trực tiếp bây giờ!
Cristian

1
Nếu đây là 'chỉ' về việc xóa những hình ảnh 16 MPix khổng lồ mà người dùng cuối có thể tải lên, một phiên bản khác có thể là sao chép một hình thu nhỏ hơi nhỏ vào tên cũ. Theo cách đó, vẫn còn dung lượng được lưu 95%, không ai có thể truy cập toàn bộ (kể từ khi nó biến mất), nhưng Thư viện truyền thông hiển thị vẫn sẽ hoạt động ... (?)
Frank Nocke

4

Tôi foud một giải pháp khác trong web. Nó dựa trên cái được chấp nhận ở đây, nhưng nó còn đưa nó đi xa hơn.

Một, được chấp nhận ở đây, loại bỏ hình ảnh chính và tiếp tục. Giải pháp tôi tìm thấy thay thế hình ảnh gốc bằng hình ảnh được tạo cho "lớn". Nó chỉ tiếp tục mà không thay thế nếu độ phân giải hình ảnh này không được xác định.

Bằng cách này, đảm bảo rằng mọi tập lệnh, dựa trên hình ảnh gốc, vẫn sẽ hoạt động như trước - ví dụ như quá trình tái tạo của bộ ba.

http://www.wprecipes.com/how-to-automatically-use-resized-image-instead-of-originals

BIÊN TẬP:

@dalbaeb chỉ cho tôi một vấn đề được viết trong các bình luận trên bài đăng trên blog. Tôi viết lại mã dựa trên API thay vì giải pháp được cung cấp ở đó. Đó không phải là quá nhiều sự khác biệt, mà chỉ để sử dụng cùng các lệnh gọi như trong API;)

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_filename = $image_data['sizes']['large']['file'];

    // Do what wordpress does in image_downsize() ... just replace the filenames ;)
    $image_basename = wp_basename($uploaded_image_location);
    $large_image_location = str_replace($image_basename, $large_image_filename, $uploaded_image_location);

    // 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']);

    // Check if other size-configurations link to the large-file
    foreach($image_data['sizes'] as $size => $sizeData) {
        if ($sizeData['file'] === $large_image_filename)
            unset($image_data['sizes'][$size]);
    }

    return $image_data;
}
add_filter('wp_generate_attachment_metadata', 'replace_uploaded_image');

EDIT2:

Tôi gặp vấn đề với mã trên một máy khách trong đó cấu hình kích thước khác được liên kết với tệp lớn. Tôi cập nhật mã cho phù hợp. Nếu bạn có bất kỳ vấn đề nào với nó, hãy gửi thư cho tôi.


Cảm ơn đã đăng một sự thay thế! Mặc dù 1) giải pháp có vẻ có lỗi theo các bình luận sau bài viết; và 2) luôn luôn tốt để gửi mã trực tiếp trong câu trả lời, vì bài viết được liên kết luôn có thể biến mất.
montrealist

2
Cảm ơn vì gợi ý, @dalbaeb. Tôi đã cập nhật nhận xét của mình cho phù hợp.
SimonSimCity


0

Tôi biết điều này rất cũ nhưng tôi vẫn cần giải quyết vấn đề này, điều này có thể đã làm việc cho hình ảnh mới khi tôi sử dụng nó trong hàm.php. Tôi đã có một số vấn đề và hình ảnh trở nên không sử dụng được và tôi cũng không thể khai thác điều này để cập nhật hình ảnh hiện có. Tôi đã có khoảng 2000 hình ảnh hiện tại tôi cần để đi qua tất cả chúng và làm cho tất cả các hình ảnh lớn cũ nhỏ hơn. Tôi đã tạo một trang ở mặt trước mà chỉ quản trị viên mới có thể truy cập và sử dụng mã này.

Sự khác biệt lớn ở đây là thay vì xóa hình ảnh OG và đổi tên hình ảnh 'lớn' thành tên OG. (Điều này không hiệu quả với tôi, tôi đã mất khá nhiều hình ảnh khi thử phương pháp này) Vì vậy, thay vào đó tôi đã sao chép hình ảnh lớn và đặt tên cho bản sao giống như hình ảnh OG. Do đó, hình ảnh lớn bị ghi đè bởi hình ảnh 'lớn' nhỏ hơn. Ngoài ra, ở mặt trước, tôi phải thay đổi cách siêu dữ liệu được cập nhật.

Trước tiên hãy kiểm tra điều này trên từng bài đăng, hãy chắc chắn rằng điều này hiệu quả với bạn trước khi thay đổi numpost thành -1. Tôi đã ngu ngốc mất khoảng 100 hình ảnh cố gắng chạy mã gốc mà không kiểm tra cẩn thận kết quả trước.

MÃ KẾT THÚC KẾT THÚC ĐỂ CẬP NHẬT HÌNH ẢNH HIỆN TẠI:

function replace_uploaded_image_frontend($image_data, $attachment_id) {

 // 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'];
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  //Original code was delete OG file and rename the large file to the OG name. This means you no longer have the large size image. So...
  //Instead I want to take the large file and make a copy and overwrite it over the large file.
    $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";
    }  
    fixImageMeta($attachment_id );

}

    function fixImageMeta($attach_id) {

            $file = get_attached_file($attach_id);
            if (!empty($file)) {
                $info = getimagesize($file);
                $meta = array (
                    'width' => $info[0],
                    'height' => $info[1],
                    'hwstring_small' => "height='{$info[1]}' width='{$info[0]}'",
                    'file' => basename($file),
                    'sizes' => array(),         // thumbnails etc.
                    'image_meta' => array(),    // EXIF data
                );
                update_post_meta($attach_id, '_wp_attachment_metadata', $meta);
            }
    }


          $args = array(
        'post_type' => 'exhibitions',
        'p' => 12926,
        'order' => 'DESC',
        /*'date_query'     => array(
            'after' => array(
                'year'  => 2016,
                'month' => 2,
                'day'   => 28,
            ),
            'before' => array(
                'year'  => 2016,
                'month' => 6,
                'day'   => 30,
            ),
        ),*/
        'numberposts' => 1
    );
    $myposts = get_posts($args);
    foreach ($myposts as $mypost){

        $attachment_id = get_post_thumbnail_id( $mypost->ID );
        echo '<br>Attach ID: ' . $attachment_id . ' ';
        $unfiltered = false;
        $image_data = wp_get_attachment_metadata( $attachment_id, $unfiltered );
        print_r($image_data);
        replace_uploaded_image_frontend($image_data, $attachment_id);

    }

Điều này tất nhiên đã gặp lỗi nhiều lần, tôi tưởng tượng do một số hình ảnh bị hỏng. Vì vậy, sau khi cố gắng vượt qua tất cả chúng cùng một lúc và gặp lỗi, tôi đã phải dành một chút thời gian để trải qua các phạm vi ngày để chắc chắn rằng tôi đã cập nhật tất cả chúng.

MÃ SỐ HÌNH ẢNH MỚI, Trong hàm.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'];
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  //Instead I want to take the large file and make a copy and overwrite it over the original file.
    $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";
    }

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

  return $image_data;
}
add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
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.