2026年6月28日
2026年6月28日
WordPressで画像がアップロードできないエラーを解決する方法
はじめに
「申し訳ありませんが、このファイルはセキュリティ上の理由でアップロードが許可されていません」「HTTPエラー」などのメッセージが出てファイルをアップロードできない場合、ディレクトリのパーミッション・PHPの設定・GDライブラリの問題がほとんどです。
症状・原因
- メディアライブラリに画像をドラッグしてもエラーになる
- 「HTTPエラー」とだけ表示されてアップロードが失敗する
- 特定のファイル形式(WebP・SVGなど)だけ拒否される
- ファイルサイズが大きい画像だけアップロードできない
- サーバー移転後からアップロードが動かなくなった
解決手順
ステップ1:エラーの原因を特定する
# PHP エラーログを確認
tail -50 /var/log/php_errors.log
# WordPress デバッグログを確認
tail -50 /var/www/html/wp-content/debug.log
# アップロードディレクトリのパーミッションを確認
ls -la /var/www/html/wp-content/uploads/
# PHP の upload 設定を確認
php -r "echo ini_get('upload_max_filesize'), PHP_EOL;
echo ini_get('post_max_size'), PHP_EOL;
echo ini_get('max_execution_time'), PHP_EOL;"
# GD ライブラリが使えるか確認
php -r "var_dump(function_exists('imagecreate'));"
wp eval "var_dump(wp_image_editor_supports());"
ステップ2:パーミッションを修正する
# uploads ディレクトリの所有者を Web サーバーに変更
chown -R www-data:www-data /var/www/html/wp-content/uploads
# ディレクトリは 755、ファイルは 644 に設定
find /var/www/html/wp-content/uploads -type d -exec chmod 755 {} \;
find /var/www/html/wp-content/uploads -type f -exec chmod 644 {} \;
# wp-content 全体のパーミッションも確認
ls -la /var/www/html/wp-content/
# uploads ディレクトリが存在しない場合は作成
mkdir -p /var/www/html/wp-content/uploads
chown www-data:www-data /var/www/html/wp-content/uploads
chmod 755 /var/www/html/wp-content/uploads
ステップ3:PHP のアップロード上限を引き上げる
# php.ini または .user.ini(共有ホスティングの場合)
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
# .htaccess で PHP 設定を変更(Apache + mod_php の場合)
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 300
php_value memory_limit 256M
// wp-config.php でメモリ制限を増やす
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');
# 設定変更後に PHP-FPM を再起動(必要な場合)
systemctl reload php8.2-fpm
ステップ4:ファイル形式の制限を解除する
// functions.php: WebP・SVG など追加ファイル形式を許可
add_filter('upload_mimes', function(array $mimes): array {
$mimes['webp'] = 'image/webp';
$mimes['svg'] = 'image/svg+xml';
$mimes['svgz'] = 'image/svg+xml';
return $mimes;
});
// SVG のサニタイズ(セキュリティ対策)
add_filter('wp_handle_upload_prefilter', function(array $file): array {
if ($file['type'] === 'image/svg+xml') {
// SVG 内の script タグを除去
$svg = file_get_contents($file['tmp_name']);
$svg = preg_replace('/<script[\s\S]*?<\/script>/i', '', $svg);
file_put_contents($file['tmp_name'], $svg);
}
return $file;
});
// WordPress 5.8+ の MIME タイプチェック緩和
add_filter('wp_check_filetype_and_ext', function(array $data, string $file, string $filename): array {
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if ($ext === 'webp') {
$data['ext'] = 'webp';
$data['type'] = 'image/webp';
}
return $data;
}, 10, 3);
ステップ5:GD・Imagick の問題を解決する
# GD ライブラリをインストール(Ubuntu)
apt-get install php8.2-gd
# Imagick をインストール
apt-get install php8.2-imagick
# インストール後に PHP-FPM を再起動
systemctl restart php8.2-fpm
# WP-CLI で画像ライブラリを確認
wp eval "var_dump(wp_image_editor_supports(['mime_type' => 'image/webp']));"
// functions.php: Imagick よりも GD を優先する
add_filter('wp_image_editors', function(array $editors): array {
// GD を先頭に移動
$gd_index = array_search('WP_Image_Editor_GD', $editors);
if ($gd_index !== false) {
unset($editors[$gd_index]);
array_unshift($editors, 'WP_Image_Editor_GD');
}
return $editors;
});
注意事項
- SVGファイルのアップロードを許可する場合は、必ずXSSサニタイズ処理を追加してください。SVG内に
タグを埋め込むことができるため、無制限に許可するとセキュリティリスクになります upload_max_filesizeはpost_max_size以下に設定してください。post_max_sizeが小さいとファイルサイズを増やしても効果がありません(post_max_size >= upload_max_filesize)- 共有ホスティングでは
.user.iniまたは.htaccessでPHP設定を変更してください。サーバーによっては変更できない項目もあるため、その場合はホスティング会社のサポートに問い合わせてください
まとめ
画像アップロードエラーの解決は①PHPエラーログとls -la wp-content/uploadsでパーミッションとエラー原因を確認、②chown -R www-dataとchmod 755/644でuploadsディレクトリの権限を修正、③php.iniまたは.htaccessでupload_max_filesize=64M・post_max_size=64M・memory_limit=256Mを引き上げ、④upload_mimesフィルターでWebP・SVGなど必要なMIMEタイプを追加、⑤apt-get install php-gd php-imagickでGD/Imagickライブラリをインストールします。