แทนที่รูปภาพที่อัพโหลดดั้งเดิมโดยอัตโนมัติด้วยขนาดภาพใหญ่


13

เนื่องจากผู้ใช้ของเราอัปโหลดภาพขนาด 6MB เพื่อใช้บนเว็บไซต์เป็นประจำ (และไม่คุ้นเคยกับวิธีการปรับขนาดก่อน) WordPress จะจัดเก็บต้นฉบับรวมถึงปรับขนาดเป็นขนาดต่างๆ

ฉันต้องการฟังก์ชั่นหรือปลั๊กอินที่นำภาพที่อัปโหลดไปปรับขนาดให้เป็นสิ่งที่จัดการได้มากขึ้นแล้วแทนที่เดิม

ฉันเห็นบางฟังก์ชั่นที่ลบต้นฉบับ แต่ไม่ได้แทนที่มันหมายความว่ามันเป็นไปไม่ได้ที่จะสร้างภาพขนาดย่อในภายหลัง ฉันต้องการสิ่งนี้เพื่อแทนที่เพื่อให้ผู้ใช้สามารถอัปโหลดภาพขนาดใหญ่และจะถูกย่อขนาดลงและจัดเก็บโดยอัตโนมัติสำหรับการปรับขนาดในอนาคตหากจำเป็น

คำตอบ:


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

ฉันเพิ่งลองใหม่อีกครั้ง แต่ก่อนอื่นฉันเพิ่มขนาดใหม่ (เรียกว่า 'fullsize') ซึ่งมีขนาด 2048x1536 (ใหญ่เป็นสองเท่าตามที่ฉันต้องการ) และตอนนี้มันทำงานได้ดีภาพต้นฉบับจะถูกบันทึกเป็นสองเท่า ใหญ่เท่าที่ฉันต้องการพวกเขา (ซึ่งฉันต้องการเก็บไว้สำหรับอนาคต) แทนหลายครั้ง ขอบคุณ!
ฌอน

สิ่งที่ดีดีใจที่ได้ผลสำหรับคุณ!
พอลฟิลลิปส์

รหัสนี้ลบทุกอย่างออกจากไฟล์ functions.php ของฉัน ฉันตรวจสอบในตัวแก้ไข WP และใน FTP และไฟล์ว่างเปล่า มีการคืนค่าไฟล์จากการสำรองข้อมูล :(
jlg

1
@Ciprian คุณต้องตั้งค่าสคริปต์เพื่อวนซ้ำทั้งหมด ฉันแน่ใจว่ามีวิธี WordPress ในการรับข้อมูลสิ่งที่แนบมาทั้งหมด แต่ $ wpdb-> get_col ('เลือก id จาก wp_posts WHERE post_type = "ไฟล์แนบ" ORDER BY id'); จะทำงานเพื่อรับรายการรหัสโพสต์สำหรับรูปภาพ อาจเพิ่ม: AND post_mime_type = "image / jpeg" ด้วยเพื่อ จำกัด เพียงแค่ jpegs ตำแหน่งที่แท้จริงของแต่ละภาพนั้นจัดขึ้นใน 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 เวอร์ชั่นใหม่กว่านี้ไม่มีการให้คีย์ 'path' สำหรับขนาดไฟล์อีกต่อไป ดังนั้นเพื่อให้มันทำงานกับการอัปโหลดโพสต์ที่เก่ากว่าเราควรได้รับ Subir ปัจจุบันจากภาพต้นฉบับและใช้สิ่งนี้เพื่อสร้างเส้นทางที่ตั้งสำหรับภาพขนาดใหญ่

ดังนั้นแทนที่บรรทัดนี้:

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

โดย 2 บรรทัดเหล่านี้:

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

ฉันโพสต์โค้ดแบบเต็มและคำอธิบายเพิ่มเติมที่นี่: ลบภาพต้นฉบับ - เก็บภาพขนาดย่อไว้หรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.