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
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
Câu trả lời:
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;
}
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.
Tôi chỉ tạo một plugin vì tôi có cùng một vấn đề. Bạn có thể tải nó từ đây
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');