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内に