2026年7月23日

2026年7月23日

W3 Total Cacheのエラーを解決する方法

はじめに

W3 Total Cacheを有効にしたがキャッシュファイルが生成されずサイトの速度が改善されない・データベースキャッシュを有効にすると「Too many connections」エラーが増加する・CDNを設定したが画像・CSS・JSのURLがCDNドメインに変換されず404エラーが発生する・Minify機能でJavaScriptを最小化するとコンソールにエラーが表示されてスクリプトが動作しないといった問題は、キャッシュドライバー設定・CDNのURLマッピング・Minifyの除外設定が原因です。

症状・原因

  • W3 Total Cacheを有効にしたがResponse HeaderにX-Powered-By: W3 Total Cacheが表示されない
  • データベースキャッシュを有効にするとMySQL接続数が急増してサーバーが不安定になる
  • CDNを設定したが一部の静的ファイルが旧URLのまま配信される
  • JavaScriptのMinify後にjQueryプラグインが「$ is not a function」エラーを出す

解決手順

ステップ1:W3 Total Cacheの状態を確認する

# W3 Total Cache設定確認
wp eval "
if (defined('W3TC_VERSION')) {
    echo 'W3 Total Cache version: ' . W3TC_VERSION . PHP_EOL;
}

// 設定を取得
\$config = w3tc_config();
echo 'Page cache: '     . (\$config->get_boolean('pgcache.enabled') ? 'enabled' : 'disabled') . PHP_EOL;
echo 'DB cache: '       . (\$config->get_boolean('dbcache.enabled') ? 'enabled' : 'disabled') . PHP_EOL;
echo 'Object cache: '   . (\$config->get_boolean('objectcache.enabled') ? 'enabled' : 'disabled') . PHP_EOL;
echo 'Minify: '         . (\$config->get_boolean('minify.enabled') ? 'enabled' : 'disabled') . PHP_EOL;
echo 'CDN: '            . (\$config->get_boolean('cdn.enabled') ? 'enabled' : 'disabled') . PHP_EOL;
echo 'Browser cache: '  . (\$config->get_boolean('browsercache.enabled') ? 'enabled' : 'disabled') . PHP_EOL;

// キャッシュドライバーを確認
echo 'Page cache engine: '   . \$config->get_string('pgcache.engine') . PHP_EOL;
echo 'DB cache engine: '     . \$config->get_string('dbcache.engine') . PHP_EOL;
echo 'Object cache engine: ' . \$config->get_string('objectcache.engine') . PHP_EOL;

// キャッシュディレクトリを確認
\$cache_dir = WP_CONTENT_DIR . '/cache/';
echo 'Cache dir writable: ' . (is_writable(\$cache_dir) ? 'yes' : 'no') . PHP_EOL;
"

ステップ2:ページキャッシュの問題を修正する

// functions.php: W3TCページキャッシュ制御

// ① 特定条件でキャッシュを無効化
add_filter('w3tc_can_cache', function(bool $can_cache): bool {
    // ログインユーザーはキャッシュしない
    if (is_user_logged_in()) return false;

    // WooCommerceの動的ページは除外
    if (function_exists('is_cart') && (is_cart() || is_checkout() || is_account_page())) {
        return false;
    }

    // プレビューモードは除外
    if (is_preview()) return false;

    return $can_cache;
});

// ② キャッシュを手動でパージ
function clear_w3tc_cache_for_post(int $post_id): void {
    if (!function_exists('w3tc_pgcache_flush_post')) return;

    w3tc_pgcache_flush_post($post_id);

    // トップページもフラッシュ
    w3tc_pgcache_flush_url(home_url('/'));

    error_log(sprintf('[W3TC] Cache flushed for post #%d', $post_id));
}

add_action('save_post', function(int $post_id, WP_Post $post): void {
    if ($post->post_status === 'publish') {
        clear_w3tc_cache_for_post($post_id);
    }
}, 10, 2);

// ③ WooCommerce注文完了後にキャッシュをフラッシュ
add_action('woocommerce_thankyou', function(int $order_id): void {
    if (function_exists('w3tc_pgcache_flush')) {
        w3tc_pgcache_flush();
    }
});

ステップ3:CDN設定の問題を修正する

# CDN設定の診断
wp eval "
\$config = w3tc_config();

// CDN設定を確認
\$cdn_engine = \$config->get_string('cdn.engine');
echo 'CDN engine: ' . \$cdn_engine . PHP_EOL;

// CDNのホスト設定を確認
\$cdn_hosts = [
    'cdn.domain' => \$config->get_array('cdn.s3.cname', []),
    'ftp.domain' => \$config->get_array('cdn.ftp.domain', []),
    'cf.domain'  => \$config->get_array('cdn.cf.cname', []),
];

foreach (\$cdn_hosts as \$type => \$hosts) {
    if (!empty(\$hosts)) {
        echo \$type . ': ' . implode(', ', \$hosts) . PHP_EOL;
    }
}

// URL置換設定を確認
\$replace_url = \$config->get_boolean('cdn.replace_url');
echo 'Replace URL: '        . (\$replace_url ? 'yes' : 'no') . PHP_EOL;

// CDNから除外されているファイルタイプを確認
\$excludes = \$config->get_array('cdn.includes.files', []);
echo 'Included file types: ' . implode(', ', \$excludes) . PHP_EOL;
"

ステップ4:Minify設定のJavaScriptエラーを修正する

// functions.php: Minify除外設定

// ① 問題のあるスクリプトをMinifyから除外
add_filter('w3tc_minify_js_do_tag_minification', function(bool $do, string $script_tag, string $url): bool {
    // 除外するスクリプトのパターン
    $excludes = [
        'jquery.js',
        'jquery.min.js',
        'jquery-migrate',
        'wp-embed.min.js',
        'recaptcha',
        'googlesyndication',
        'elementor',
        'woocommerce.min.js',
    ];

    foreach ($excludes as $pattern) {
        if (str_contains($url, $pattern)) {
            return false;
        }
    }

    return $do;
}, 10, 3);

// ② 特定ページでMinifyを無効化
add_filter('w3tc_minify_enable', function(bool $enable): bool {
    if (function_exists('is_checkout') && is_checkout()) {
        return false;
    }
    if (is_admin()) {
        return false;
    }
    return $enable;
});

// ③ HTMLのMinifyでコメントを保護
add_filter('w3tc_minify_html_enable', function(bool $enable): bool {
    // ショートコードを含むページはHTML Minifyを無効化
    global $post;
    if ($post && str_contains($post->post_content, '[')) {
        return false;
    }
    return $enable;
});

ステップ5:データベースキャッシュと全体最適化を設定する

// functions.php: DBキャッシュ・全体最適化

// ① DBキャッシュを安全に使用するための設定
add_filter('w3tc_dbcache_sql_can_cache', function(bool $can_cache, string $sql): bool {
    // 書き込みクエリはキャッシュしない(デフォルトだが念のため確認)
    if (preg_match('/^\s*(INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|ALTER|TRUNCATE)/i', $sql)) {
        return false;
    }
    // ランダムな結果を返すクエリはキャッシュしない
    if (str_contains(strtolower($sql), 'rand()')) {
        return false;
    }
    return $can_cache;
}, 10, 2);

// ② W3TCのデバッグ情報をHTMLコメントに出力
add_action('wp_footer', function(): void {
    if (!current_user_can('manage_options')) return;
    if (!isset($_GET['w3tc_debug'])) return;

    if (function_exists('w3tc_config')) {
        $config = w3tc_config();
        $info = [
            'version'     => W3TC_VERSION,
            'pgcache'     => $config->get_boolean('pgcache.enabled'),
            'minify'      => $config->get_boolean('minify.enabled'),
            'cdn'         => $config->get_boolean('cdn.enabled'),
            'cdn_engine'  => $config->get_string('cdn.engine'),
        ];
        printf('<!-- W3TC Debug: %s -->', esc_html(json_encode($info)));
    }
});

// ③ 全キャッシュフラッシュのWP-CLIコマンド
if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('w3tc flush', function(): void {
        if (function_exists('w3tc_flush_all')) {
            w3tc_flush_all();
            WP_CLI::success('W3 Total Cache flushed.');
        } else {
            WP_CLI::error('w3tc_flush_all function not found.');
        }
    });
}

注意事項

  • W3 Total Cacheのデータベースキャッシュ(DBキャッシュ)はデフォルトでディスクに保存されます。高トラフィックサイトではディスクI/Oが増加してかえって遅くなる場合があります。MemcachedまたはRedisをDBキャッシュのストレージとして使用することを検討してください
  • CDN設定後にアセットが404になる場合は「CDN → 設定」でCDNのホスト名が正しく設定されているかを確認してください。また「パフォーマンス → CDN」の「アタッチメントのURL置換」が有効になっているか確認が必要です
  • JavaScriptのMinifyで問題が発生した場合はまず「自動Minify」を無効にして「手動Minify」モードに切り替えてください。手動モードでは問題のあるスクリプトを個別に除外設定できます

まとめ

W3 Total Cache修復は①w3tc_config()でページキャッシュ・DBキャッシュ・Minify・CDNの有効状態とエンジン種別を確認、②w3tc_can_cacheフィルターでログインユーザー・WooCommerceを除外・w3tc_pgcache_flush_post()で更新時に自動パージ、③CDNエンジン・ホスト・URL置換設定をw3tc_config()で確認・除外ファイルタイプを診断、④w3tc_minify_js_do_tag_minificationフィルターでjQuery・WooCommerceを除外・チェックアウトページではMinify無効化、⑤w3tc_dbcache_sql_can_cacheで書き込みクエリ・RAND()を除外・?w3tc_debugパラメーターでデバッグ情報をHTMLコメント出力する手順で解決します。

お気軽にご相談ください

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