TL;DR
WordPressが Missing a temporary folder. エラーをスローするのは、PHPの一時アップロードディレクトリが存在しないか、未設定か、書き込み不可の場合です。最も手早い修正方法は、wp-config.php に1行追加することです:
define('WP_TEMP_DIR', ABSPATH . 'wp-content/temp/');
次に、ディレクトリを作成して適切なパーミッションを設定します:
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
それでも解決しない場合は、php.ini に本当の原因があるかもしれません。続きをお読みください。
このエラーの原因
画像をアップロードしたりプラグインをインストールするたびに、PHPはまず一時ディレクトリにファイルを書き込みます。その後、WordPressがファイルを最終的な保存先に移動します。このエラーは、PHPがその一時ファイルを置く有効な場所を見つけられない場合に発生します。
ほぼ必ず、次の3つのうちのいずれかが原因です:
php.iniのupload_tmp_dirディレクティブが存在しないパスを指している。 デフォルト設定をカスタマイズしたが、ディレクトリが作成されなかったVPSセットアップで非常によく見られます。- 一時ディレクトリは存在するが、Webサーバーのユーザーが書き込めない。 この場合、PHPはサイレントに失敗します。有用なエラーは表示されず、この不可解なメッセージだけが表示されます。
upload_tmp_dirが空または未定義のため、PHPが/tmpにフォールバックしますが、/tmpがopen_basedirでブロックされているか、noexecでマウントされています。
ステップ1 — PHPが実際に使用している場所を確認する
設定を変更する前に、PHPが一時ディレクトリとして認識している場所を確認しましょう。FTPまたはSSHでWordPressのルートディレクトリに次のファイルをアップロードしてください:
<?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";
?>
https://yoursite.com/check-tmp.php にアクセスして出力を確認してください。確認後は必ずこのファイルを削除してください。デバッグスクリプトを本番サーバーに残してはいけません。
upload_tmp_dir が実際には存在しない /var/php_tmp のようなパスを示している場合、問題が見つかったことになります。
ステップ2 — wp-config.php で修正する(どの環境でも使える方法)
これが推奨される出発点です。PHPに設定されている内容を上書きするため、php.ini を変更できない共有ホスティングでも機能します。
wp-config.php を開き、/* That's all, stop editing! */ の前に次の行を追加します:
define('WP_TEMP_DIR', ABSPATH . 'wp-content/temp/');
次に、ディレクトリを作成します。パスは実際のWordPressルートに合わせて調整してください:
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(ユーザーはセットアップによって異なります):
# chown nginx:nginx /var/www/html/wp-content/temp
# chown php-fpm-user:php-fpm-user /var/www/html/wp-content/temp
PHPがどのユーザーで動作しているか不明な場合は、次のコマンドで確認できます:
ps aux | grep -E '(apache|nginx|php-fpm|httpd)' | grep -v root | head -1
ステップ3 — php.ini で修正する(VPS・専用サーバー)
SSHアクセスがある場合、php.ini を直接編集する方が wp-config.php での回避策よりもスマートです。PHP レベルで問題を修正できるため、その場しのぎにはなりません。
アクティブな設定ファイルを見つけます:
php --ini | grep 'Loaded Configuration'
そのファイルを開き、upload_tmp_dir を実際に書き込み可能なパスに設定します:
upload_tmp_dir = /tmp
/tmp が正常かどうか確認します:
ls -la /tmp
# 正常な出力: drwxrwxrwt — スティッキービット(t)はここでは正常です
カスタムパスを使用する場合は、先にディレクトリを作成してください:
mkdir -p /var/php_tmp
chmod 1777 /var/php_tmp
変更を保存した後、Webサーバーを再起動します:
# PHP-FPM(バージョン番号を適宜変更してください):
sudo systemctl restart php8.2-fpm
# mod_phpを使用したApache:
sudo systemctl restart apache2
ステップ4 — .htaccess で修正する(共有ホスティング・Apache)
php.ini にアクセスできない共有ホスティングでは、Apacheの .htaccess を通じて一部のPHP設定を上書きできます。WordPressルートの .htaccess に以下を追加してください:
php_value upload_tmp_dir /tmp
注意点として、この方法でオーバーライドできるPHPの値を制限しているホストもあります。その行を追加しても変化がない場合は、ステップ2の wp-config.php の方法に切り替えてください。こちらの方がより確実です。
ステップ5 — open_basedir の制限を確認する
セキュリティが強化されたサーバーや多くの共有ホストでは、open_basedir を使用してPHPがアクセスできるディレクトリを制限しています。一時ディレクトリが許可リストに含まれていない場合、パーミッションが完璧でもPHPはそこに書き込めません。
現在の制限を確認します:
php -r "echo ini_get('open_basedir');"
/tmp や指定した一時ディレクトリが除外されているパスリストが表示された場合、2つの対処方法があります:
php.iniまたはサーバー設定のopen_basedirに一時ディレクトリを追加するWP_TEMP_DIRを許可リスト内のパス(WordPressルート配下など)に向ける
# 例: サイトルートと /tmp の両方を許可する
open_basedir = /var/www/html:/tmp
確認 — 修正が成功したかチェックする
推測で判断せず、実際にアップロードしてテストしてください:
- WordPress管理画面 → メディア → 新規追加 に移動する
- 任意の画像をアップロードする(小さなJPEGやPNGで構いません)
- エラーが表示されなければ修正成功です
- プラグインのインストールもテストしてください:プラグイン → 新規追加 で「Hello Dolly」などの軽量なものを検索してインストールする
確実に確認するには、SSHでWebサーバーユーザーとして書き込みテストを直接実行します:
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 と表示されれば完了です。Not writable の場合は、所有権またはパーミッションがまだ正しくないことを意味します。chown のステップを再確認してください。
クイックチェックリスト
- 一時ディレクトリのパスがディスク上に存在する
- Webサーバーのユーザー(www-data、nginxなど)がディレクトリを所有している
- パーミッションが最低でも
755に設定されている - パスが
open_basedirでブロックされていない php.iniを変更した後にPHPまたはApacheを再起動した- デバッグファイル(
check-tmp.php)をサーバーから削除した

