2026年9月25日
2026年9月25日
WordPressで画像・ファイルのアップロードが失敗する場合の解決方法
はじめに
WordPressのメディアライブラリで画像をアップロードしようとすると「HTTPエラー」が表示されてアップロードできない・「アップロードしたファイルはphp.iniのupload_max_filesizeディレクティブを超えています」エラーが出る・PDFやSVGなど特定のファイル形式をアップロードしようとすると「ファイルタイプは許可されていません」と表示される・wp-content/uploadsディレクトリへの書き込み権限がないためアップロードが失敗するといった問題は、PHP設定・ファイルシステムのパーミッション・WordPressのファイルタイプ制限が原因です。
症状・原因
- 大きな画像(5MB以上)をアップロードすると「ファイルが大きすぎます」エラーになる
- アップロード後にメディアライブラリに画像が表示されない・「HTTPエラー」が出る
- SVGファイルをアップロードしようとすると「セキュリティ上の理由からこのファイルタイプは許可されていません」と表示される
wp-content/uploadsディレクトリのパーミッションが755になっていて書き込めない
解決手順
ステップ1:アップロード設定を診断する
# アップロード設定を確認
wp eval "
echo 'upload_max_filesize: ' . ini_get('upload_max_filesize') . PHP_EOL;
echo 'post_max_size: ' . ini_get('post_max_size') . PHP_EOL;
echo 'max_execution_time: ' . ini_get('max_execution_time') . PHP_EOL;
echo 'max_input_time: ' . ini_get('max_input_time') . PHP_EOL;
// アップロードディレクトリを確認
\$upload_dir = wp_upload_dir();
echo 'Upload basedir: ' . \$upload_dir['basedir'] . PHP_EOL;
echo 'Upload writable: ' . (wp_is_writable(\$upload_dir['basedir']) ? 'yes' : 'no') . PHP_EOL;
echo 'Upload url: ' . \$upload_dir['baseurl'] . PHP_EOL;
echo 'Upload error: ' . (\$upload_dir['error'] ? \$upload_dir['error'] : 'none') . PHP_EOL;
"
# uploads ディレクトリのパーミッションを確認
ls -la /var/www/html/wp-content/uploads/
ステップ2:ファイルサイズ制限を引き上げる
; php.ini: アップロードサイズ制限を変更
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
# .htaccess: PHP設定をApache経由で変更
<IfModule mod_php.c>
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 300
php_value max_input_time 300
php_value memory_limit 256M
</IfModule>
// wp-config.php: WordPressのアップロードサイズを設定
// PHPの上限を超えることはできないが、WordPressの内部制限を変更
add_filter('upload_size_limit', function(int $size): int {
return 64 * 1024 * 1024; // 64MB
});
ステップ3:パーミッションとアップロードパスを修正する
# uploads ディレクトリのパーミッションを修正
find /var/www/html/wp-content/uploads -type d -exec chmod 755 {} \;
find /var/www/html/wp-content/uploads -type f -exec chmod 644 {} \;
# Webサーバーの所有者を確認・修正
chown -R www-data:www-data /var/www/html/wp-content/uploads
# uploads ディレクトリが存在しない場合は作成
mkdir -p /var/www/html/wp-content/uploads
chmod 755 /var/www/html/wp-content/uploads
chown www-data:www-data /var/www/html/wp-content/uploads
// wp-config.php: アップロードパスをカスタマイズ
define('UPLOADS', 'wp-content/uploads'); // デフォルト値
// uploads ディレクトリを別ディスクに移動する場合
// define('UPLOADS', '/mnt/storage/uploads');
ステップ4:許可ファイルタイプを追加する
// functions.php: アップロード可能なファイルタイプを追加
// ① SVGファイルのアップロードを許可
add_filter('upload_mimes', function(array $mimes): array {
$mimes['svg'] = 'image/svg+xml';
$mimes['svgz'] = 'image/svg+xml';
return $mimes;
});
// SVGのMIMEタイプチェックを通過させる
add_filter('wp_check_filetype_and_ext', function(array $data, string $file, string $filename, array $mimes): array {
if (!$data['type']) {
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if ($ext === 'svg') {
$data['type'] = 'image/svg+xml';
$data['ext'] = 'svg';
}
}
return $data;
}, 10, 4);
// ② 追加のファイルタイプを許可
add_filter('upload_mimes', function(array $mimes): array {
$mimes['webp'] = 'image/webp';
$mimes['avif'] = 'image/avif';
$mimes['woff'] = 'font/woff';
$mimes['woff2'] = 'font/woff2';
$mimes['json'] = 'application/json';
return $mimes;
});
ステップ5:HTTPエラーの原因を特定して修正する
// functions.php: アップロードHTTPエラーの診断・修正
// ① アップロードエラーをログに記録
add_filter('wp_handle_upload_prefilter', function(array $file): array {
error_log(sprintf('[Upload] File: %s | Size: %d | Type: %s',
$file['name'], $file['size'], $file['type']));
return $file;
});
add_filter('wp_handle_upload', function(array $fileinfo): array {
if (isset($fileinfo['error'])) {
error_log('[Upload Error] ' . $fileinfo['error']);
} else {
error_log('[Upload Success] ' . ($fileinfo['file'] ?? ''));
}
return $fileinfo;
});
// ② GDライブラリでHTTPエラーが発生する場合はImagickに切り替え
add_filter('wp_image_editors', function(array $editors): array {
// Imagickを優先(大きな画像の処理に安定)
array_unshift($editors, 'WP_Image_Editor_Imagick');
return array_unique($editors);
});
// ③ 年月別サブフォルダを無効化(権限問題の回避)
add_filter('upload_dir', function(array $dirs): array {
// サブフォルダを使用せずルートのuploadsに保存
// $dirs['subdir'] = '';
// $dirs['path'] = $dirs['basedir'];
// $dirs['url'] = $dirs['baseurl'];
return $dirs; // デフォルトは年月別を維持
});
// ④ アップロード時のタイムアウトを延長
add_filter('upload_post_params', function(array $params): array {
$params['_wpnonce'] = wp_create_nonce('media-form');
return $params;
});
注意事項
- SVGファイルはXSSを含む可能性があるため、セキュリティ上の理由からWordPressはデフォルトでアップロードを許可していません。SVGのアップロードを許可する場合は、アップロードできるユーザーを管理者に限定し、信頼できるソースからのSVGのみを使用してください
post_max_sizeはupload_max_filesize以上に設定する必要があります。たとえばupload_max_filesize = 64Mの場合はpost_max_size = 64M以上(例:post_max_size = 128M)に設定してください- 共有ホスティングでは
php.iniを直接編集できない場合があります。その場合はホスティングのコントロールパネルでPHP設定を変更するか、.htaccessファイルにphp_valueディレクティブを追加する方法を試してください。それでも変更できない場合はホスティングサポートに問い合わせてください
まとめ
WordPressアップロードエラー修復は①ini_get('upload_max_filesize')・wp_upload_dir()で設定とパス・書き込み権限を確認・uploadsディレクトリのパーミッションをls -laで確認、②php.ini/.htaccessでupload_max_filesize=64M・post_max_size=64M・max_execution_time=300を設定、③find /uploads -type d -exec chmod 755・chown www-data:www-dataでパーミッション修正、④upload_mimesフィルターでSVG/WebP/AVIF/woffを追加・wp_check_filetype_and_extでSVGのMIMEタイプを通過、⑤wp_handle_upload_prefilterでアップロード前後のログ記録・Imagickを優先エディターに設定する手順で解決します。