ข้ามไปยังเนื้อหา
รูปและสื่อ

ทำไมโฟลเดอร์ uploads ของ WordPress ถึงมีขนาดใหญ่มาก

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

เผยแพร่แล้ว

โฟลเดอร์ uploads ของ WordPress มีขนาดใหญ่เพราะ WordPress ไม่เคยเก็บไฟล์เพียงไฟล์เดียวต่อรูปหนึ่งภาพ ทุกครั้งที่อัพโหลดจะไปกระตุ้นให้มีการสร้างสำเนาที่ถูกย่อขนาดชุดหนึ่งขึ้นมาควบคู่กับไฟล์ต้นฉบับ โดยจะมีถึงเจ็ดไฟล์สำหรับรูปถ่ายขนาดเท่ากล้องทั่วไป และนั่นยังไม่รวมที่ธีมหรือปลั๊กอิน wordpress จะเพิ่มเข้ามาอีก ไม่มีอะไรเสียหาย คุณแค่กำลังเห็นการทวีคูณที่เกิดขึ้นในทุก ๆ การอัพโหลด วิธีแก้คือหยุดสร้างขนาดที่คุณไม่เคยเรียกใช้ แล้วสั่ง regenerate เพื่อให้สำเนาเก่าถูกลบออกจากดิสก์

ลองคำนวณดู

ลองอัพโหลด JPEG ขนาด 4000×3000 หนึ่งไฟล์ แล้วเปิดดูข้างใน /wp-content/uploads/2026/07/ คุณจะไม่เจอไฟล์เดียว แต่จะเจอทั้งหมดนี้:

  • photo.jpg — ไฟล์ต้นฉบับ ไม่ถูกแตะต้อง
  • photo-scaled.jpg — สำเนาขนาด 2560px ที่ WordPress เสิร์ฟ แทนที่ ไฟล์ต้นฉบับ
  • photo-150x150.jpgthumbnail
  • photo-300x225.jpgmedium
  • photo-768x576.jpgmedium_large
  • photo-1024x768.jpglarge
  • photo-1536x1152.jpg — ขนาด 2× ของ medium_large
  • photo-2048x1536.jpg — ขนาด 2× ของ large

นั่นคือไฟล์ต้นฉบับบวกกับไฟล์ที่แตกออกมาอีกเจ็ดไฟล์ จากตัว core เพียงอย่างเดียว การอัพโหลดขนาด 3 MB อาจกลายเป็น 5–6 MB บนดิสก์ก่อนที่ปลั๊กอินสักตัวจะทำงานด้วยซ้ำ ทีนี้ลองเพิ่มธีมที่ลงทะเบียนขนาดของตัวเองอีกสี่ขนาด และ WooCommerce (อีกสามขนาด) การอัพโหลดหนึ่งครั้งก็กลายเป็นสิบสี่หรือสิบห้าไฟล์ คูณด้วยคลังรูปสักสองสามพันภาพ ขนาดของโฟลเดอร์ก็เลิกเป็นเรื่องน่าฉงนอีกต่อไป

ถ้าคุณอยากได้ตัวเลขที่แน่นอนสำหรับขนาดรูปและขนาดที่ลงทะเบียนไว้ของคุณเอง เครื่องมือคำนวณพื้นที่จัดเก็บรูปภาพ จะคำนวณให้คุณ

ทำไมถึงเกิดขึ้น

เมื่อคุณอัพโหลด wp_generate_attachment_metadata() จะเรียก wp_create_image_subsizes() ซึ่งจะวนลูปผ่านทุกขนาดที่ get_intermediate_image_sizes() ส่งกลับมา แล้วเขียนไฟล์ขึ้นมาหนึ่งไฟล์สำหรับทุกขนาดที่ไฟล์ต้นฉบับใหญ่พอจะสร้างได้ ตัว core ลงทะเบียน thumbnail, medium, medium_large, large รวมถึงขนาด retina 1536x1536 และ 2048x2048 ที่เพิ่มเข้ามาใน WP 5.3 ธีมหรือปลั๊กอิน wordpress ตัวใดที่เรียก add_image_size() ก็จะเพิ่มเข้าไปในลูปเดียวกันนั้น อย่างถาวร สำหรับทุกการอัพโหลดในอนาคต

ส่วนไฟล์ -scaled มาจากกลไกอีกตัวหนึ่ง นั่นคือ filter big_image_size_threshold ซึ่งมีค่าเริ่มต้นที่ 2560px อะไรก็ตามที่กว้างเกินกว่านั้นจะได้สำเนาที่ถูกย่อขนาดซึ่งกลายเป็นภาพ “full” ที่ถูกเสิร์ฟออกไป ในขณะที่ไฟล์ต้นฉบับยังคงอยู่บนดิสก์ ดังนั้นการอัพโหลดไฟล์ใหญ่จึงเก็บ ทั้ง ไฟล์ต้นฉบับขนาดมหึมาและเวอร์ชัน 2560px

คุณสามารถดูได้ว่าการตั้งค่าของคุณสร้างอะไรออกมาบ้างสำหรับรูปหนึ่งภาพ ด้วย เครื่องมือตรวจสอบขนาดรูปภาพ

วิธีแก้ ทำตามลำดับ

1. วัดผลก่อนจะไปแตะต้องอะไร การเดาเป็นการเสียเวลา จากตำแหน่ง root ของเว็บไซต์:

du -sh wp-content/uploads
find wp-content/uploads -type f \( -name '*.jpg' -o -name '*.webp' -o -name '*.png' \) | wc -l
du -ah wp-content/uploads | sort -rh | head -20

2. ยกเลิกการลงทะเบียนขนาดที่คุณไม่ได้เสิร์ฟ ธีมส่วนใหญ่ไม่เคยแสดงผลขนาด 1536 และ 2048 และหลายตัวก็ไม่เคยใช้ medium_large ตัดมันทิ้งไปเลย:

// functions.php — stop generating sizes this site never outputs
add_action( 'init', function () {
    remove_image_size( '1536x1536' );
    remove_image_size( '2048x2048' );
} );

// Drop medium_large too, if your theme doesn't use the 768px size
add_filter( 'intermediate_image_sizes_advanced', function ( $sizes ) {
    unset( $sizes['medium_large'] );
    return $sizes;
} );

3. สั่ง regenerate เพื่อลบสำเนาเก่าออก การยกเลิกการลงทะเบียนแค่หยุดการสร้าง ในอนาคต เท่านั้น ไฟล์ที่อยู่บนดิสก์อยู่แล้วจะยังคงอยู่จนกว่าคุณจะสั่ง regenerate:

wp media regenerate --yes

WP-CLI เวอร์ชันล่าสุดจะลบไฟล์ของขนาดที่ไม่ได้ลงทะเบียนไว้แล้วไปพร้อม ๆ กันในระหว่างทำงาน ถ้าคุณใช้ปลั๊กอิน wordpress Regenerate Thumbnails แทน ให้ติ๊กตัวเลือก “delete unregistered sizes” ของมันด้วย ถ้าไม่ติ๊กช่องนั้น ไฟล์เก่าจะยังคงอยู่

4. ตามล่าไฟล์ที่กำพร้า การเปลี่ยนธีมไม่เคยเก็บกวาดขนาดต่าง ๆ ที่ธีมเก่าลงทะเบียนไว้ การลบโพสต์ก็ไม่ได้ลบไฟล์ที่แตกออกมาเสมอไปเช่นกัน หลังจากขั้นตอนที่ 3 ถ้า du -sh ยังสูงกว่าที่เครื่องมือคำนวณคาดการณ์ไว้มาก แสดงว่าคุณมีไฟล์กำพร้า นั่นคือไฟล์บนดิสก์ที่ไม่มี attachment ตัวไหนอ้างอิงถึง

สิ่งที่ไม่ควรทำ

อย่าปิดใช้งาน scaled images เพื่อ “ประหยัดพื้นที่” ไฟล์ -scaled มีขนาด เล็กกว่า ไฟล์ต้นฉบับของคุณ การปิด big_image_size_threshold ไม่ได้ลบอะไรออกเลย มันแค่ทำให้ WordPress เสิร์ฟไฟล์ต้นฉบับขนาดหลายเมกะไบต์ให้ผู้เข้าชมทุกคน นั่นเป็นการตัดสินใจเรื่องแบนด์วิดท์และคุณภาพ ไม่ใช่การเก็บกวาดพื้นที่จัดเก็บ และมันมักจะทำให้น้ำหนักของหน้าเว็บแย่ลงไปอีก เครื่องมือ disable-scaled-images อธิบายว่าเมื่อไหร่ที่มันเป็นทางเลือกที่ถูกต้องจริง ๆ และการลดขนาดโฟลเดอร์ uploads ไม่ใช่หนึ่งในนั้น

อย่าลบไฟล์ตรงจาก uploads ผ่าน SFTP รายการขนาดย่อยของแต่ละ attachment อยู่ใน _wp_attachment_metadata ของมัน การลบไฟล์ด้วยมือจะทิ้งการอ้างอิงที่เสียหายไว้ และการ regenerate ไม่สามารถสร้างขนาดใด ๆ ขึ้นมาใหม่ได้ถ้าคุณลบไฟล์ต้นฉบับที่มันแตกออกมาไปแล้ว ลบต้นฉบับเมื่อไหร่ รูปนั้นก็หายไปตลอดกาล

อย่าตั้งค่า thumbnail/medium/large เป็น 0 ใน Settings → Media โดยหวังว่าโฟลเดอร์จะเล็กลง การตั้งขนาดเป็นศูนย์จะหยุดการสร้างในอนาคต แต่ไม่แตะต้องอะไรที่อยู่บนดิสก์อยู่แล้ว และหน้า UI ก็เข้าไม่ถึง medium_large, 1536, 2048 หรือขนาดของธีม/ปลั๊กอินตัวใด ๆ เพราะมันไม่มีตรงนั้น

อย่าไปโทษฐานข้อมูล โฟลเดอร์ uploads ที่หนักคือไฟล์รูปภาพ แทบไม่เคยเป็น DB เลย การ optimize ตารางจะไม่ทำให้ตัวเลขนั้นขยับ

ยังติดอยู่ใช่ไหม

ถ้าโฟลเดอร์ยังใหญ่กว่าที่คาดหลังจาก regenerate แล้ว ลองนำขนาดรูปจริงและขนาดที่ลงทะเบียนไว้ของคุณไปใส่ใน เครื่องมือคำนวณพื้นที่จัดเก็บ แล้วเทียบตัวเลขที่ได้กับ du -sh wp-content/uploads ถ้าช่องว่างห่างกันมาก แสดงว่ามีไฟล์กำพร้าจากธีมเก่าหรือจากโพสต์ที่ถูกลบ ไม่ใช่จาก core และไม่ใช่สิ่งที่การ regenerate เพิ่มเติมจะแก้ได้ ถ้าช่องว่างเล็กน้อย แสดงว่าการคำนวณมันเป็นแบบนั้นเอง คือไฟล์เจ็ดไฟล์ขึ้นไปต่อการอัพโหลดหนึ่งครั้ง ทำงานตรงตามที่ถูกออกแบบมาเป๊ะ ๆ