2026年7月19日

2026年7月19日

EWWW Image Optimizerのエラーを解決する方法

はじめに

EWWW Image Optimizerを有効にしても「jpegtran・optipng・gifsicleが見つかりません」と表示されて画像最適化が実行されない・WebPリダイレクトを設定したが.htaccessルールが書き込まれずブラウザでJPEGが配信される・ExactDNを有効にしたが画像URLがCDNドメインに変換されない・クラウド最適化のAPIキーを設定したが「APIキーが無効」エラーが繰り返し表示されるといった問題は、サーバーのバイナリ設定・.htaccess権限・APIキー設定が原因です。

症状・原因

  • EWWW Image Optimizerの設定ページに「ツールが見つかりません」と表示される
  • 画像アップロード時に「WebP変換に失敗しました」エラーが表示される
  • .htaccessにWebPリダイレクトルールが追加されない
  • ExactDNを有効にしても画像がオリジンサーバーから配信される

解決手順

ステップ1:EWWW Image Optimizerの状態を確認する

# EWWW Image Optimizer設定確認
wp eval "
if (defined('EWWW_IMAGE_OPTIMIZER_VERSION')) {
    echo 'EWWW version: ' . EWWW_IMAGE_OPTIMIZER_VERSION . PHP_EOL;
}

// 設定を確認
echo 'WebP enabled: '    . (ewww_image_optimizer_get_option('ewww_image_optimizer_webp') ? 'yes' : 'no') . PHP_EOL;
echo 'WebP force: '      . (ewww_image_optimizer_get_option('ewww_image_optimizer_webp_force') ? 'yes' : 'no') . PHP_EOL;
echo 'Cloud key: '       . (ewww_image_optimizer_get_option('ewww_image_optimizer_cloud_key') ? 'set' : 'not set') . PHP_EOL;
echo 'ExactDN: '         . (ewww_image_optimizer_get_option('ewww_image_optimizer_exactdn') ? 'yes' : 'no') . PHP_EOL;
echo 'Compression: '     . ewww_image_optimizer_get_option('ewww_image_optimizer_jpg_level') . ' (10=auto, 30=lossless, 40=lossy)' . PHP_EOL;

// ローカルツールの確認
\$tools = [
    'jpegtran'  => ewww_image_optimizer_find_nix_binary('jpegtran', 'j'),
    'optipng'   => ewww_image_optimizer_find_nix_binary('optipng', 'o'),
    'gifsicle'  => ewww_image_optimizer_find_nix_binary('gifsicle', 'g'),
    'cwebp'     => ewww_image_optimizer_find_nix_binary('cwebp', 'w'),
];
foreach (\$tools as \$tool => \$path) {
    printf('  %s: %s' . PHP_EOL, \$tool, \$path ?: 'NOT FOUND');
}

// 最適化統計を確認
\$count = ewww_image_optimizer_aux_images_table_count_optimized();
echo 'Total optimized: ' . \$count . PHP_EOL;
"

ステップ2:ローカルツールとクラウド設定を修正する

# ローカルツールをサーバーにインストール
# Ubuntu/Debian の場合
apt-get install -y libjpeg-turbo-progs optipng gifsicle webp

# CentOS/RHEL の場合
yum install -y libjpeg-turbo-utils optipng gifsicle libwebp-tools

# ツールのパスを確認
which jpegtran optipng gifsicle cwebp

# EWWWにパスを手動設定(wp-config.phpに追加)
# define('EWWW_IMAGE_OPTIMIZER_JPEGTRAN', '/usr/bin/jpegtran');
# define('EWWW_IMAGE_OPTIMIZER_OPTIPNG', '/usr/bin/optipng');
# define('EWWW_IMAGE_OPTIMIZER_GIFSICLE', '/usr/bin/gifsicle');
# define('EWWW_IMAGE_OPTIMIZER_CWEBP', '/usr/bin/cwebp');
// wp-config.php: ローカルツールパスを明示的に設定
define('EWWW_IMAGE_OPTIMIZER_JPEGTRAN',  '/usr/bin/jpegtran');
define('EWWW_IMAGE_OPTIMIZER_OPTIPNG',   '/usr/bin/optipng');
define('EWWW_IMAGE_OPTIMIZER_GIFSICLE',  '/usr/bin/gifsicle');
define('EWWW_IMAGE_OPTIMIZER_CWEBP',     '/usr/bin/cwebp');

// クラウド最適化を強制使用(ローカルツールがない場合)
define('EWWW_IMAGE_OPTIMIZER_FORCE_CLOUD', true);

ステップ3:WebP設定と.htaccessを修正する

# WebP関連の診断
wp eval "
// WebP設定を確認
\$webp_enabled  = ewww_image_optimizer_get_option('ewww_image_optimizer_webp');
\$webp_htaccess = ewww_image_optimizer_get_option('ewww_image_optimizer_webp_for_cdn');
echo 'WebP enabled: '         . (\$webp_enabled ? 'yes' : 'no') . PHP_EOL;
echo 'WebP alt htaccess: '    . (\$webp_htaccess ? 'yes' : 'no') . PHP_EOL;

// .htaccessのWebPルールを確認
\$htaccess = ABSPATH . '.htaccess';
\$content  = file_exists(\$htaccess) ? file_get_contents(\$htaccess) : '';
echo '.htaccess writable: '   . (is_writable(\$htaccess) ? 'yes' : 'no') . PHP_EOL;
echo 'Has EWWW WebP rules: '  . (str_contains(\$content, 'EWWW') ? 'yes' : 'no') . PHP_EOL;

// WebPファイルの生成状況
\$upload_dir = wp_upload_dir();
\$webp_count = count(glob(\$upload_dir['basedir'] . '/**/*.webp', GLOB_BRACE) ?? []);
echo 'WebP files generated: ' . \$webp_count . PHP_EOL;
"

ステップ4:最適化の除外設定とカスタマイズを行う

// functions.php: EWWW最適化カスタマイズ

// ① 特定の画像を最適化から除外
add_filter('ewww_image_optimizer_bypass', function(bool $bypass, string $filename): bool {
    // RAWや高品質が必要な画像は除外
    if (str_contains($filename, '/portfolio/')) return true;
    if (str_contains($filename, '/products/original/')) return true;

    // ファイルサイズが10KB以下は最適化しない
    if (file_exists($filename) && filesize($filename) < 10 * 1024) return true;

    return $bypass;
}, 10, 2);

// ② 最適化レベルを画像タイプ別に設定
add_filter('ewww_image_optimizer_jpg_quality', function(int $quality): int {
    return 82; // JPEG品質を82%に設定(デフォルト82)
});

// ③ 最適化完了時に追加処理を実行
add_filter('ewww_image_optimizer_post_optimize_attachment', function(array $meta, int $id): array {
    error_log(sprintf('[EWWW] Optimized attachment #%d', $id));

    // WP Rocketのキャッシュをクリア
    if (function_exists('rocket_clean_home')) {
        rocket_clean_home();
    }

    return $meta;
}, 10, 2);

// ④ WebP変換の優先度を設定
add_filter('ewww_image_optimizer_webp', function(bool $webp, string $type): bool {
    // PNG画像は常にWebP変換する
    if ($type === 'image/png') return true;
    return $webp;
}, 10, 2);

ステップ5:一括最適化とExactDN設定を修正する

// functions.php: 一括最適化・ExactDN設定

// ① 一括最適化のバッチサイズを調整
add_filter('ewww_image_optimizer_bulk_attachment_loop_count', function(int $count): int {
    return 10; // 1バッチあたり10枚(タイムアウト防止)
});

// ② ExactDNのURLマッピングをカスタマイズ
add_filter('exactdn_skip_image', function(bool $skip, string $url, mixed $args): bool {
    // 管理画面の画像はExactDNを使用しない
    if (str_contains($url, '/wp-admin/')) return true;

    // SVGはExactDNを通さない
    if (str_ends_with(strtolower($url), '.svg')) return true;

    return $skip;
}, 10, 3);

// ③ WP-CLIから一括最適化を実行
if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('ewww optimize', function(array $args, array $assoc_args): void {
        $limit = (int) ($assoc_args['limit'] ?? 50);

        global $wpdb;
        $ids = $wpdb->get_col(
            $wpdb->prepare(
                "SELECT ID FROM {$wpdb->posts}
                 WHERE post_type = 'attachment'
                 AND post_mime_type LIKE 'image/%'
                 AND ID NOT IN (
                     SELECT attachment_id FROM {$wpdb->prefix}ewwwio_images
                     WHERE updates > 0
                 )
                 LIMIT %d",
                $limit
            )
        );

        WP_CLI::log(sprintf('Optimizing %d images...', count($ids)));
        foreach ($ids as $id) {
            ewww_image_optimizer_resize_from_meta_data(
                wp_get_attachment_metadata((int) $id),
                (int) $id
            );
            WP_CLI::log('Optimized #' . $id);
        }
        WP_CLI::success('Done.');
    });
}

注意事項

  • EWWW Image Optimizerのローカル最適化にはサーバーにjpegtran・optipng・gifsicle・cwebpのバイナリがインストールされている必要があります。共有ホスティングではこれらのバイナリが使用できない場合があります。その場合はAPIキーを設定してクラウド最適化を使用してください
  • WebPの.htaccess方式はApache環境のみで動作します。Nginxを使用している場合は「WebP Paths」または「Alt WebP Rewriting」オプションを選択するか、Nginxの設定ファイルにWebPリダイレクトルールを追加してください
  • ExactDNを有効にするにはEasyIO(旧ExactDN)サービスへの登録が必要です。無料プランでは月間の帯域幅制限があります。大量のトラフィックがある場合は有料プランへのアップグレードを検討してください

まとめ

EWWW Image Optimizer修復は①ewww_image_optimizer_find_nix_binary()でjpegtran・optipng・gifsicle・cwebpの存在確認・最適化済み枚数を確認、②wp-config.phpにバイナリパスを明示的に定義・EWWW_IMAGE_OPTIMIZER_FORCE_CLOUD=trueでクラウドモードに切替・必要に応じてサーバーにバイナリをインストール、③.htaccessのEWWW WebPルール確認・WebPファイル生成数確認、④ewww_image_optimizer_bypassフィルターでポートフォリオや小画像を除外・ewww_image_optimizer_jpg_qualityで品質82%に設定、⑤ewww_image_optimizer_bulk_attachment_loop_countを10に制限・exactdn_skip_imageでSVGと管理画面画像を除外・WP-CLIで未最適化画像を一括処理する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ