TL;DR
WordPress báo lỗi Missing a temporary folder. khi thư mục tạm để upload của PHP bị thiếu, chưa được cấu hình, hoặc không có quyền ghi. Cách sửa nhanh nhất là thêm một dòng vào wp-config.php:
define('WP_TEMP_DIR', ABSPATH . 'wp-content/temp/');
Sau đó tạo thư mục và cấp quyền phù hợp:
mkdir -p /var/www/html/wp-content/temp
chmod 755 /var/www/html/wp-content/temp
chown www-data:www-data /var/www/html/wp-content/temp
Vẫn chưa hết lỗi? Thủ phạm thực sự có thể nằm trong php.ini — đọc tiếp để biết cách xử lý.
Nguyên Nhân Gây Ra Lỗi
Mỗi khi bạn upload ảnh hoặc cài plugin, PHP sẽ ghi file vào một thư mục tạm trước. WordPress sau đó mới chuyển file đến đích cuối cùng. Lỗi này xảy ra khi PHP không tìm được chỗ hợp lệ để lưu tạm file đó.
Hầu hết đều do một trong ba nguyên nhân sau:
- Directive
upload_tmp_dirtrongphp.initrỏ đến đường dẫn không tồn tại. Rất phổ biến trên các VPS đã tùy chỉnh giá trị mặc định nhưng chưa tạo thư mục tương ứng. - Thư mục tạm tồn tại, nhưng user của web server không có quyền ghi vào đó. PHP thất bại âm thầm trong trường hợp này — không có thông báo lỗi hữu ích, chỉ có đúng thông báo khó hiểu này.
upload_tmp_dirđể trống hoặc chưa được định nghĩa, khiến PHP dùng/tmplàm fallback — nhưng/tmpbị chặn bởiopen_basedirhoặc được mount với tùy chọnnoexec.
Bước 1 — Xác Định PHP Đang Dùng Thư Mục Nào
Trước khi chỉnh bất kỳ cấu hình nào, hãy xác nhận PHP đang nhận diện thư mục tạm là gì. Upload file sau vào thư mục gốc WordPress qua FTP hoặc SSH:
<?php
echo 'upload_tmp_dir: ' . ini_get('upload_tmp_dir') . "\n";
echo 'sys_get_temp_dir: ' . sys_get_temp_dir() . "\n";
echo 'WP_TEMP_DIR: ' . (defined('WP_TEMP_DIR') ? WP_TEMP_DIR : 'not defined') . "\n";
?>
Truy cập https://yoursite.com/check-tmp.php và ghi lại kết quả. Xóa file này ngay sau khi kiểm tra xong — đừng bao giờ để lại script debug trên server đang chạy.
Nếu upload_tmp_dir hiển thị đường dẫn như /var/php_tmp mà thực tế không tồn tại, bạn đã tìm ra vấn đề.
Bước 2 — Sửa Qua wp-config.php (Dùng Được Ở Mọi Nơi)
Đây là điểm khởi đầu được khuyến nghị. Cách này ghi đè cấu hình PHP hiện tại, nghĩa là nó hoạt động ngay cả trên shared hosting khi bạn không thể chỉnh php.ini.
Mở wp-config.php và thêm dòng này trước /* That's all, stop editing! */:
define('WP_TEMP_DIR', ABSPATH . 'wp-content/temp/');
Tiếp theo tạo thư mục. Điều chỉnh đường dẫn cho khớp với thư mục gốc WordPress thực tế của bạn:
mkdir -p /var/www/html/wp-content/temp
chmod 755 /var/www/html/wp-content/temp
# Apache:
chown www-data:www-data /var/www/html/wp-content/temp
# Nginx + PHP-FPM (user có thể khác tùy cấu hình):
# chown nginx:nginx /var/www/html/wp-content/temp
# chown php-fpm-user:php-fpm-user /var/www/html/wp-content/temp
Không chắc PHP đang chạy dưới user nào? Lệnh này sẽ cho bạn biết:
ps aux | grep -E '(apache|nginx|php-fpm|httpd)' | grep -v root | head -1
Bước 3 — Sửa Qua php.ini (VPS / Máy Chủ Riêng)
Có quyền SSH? Chỉnh trực tiếp php.ini là cách sạch hơn so với workaround qua wp-config.php — nó xử lý vấn đề tận gốc ở tầng PHP thay vì vá xung quanh nó.
Tìm file cấu hình đang được nạp:
php --ini | grep 'Loaded Configuration'
Mở file đó và đặt upload_tmp_dir trỏ đến một đường dẫn thực, có quyền ghi:
upload_tmp_dir = /tmp
Kiểm tra xem /tmp có ổn không:
ls -la /tmp
# Kết quả bình thường: drwxrwxrwt — sticky bit (t) là bình thường ở đây
Muốn dùng đường dẫn tùy chỉnh thay thế? Tạo thư mục trước:
mkdir -p /var/php_tmp
chmod 1777 /var/php_tmp
Khởi động lại web stack sau khi lưu thay đổi:
# PHP-FPM (điều chỉnh số phiên bản):
sudo systemctl restart php8.2-fpm
# Apache với mod_php:
sudo systemctl restart apache2
Bước 4 — Sửa Qua .htaccess (Shared Hosting / Apache)
Trên shared hosting không có quyền truy cập php.ini, Apache cho phép ghi đè một số cài đặt PHP thông qua .htaccess. Thêm dòng này vào file .htaccess ở thư mục gốc WordPress:
php_value upload_tmp_dir /tmp
Lưu ý: một số nhà cung cấp hosting hạn chế các giá trị PHP có thể ghi đè theo cách này. Nếu không có gì thay đổi sau khi thêm dòng đó, hãy quay lại dùng cách wp-config.php ở Bước 2 — cách đó đáng tin cậy hơn.
Bước 5 — Kiểm Tra Giới Hạn open_basedir
Các server được bảo mật chặt và nhiều shared hosting dùng open_basedir để giới hạn những thư mục PHP được phép truy cập. Nếu thư mục tạm của bạn không nằm trong danh sách được phép, PHP không thể ghi vào đó — dù phân quyền hoàn toàn đúng.
Kiểm tra những gì đang bị giới hạn:
php -r "echo ini_get('open_basedir');"
Thấy danh sách đường dẫn không bao gồm /tmp hoặc thư mục tạm bạn chọn? Có hai lựa chọn:
- Thêm thư mục tạm vào
open_basedirtrongphp.inihoặc cấu hình server - Trỏ
WP_TEMP_DIRđến một đường dẫn đã nằm trong danh sách được phép — một thư mục nào đó bên trong thư mục gốc WordPress là lựa chọn tốt
# Ví dụ: cho phép cả thư mục gốc site và /tmp
open_basedir = /var/www/html:/tmp
Kiểm Tra — Xác Nhận Đã Sửa Được Lỗi
Hãy kiểm tra bằng cách upload thực tế thay vì chỉ đoán:
- Vào WordPress Admin → Media → Thêm mới
- Upload bất kỳ ảnh nào — JPEG hoặc PNG nhỏ là được
- Không có lỗi? Nghĩa là đã sửa xong
- Cũng kiểm tra cài plugin: Plugins → Thêm mới, tìm thứ gì đó nhẹ như "Hello Dolly" và cài thử
Để kiểm tra dứt khoát, chạy lệnh test ghi trực tiếp với user của web server qua SSH:
sudo -u www-data touch /var/www/html/wp-content/temp/test.txt && echo "Writable" || echo "Not writable"
rm -f /var/www/html/wp-content/temp/test.txt
Writable nghĩa là bạn đã xong. Not writable nghĩa là ownership hoặc phân quyền vẫn chưa đúng — kiểm tra lại bước chown.
Danh Sách Kiểm Tra Nhanh
- Đường dẫn thư mục tạm tồn tại trên ổ đĩa
- User của web server (www-data, nginx, v.v.) sở hữu thư mục đó
- Phân quyền ít nhất là
755 - Đường dẫn không bị chặn bởi
open_basedir - PHP hoặc Apache đã được khởi động lại sau khi thay đổi
php.ini - File debug (
check-tmp.php) đã được xóa khỏi server

