Cách sửa lỗi 'Installation failed: Destination folder already exists' trong WordPress

intermediate📝 WordPress2026-04-24| WordPress 5.5+, Máy chủ Linux/Unix (Ubuntu, CentOS, Debian), Nginx/Apache

Error Message

Installation failed: Destination folder already exists
#wordpress#plugin#theme#sftp#wp-cli

Tại sao bản cập nhật WordPress của bạn bị dừng lại

Hôm nay tôi đã gặp phải một trở ngại phổ biến nhưng khá khó chịu khi cập nhật theme tùy chỉnh cho khách hàng. Tôi đã tải lên tệp .zip mới và mong đợi một thông báo thành công nhanh chóng, nhưng WordPress đã chặn đứng tôi bằng thông báo này:

Installation failed: Destination folder already exists

Lỗi này thường là dấu hiệu của một bản cập nhật thất bại hoặc quá trình tải lên thủ công gặp sự cố. Nếu một plugin lớn như WooCommerce hoặc Elementor bị hết thời gian chờ (timeout)—thường là do chạm giới hạn max_execution_time mặc định 30 giây của PHP—nó sẽ để lại một thư mục được giải nén dở dang. WordPress nhìn thấy thư mục đó, e ngại việc ghi đè dữ liệu và đơn giản là dừng lại.

Xác định thư mục "ma"

Khi điều này xảy ra, WordPress đang ở chế độ bảo vệ. Nó thấy một thư mục có cùng tên với tệp bạn vừa tải lên và từ chối can thiệp vào đó. Bước đầu tiên của tôi là kiểm tra thư mục wp-content/plugins/. Mặc dù plugin không hoạt động trong bảng điều khiển, nhưng thư mục đó vẫn tồn tại trên ổ đĩa. Thư mục "ma" đó chính là nguyên nhân.

Giải pháp 1: Dọn dẹp thủ công qua SFTP (Cách chắc chắn nhất)

Xóa thủ công là phương pháp ưa thích của tôi vì nó mang tính "phẫu thuật" chính xác. Nếu bạn có quyền truy cập SFTP qua FileZilla hoặc WinSCP, hãy làm theo các bước sau để dọn đường:

  • Kết nối với máy chủ của bạn và đi đến /public_html/wp-content/plugins/ (hoặc /themes/).
  • Tìm thư mục được đặt tên theo plugin bạn đang cố gắng cài đặt.
  • Mẹo nhỏ: Hãy tải một bản sao lưu nhanh thư mục đó về máy tính trước khi xóa.
  • Xóa thư mục khỏi máy chủ.

Bạn sử dụng dòng lệnh? Cách này còn nhanh hơn nữa. Chỉ cần cẩn thận với lệnh rm:

# Di chuyển đến thư mục plugins
cd /var/www/html/wp-content/plugins/

# Xác nhận tên thư mục
ls -d */

# Xóa sạch thư mục gây lỗi (thay 'plugin-slug' bằng tên thư mục thực tế)
rm -rf plugin-slug/

Sau khi đã dọn dẹp xong, hãy quay lại bảng điều khiển và thử tải lên lại. Nó sẽ hoạt động hoàn hảo.

Giải pháp 2: Bắt buộc cài đặt bằng WP-CLI

Nếu bạn thích sử dụng terminal, WP-CLI là "cứu cánh". Bạn có thể bỏ qua hoàn toàn việc xóa thủ công bằng cách sử dụng cờ --force. Lệnh này yêu cầu WordPress bỏ qua các tệp hiện có và ghi đè chúng bằng nội dung trong tệp ZIP của bạn.

# Cho một plugin
wp plugin install /path/to/plugin.zip --force

# Cho một theme
wp theme install /path/to/theme.zip --force

Đây là con đường hiệu quả nhất cho các nhà phát triển quản lý nhiều môi trường khác nhau.

Giải pháp 3: Sử dụng tính năng "Thay thế hiện tại" trong Bảng điều khiển

Kể từ phiên bản 5.5, WordPress đã tích hợp một "van an toàn". Thông thường, nếu bạn tải lên một tệp ZIP đã tồn tại, một màn hình sẽ xuất hiện hỏi bạn có muốn "Thay thế bản hiện tại bằng bản tải lên" hay không. Nó thậm chí còn hiển thị số phiên bản để bạn so sánh.

Tuy nhiên, tính năng này phụ thuộc vào việc có tệp style.css hoặc phần đầu (header) plugin hợp lệ. Nếu lần cài đặt trước đó thất bại giữa chừng khi đang giải nén, các siêu dữ liệu (metadata) này có thể bị thiếu. Nếu bạn không thấy nút "Thay thế", bạn phải sử dụng phương pháp SFTP trong Giải pháp 1.

Xử lý phân quyền (Lỗi 403)

Đôi khi bạn cố gắng xóa thư mục nhưng lại gặp lỗi "Permission Denied". Điều này xảy ra khi người dùng máy chủ web (như www-data hoặc nginx) sở hữu các tệp đó, nhưng người dùng SFTP của bạn thì không. Bạn có thể khắc phục bằng cách thiết lập lại quyền sở hữu:

# Đặt lại quyền sở hữu cho người dùng web
sudo chown -R www-data:www-data /var/www/html/wp-content/plugins/plugin-name

# Hoặc đặt phân quyền thành 755
sudo chmod -R 755 /var/www/html/wp-content/plugins/plugin-name

Kiểm tra lại kết quả

Sau khi quá trình cài đặt hoàn tất, hãy xác minh lại công việc của bạn. Kiểm tra trang Plugins để đảm bảo số phiên bản chính xác và kích hoạt nó. Tôi cũng khuyên bạn nên kiểm tra giao diện trang web (front-end) ngay lập tức. Việc xem nhanh hệ thống tệp qua lệnh ls -l có thể xác nhận thư mục mới có dấu thời gian hiện tại, chứng minh việc ghi đè đã thành công.

Phòng ngừa: Đừng để bị kẹt lại lần nữa

Hãy giữ cho môi trường của bạn luôn sạch sẽ. Hầu hết những sự cố này là do máy chủ bị hết thời gian chờ trong quá trình cập nhật tự động. Nếu bạn thường xuyên gặp lỗi này, hãy cân nhắc tăng memory_limit lên 256M và max_execution_time lên 300 trong tệp php.ini của bạn. Sử dụng WP-CLI cho các bản cập nhật lớn cũng là một cách tuyệt vời để tránh việc mất kết nối dựa trên trình duyệt.

Related Error Notes