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への移行を検討してください。