2026年5月20日

2026年5月20日

WordPressのトランジェントオプションを削除してDBを最適化する方法

はじめに

WordPressのトランジェントAPI(set_transient() / get_transient())は一時的なデータをデータベースに保存します。プラグインが多用するとwp_optionsテーブルが肥大化し、オプション取得のクエリが遅くなります。定期的なクリーンアップが効果的です。

トランジェントとは

wp_options テーブルに以下のパターンで保存されます:

| キー | 内容 |

|------|------|

| _transient_{name} | 値本体 |

| _transient_timeout_{name} | 有効期限(UNIXタイム) |

| _site_transient_{name} | マルチサイト用の値 |

期限切れのトランジェントは get_transient() を呼んだタイミングで削除されますが、呼ばれなければ永続的に残ります。

削除手順

WP-CLIで削除(推奨)

# 期限切れトランジェントをすべて削除
wp transient delete --expired

# すべてのトランジェントを削除(期限内も含む)
wp transient delete --all

# 特定のトランジェントを削除
wp transient delete my_plugin_cache

SQLで削除

-- 期限切れトランジェントを確認
SELECT COUNT(*) FROM wp_options
WHERE option_name LIKE '_transient_timeout_%'
  AND option_value < UNIX_TIMESTAMP();

-- 期限切れトランジェントの値を削除
DELETE FROM wp_options
WHERE option_name LIKE '_transient_%'
  AND option_name NOT LIKE '_transient_timeout_%'
  AND option_name IN (
    SELECT CONCAT('_transient_', SUBSTRING(option_name, 20))
    FROM wp_options
    WHERE option_name LIKE '_transient_timeout_%'
      AND option_value < UNIX_TIMESTAMP()
  );

-- タイムアウトレコードも削除
DELETE FROM wp_options
WHERE option_name LIKE '_transient_timeout_%'
  AND option_value < UNIX_TIMESTAMP();

WordPress関数で期限切れを削除

// WordPress 6.0以降: delete_expired_transients() が利用可能
delete_expired_transients(true); // true = サイトトランジェントも含む

// または手動で実装
add_action('wp_scheduled_delete', function() {
    // wp_scheduled_delete フックに便乗
    delete_expired_transients();
});

定期削除のスケジューリング

// functions.php — 日次でトランジェントをクリーンアップ
add_action('init', function() {
    if (!wp_next_scheduled('cleanup_transients_event')) {
        wp_schedule_event(time(), 'daily', 'cleanup_transients_event');
    }
});

add_action('cleanup_transients_event', function() {
    delete_expired_transients(true);
    // 最適化
    global $wpdb;
    $wpdb->query("OPTIMIZE TABLE {$wpdb->options}");
});

トランジェントをRedisに移行(高負荷サイト向け)

大量のトランジェントが問題になるサイトでは、Redisをオブジェクトキャッシュとして使うとDBへの書き込みを完全になくせます。

// wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_CACHE', true);

「Redis Object Cache」プラグインと組み合わせて設定します。

注意事項

  • wp transient delete --all はキャッシュとして機能しているトランジェントも削除するため、一時的にサイトが重くなる場合があります
  • マルチサイト環境では _site_transient_ プレフィックスのトランジェントも忘れずに削除してください
  • 削除直後は OPTIMIZE TABLE wp_options を実行してテーブルの断片化を解消することをおすすめします

まとめ

トランジェントのクリーンアップは wp transient delete --expired で手軽に実行できます。定期削除には delete_expired_transients()wp_schedule_event で日次実行する設定が効果的です。高負荷サイトではRedisへの移行を検討してください。

お気軽にご相談ください

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