2026年5月19日

2026年5月19日

WP Super Cacheのエラーを解決する方法

はじめに

WP Super Cacheでキャッシュを有効にしているのにページ速度が改善されない・投稿を更新しても古いコンテンツがキャッシュされ続けて表示される・「.htaccess更新エラー」が表示されmod_rewriteルールが追加できない・キャッシュファイルが溜まりすぎてディスクが圧迫されているといった問題は、サーバー設定・パーミッション・キャッシュ設定の問題が原因です。

症状・原因

  • WP Super Cacheを有効にしているがレスポンスヘッダーにX-WP-Super-Cacheが含まれない
  • 投稿を更新してもフロントエンドには更新前のコンテンツが表示される
  • 「.htaccessファイルを更新できません」エラーが設定画面に表示される
  • /wp-content/cache/supercache/ディレクトリが数GBになっている

解決手順

ステップ1:WP Super Cacheの状態を確認する

# WP Super Cacheの設定を確認
wp eval "
// バージョン確認
if (defined('WPSUPERCACHE_VERSION')) {
    echo 'WP Super Cache version: ' . WPSUPERCACHE_VERSION . PHP_EOL;
}

// キャッシュ設定確認
global \$wp_cache_enabled, \$cache_enabled, \$super_cache_enabled;
echo 'Cache enabled: '       . (function_exists('wp_cache_is_enabled') ? (wp_cache_is_enabled() ? 'yes' : 'NO') : 'unknown') . PHP_EOL;
echo 'Super cache enabled: ' . (\$super_cache_enabled ? 'yes' : 'NO') . PHP_EOL;

// キャッシュファイルの状況確認
\$cache_dir = WP_CONTENT_DIR . '/cache/supercache/';
if (is_dir(\$cache_dir)) {
    \$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(\$cache_dir));
    \$count = 0; \$size = 0;
    foreach (\$files as \$f) {
        if (\$f->isFile()) { \$count++; \$size += \$f->getSize(); }
    }
    printf('Cache files: %d files, %.1f MB' . PHP_EOL, \$count, \$size / 1024 / 1024);
} else {
    echo 'Cache dir does not exist' . PHP_EOL;
}

// .htaccessの確認
\$htaccess = ABSPATH . '.htaccess';
echo '.htaccess writable: ' . (is_writable(\$htaccess) ? 'yes' : 'NO') . PHP_EOL;
\$htaccess_content = file_get_contents(\$htaccess);
echo 'WP Super Cache rules: ' . (str_contains(\$htaccess_content, 'WP Super Cache') ? 'yes' : 'NO') . PHP_EOL;
"

ステップ2:キャッシュをプログラムで管理する

// functions.php: WP Super Cacheキャッシュ管理

// ① キャッシュを手動でクリア
function clear_wpsc_cache(string $url = ''): void {
    if (!function_exists('wp_cache_clear_cache')) {
        if (file_exists(WP_CONTENT_DIR . '/plugins/wp-super-cache/wp-cache.php')) {
            include_once WP_CONTENT_DIR . '/plugins/wp-super-cache/wp-cache.php';
        }
    }

    if ($url) {
        // 特定URLのキャッシュのみ削除
        if (function_exists('wpsc_delete_url_cache')) {
            wpsc_delete_url_cache($url);
        }
    } else {
        // 全キャッシュを削除
        if (function_exists('wp_cache_clear_cache')) {
            wp_cache_clear_cache();
        }
    }
    error_log('[WPSC] Cache cleared' . ($url ? ' for: ' . $url : ' (all)'));
}

// ② 投稿更新時に関連キャッシュをクリア
add_action('save_post', function(int $post_id, \WP_Post $post): void {
    if ($post->post_status !== 'publish') return;
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    // 投稿URLのキャッシュを削除
    $url = get_permalink($post_id);
    clear_wpsc_cache($url);

    // カテゴリー・タグアーカイブのキャッシュも削除
    $terms = wp_get_post_terms($post_id, ['category', 'post_tag']);
    foreach ($terms as $term) {
        clear_wpsc_cache(get_term_link($term));
    }
}, 10, 2);

// ③ コメント投稿時にキャッシュをクリア
add_action('comment_post', function(int $comment_id): void {
    $comment = get_comment($comment_id);
    if ($comment && $comment->comment_post_ID) {
        clear_wpsc_cache(get_permalink($comment->comment_post_ID));
    }
});

ステップ3:キャッシュ除外設定をカスタマイズする

// functions.php: キャッシュ除外設定

// ① 特定のページをキャッシュから除外
add_filter('wp_cache_is_cacheable', function(bool $cacheable): bool {
    // ログインユーザーはキャッシュしない(デフォルトで設定済みの場合が多い)
    if (is_user_logged_in()) return false;

    // カート・チェックアウトページはキャッシュしない
    if (function_exists('is_cart') && is_cart()) return false;
    if (function_exists('is_checkout') && is_checkout()) return false;

    // 検索結果はキャッシュしない
    if (is_search()) return false;

    return $cacheable;
});

// ② URLパターンでキャッシュを除外
add_filter('wp_super_cache_exclude_cookies', function(array $cookies): array {
    // カートクッキーが存在するセッションはキャッシュしない
    $cookies[] = 'woocommerce_cart_hash';
    $cookies[] = 'woocommerce_items_in_cart';
    return $cookies;
});

// ③ キャッシュのTTL(有効期限)を設定
add_filter('wp_cache_max_time', function(int $max_time): int {
    // デフォルトは3600秒(1時間)を86400秒(24時間)に変更
    return 86400;
});

ステップ4:.htaccessとmod_rewriteを修正する

# .htaccessのパーミッションを確認・修正
ls -la /path/to/wordpress/.htaccess
chmod 644 /path/to/wordpress/.htaccess

# .htaccessにWP Super Cacheのルールを手動追加
# WP Super CacheのCDNモードまたはmod_rewriteモードのルールを確認
wp eval "
\$htaccess_path = ABSPATH . '.htaccess';
echo 'Current .htaccess content:' . PHP_EOL;
echo file_get_contents(\$htaccess_path) . PHP_EOL;
"
# .htaccess: WP Super Cache mod_rewriteルール(手動追加)
# BEGIN WPSuperCache
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /

  # キャッシュファイルが存在する場合は直接配信
  RewriteCond %{REQUEST_METHOD} GET
  RewriteCond %{QUERY_STRING} ^$
  RewriteCond %{HTTP:Cookie} !wordpress_logged_in
  RewriteCond %{HTTP:Cookie} !comment_author
  RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html -f
  RewriteRule ^(.*)$ /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html [L]
</IfModule>
# END WPSuperCache
// functions.php: .htaccess修復

// ① .htaccessをプログラムで更新
function repair_wpsc_htaccess(): bool {
    if (!function_exists('wpsc_remove_from_htaccess')) return false;

    // 既存のルールを削除して再追加
    wpsc_remove_from_htaccess();

    if (function_exists('wpsc_update_htaccess')) {
        return wpsc_update_htaccess();
    }
    return false;
}

// ② キャッシュディレクトリのパーミッションを修正
function fix_wpsc_permissions(): void {
    $cache_dir = WP_CONTENT_DIR . '/cache/';
    if (!is_dir($cache_dir)) {
        wp_mkdir_p($cache_dir);
    }
    chmod($cache_dir, 0755);

    $supercache_dir = $cache_dir . 'supercache/';
    if (!is_dir($supercache_dir)) {
        wp_mkdir_p($supercache_dir);
    }
    chmod($supercache_dir, 0755);
    error_log('[WPSC] Permissions fixed for cache directories');
}

ステップ5:古いキャッシュファイルを定期クリーンアップする

// functions.php: キャッシュクリーンアップ

// ① 定期的なキャッシュクリアをスケジュール
add_action('init', function(): void {
    if (!wp_next_scheduled('wpsc_scheduled_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpsc_scheduled_cleanup');
    }
});

add_action('wpsc_scheduled_cleanup', function(): void {
    $cache_dir = WP_CONTENT_DIR . '/cache/supercache/';
    if (!is_dir($cache_dir)) return;

    $expired   = 0;
    $max_age   = 24 * HOUR_IN_SECONDS; // 24時間以上前のファイルを削除

    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($cache_dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST
    );

    foreach ($iterator as $file) {
        if ($file->isFile() && (time() - $file->getMTime()) > $max_age) {
            unlink($file->getPathname());
            $expired++;
        }
    }

    error_log(sprintf('[WPSC] Cleaned up %d expired cache files', $expired));
});

// ② キャッシュサイズが閾値を超えたら全クリア
add_action('wp_loaded', function(): void {
    $cache_dir = WP_CONTENT_DIR . '/cache/supercache/';
    if (!is_dir($cache_dir)) return;

    // キャッシュが500MBを超えたら自動クリア
    $max_size = 500 * 1024 * 1024;
    $size     = 0;

    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($cache_dir)) as $f) {
        if ($f->isFile()) $size += $f->getSize();
        if ($size > $max_size) break;
    }

    if ($size > $max_size) {
        if (function_exists('wp_cache_clear_cache')) {
            wp_cache_clear_cache();
            error_log('[WPSC] Auto-cleared cache (size exceeded 500MB)');
        }
    }
});

注意事項

  • WP Super CacheのキャッシュはApache(mod_rewrite)・NGINXの設定と密接に関連しています。NGINXを使用している場合はmod_rewriteルールは使用できないため、WP Super CacheをPHPキャッシュモードで動作させるか、NGINXの設定ファイルに直接キャッシュルールを記述する必要があります
  • ログインユーザーのページをキャッシュするとセキュリティリスクがあります(他のユーザーがログイン状態のページを見てしまう)。WP Super Cacheの設定で「ログインユーザーにキャッシュを提供しない」を必ず有効にしてください
  • WooCommerceサイトでWP Super Cacheを使用する場合は、カート・チェックアウト・マイアカウントページを必ずキャッシュ除外に設定してください。これらのページをキャッシュすると深刻な不具合(他ユーザーの注文内容が見える等)が発生します

まとめ

WP Super Cache修復は①wp_cache_is_enabled()でキャッシュ状態確認・キャッシュファイル数とサイズ確認・.htaccessのWPSCルール有無確認、②wp_cache_clear_cache()でキャッシュを全削除・wpsc_delete_url_cache()で特定URLのみ削除・save_postフックで更新時の自動クリア、③wp_cache_is_cacheableフィルターでカート・検索ページを除外・WooCommerceクッキーによるキャッシュ除外設定、④.htaccessパーミッション修正・mod_rewriteルールの手動追加・wpsc_update_htaccess()でプログラム更新、⑤wp_schedule_event()でdaily定期クリーンアップ・500MB超えで自動全クリアする手順で解決します。

お気軽にご相談ください

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