Bỏ qua tới nội dung
Ảnh & media

Vì sao thư mục uploads của WordPress lại lớn đến vậy

Thư mục uploads của WordPress lớn vì WordPress không bao giờ chỉ lưu một file cho mỗi ảnh. Mỗi lần up ảnh lên đều tạo ra một bộ ảnh con cố định bên cạnh

Đã đăng

Thư mục uploads của WordPress lớn vì WordPress không bao giờ chỉ lưu một file cho mỗi ảnh. Mỗi lần up ảnh lên đều kích hoạt việc tạo ra một bộ bản sao đã resize cố định bên cạnh bản gốc — bảy bản cho một tấm ảnh cỡ máy ảnh thông thường, trước khi bất kỳ theme hay plugin nào tạo thêm. Không có gì bị hỏng cả; bạn chỉ đang thấy sự nhân bản xảy ra mỗi lần up ảnh. Cách khắc phục là ngừng tạo những kích thước bạn không bao giờ dùng, rồi regenerate để các bản cũ bị xóa khỏi ổ đĩa.

Làm phép tính

Up một file JPEG 4000×3000 lên rồi nhìn vào bên trong /wp-content/uploads/2026/07/. Bạn sẽ không thấy chỉ một file. Bạn sẽ thấy những file này:

  • photo.jpg — bản gốc, nguyên vẹn
  • photo-scaled.jpg — bản 2560px mà WordPress phục vụ thay cho bản gốc
  • photo-150x150.jpgthumbnail
  • photo-300x225.jpgmedium
  • photo-768x576.jpgmedium_large
  • photo-1024x768.jpglarge
  • photo-1536x1152.jpg — bản 2× của medium_large
  • photo-2048x1536.jpg — bản 2× của large

Đó là bản gốc cộng với bảy ảnh con, chỉ tính riêng phần lõi (core). Một file up 3 MB có thể chiếm 5–6 MB trên ổ đĩa trước khi bất kỳ plugin nào chạy. Giờ thêm một theme đăng ký bốn kích thước của riêng nó và WooCommerce (thêm ba nữa), thế là một lần up ảnh biến thành mười bốn hay mười lăm file. Nhân với một thư viện vài nghìn ảnh và kích thước thư mục không còn là điều bí ẩn nữa.

Nếu bạn muốn con số chính xác cho kích thước ảnh và các size đã đăng ký của riêng mình, công cụ tính dung lượng lưu trữ ảnh sẽ làm phép nhân giúp bạn.

Vì sao chuyện này xảy ra

Khi bạn up ảnh, wp_generate_attachment_metadata() gọi wp_create_image_subsizes(), hàm này lặp qua mọi kích thước do get_intermediate_image_sizes() trả về và ghi ra một file cho mỗi kích thước mà bản gốc đủ lớn để tạo ra. Core đăng ký thumbnail, medium, medium_large, large, cộng thêm các size retina 1536x15362048x2048 được thêm vào từ WP 5.3. Bất kỳ theme hay plugin nào gọi add_image_size() đều thêm vào chính vòng lặp đó — vĩnh viễn, cho mọi lần up ảnh sau này.

File -scaled đến từ một cơ chế riêng: filter big_image_size_threshold, mặc định 2560px. Bất kỳ ảnh nào rộng hơn đều nhận được một bản scaled, và bản này trở thành ảnh “full” được phục vụ, trong khi bản gốc vẫn nằm trên ổ đĩa. Vậy nên một ảnh up lớn giữ cả hai: bản gốc khổng lồ và bản 2560px.

Bạn có thể xem chính xác thiết lập của mình tạo ra những gì cho một ảnh nhất định với công cụ kiểm tra kích thước ảnh.

Cách khắc phục, theo thứ tự

1. Đo đạc trước khi động vào bất cứ thứ gì. Đoán mò chỉ tốn thời gian. Từ thư mục gốc của site:

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. Hủy đăng ký các kích thước bạn không phục vụ. Hầu hết theme không bao giờ xuất ra size 15362048, và nhiều theme không bao giờ dùng medium_large. Bỏ chúng đi:

// 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 để xóa các bản cũ. Hủy đăng ký chỉ ngừng việc tạo trong tương lai — các file đã có trên ổ đĩa vẫn ở đó cho đến khi bạn regenerate:

wp media regenerate --yes

Các phiên bản WP-CLI gần đây sẽ xóa các file thuộc những size không còn được đăng ký ngay trong quá trình chạy. Nếu bạn dùng plugin Regenerate Thumbnails thay thế, hãy tích chọn tùy chọn “delete unregistered sizes” của nó — nếu không tích ô đó, các file cũ vẫn còn nguyên.

4. Truy tìm các file mồ côi. Đổi theme không bao giờ dọn dẹp các size mà theme cũ đã đăng ký. Xóa bài viết cũng không phải lúc nào cũng xóa các ảnh con của chúng. Sau bước 3, nếu du -sh vẫn cao hơn nhiều so với con số công cụ tính dự đoán, bạn có file mồ côi — những file trên ổ đĩa không được attachment nào tham chiếu tới.

Những điều không nên làm

Đừng tắt ảnh scaled để “tiết kiệm dung lượng”. File -scaled nhỏ hơn bản gốc của bạn. Tắt big_image_size_threshold không xóa gì cả — nó chỉ khiến WordPress phục vụ bản gốc nặng nhiều megabyte cho mọi khách truy cập. Đó là quyết định về băng thông và chất lượng, chứ không phải dọn dẹp lưu trữ, và thường làm page weight tệ hơn. Công cụ disable-scaled-images giải thích khi nào thực sự nên dùng nó; thu nhỏ thư mục uploads không phải một trong những trường hợp đó.

Đừng xóa file trực tiếp khỏi uploads qua SFTP. Danh sách ảnh con của mỗi attachment nằm trong _wp_attachment_metadata của nó. Xóa file bằng tay để lại các tham chiếu bị hỏng, và việc regenerate không thể dựng lại một size nếu bạn đã xóa bản gốc mà nó phái sinh ra. Xóa bản gốc là mất ảnh đó vĩnh viễn.

Đừng đặt thumbnail/medium/large về 0 trong Settings → Media với hy vọng thư mục sẽ nhỏ lại. Đặt một size về 0 chỉ ngừng việc tạo trong tương lai chứ không đụng gì tới những file đã có trên ổ đĩa, và giao diện UI không thể chạm tới medium_large, 1536, 2048, hay bất kỳ size nào của theme/plugin — những cái đó không có ở đây.

Đừng đổ lỗi cho database. Một thư mục uploads nặng là do file ảnh, gần như không bao giờ do DB. Tối ưu các bảng cũng không làm con số thay đổi.

Vẫn bị kẹt?

Nếu thư mục vẫn lớn hơn dự kiến sau khi regenerate, hãy đưa kích thước ảnh thật và các size đã đăng ký của bạn qua công cụ tính dung lượng lưu trữ rồi so con số của nó với du -sh wp-content/uploads. Chênh lệch lớn nghĩa là có file mồ côi từ theme cũ hoặc bài viết đã xóa — không phải do core, và không phải thứ mà regenerate thêm sẽ sửa được. Chênh lệch nhỏ nghĩa là phép toán đơn giản là vậy: bảy file trở lên cho mỗi lần up, hoạt động đúng như thiết kế.