2026年5月20日

2026年5月20日

WordPressのトランジェントを削除してwp_optionsを軽くする方法(WP-CLI・SQL)

トランジェント(Transients API)は、WordPress 本体やプラグインが、外部 API の結果や重い処理の結果を一定時間保存しておくための仕組みです。set_transient() で保存し、get_transient() で取り出します。

外部オブジェクトキャッシュ(Redis など)を使っていないサイトでは、トランジェントは wp_options テーブルに保存されます。期限切れのものが大量に残ると、テーブルが大きくなり、バックアップや検索に時間がかかるようになります。

トランジェントの保存のされ方

オプション名 中身
_transient_{名前} 値
_transient_timeout_{名前} 有効期限(UNIX 時間)。有効期限を付けて保存した場合だけ作られる
_site_transient_{名前} / _site_transient_timeout_{名前} サイトトランジェント(set_site_transient())。単一サイトでは wp_options に、マルチサイトでは wp_sitemeta に保存される

単一サイトでも、WordPress 本体の更新確認の結果(_site_transient_update_plugins など)はサイトトランジェントとして wp_options に入っています。

有効期限を付けたトランジェントは自動読み込み(autoload)されませんが、有効期限なしで保存されたトランジェントは自動読み込みされ、期限切れにもなりません。 後で説明する「期限切れの削除」では消えないので、件数が多い場合は作っているプラグインを調べます。

期限切れのトランジェントが自動で消えるタイミング

WordPress は次の2つの場面で、期限切れのトランジェントを削除します。

  • get_transient() で読み出したとき。 期限が過ぎていれば、その場で値と有効期限の両方を削除します。
  • 1日1回の定期処理。 WordPress 4.9 以降、delete_expired_transients という WP-Cron のイベントが毎日実行され、期限切れのものをまとめて削除します。このイベントは管理画面を開いたときに登録されます。

このため、通常は手作業で消す必要はありません。ただし、読み出されなくなったトランジェント(停止・削除したプラグインのものなど)が大量に残っている場合や、WP-Cron が動いていない場合は、次の方法で削除します。

作業の前にバックアップを取る

削除するのはキャッシュ用のデータですが、SQL を直接実行する場合は書き間違いに備えてデータベースを保存しておきます。

wp db export backup-before-transients.sql

件数と大きさを調べる

以下の SQL はテーブル接頭辞が wp_ の場合です。違う場合は wp_options を書き換えてください(wp config get table_prefix で確認できます)。LIKE の _ は「任意の1文字」を表すため、\_ と書いて文字そのものとして扱います。

# トランジェント全体の件数と値の合計サイズ(MB)
wp db query "SELECT COUNT(*) AS cnt, ROUND(SUM(LENGTH(option_value))/1024/1024, 2) AS mb FROM wp_options WHERE option_name LIKE '\_transient\_%' OR option_name LIKE '\_site\_transient\_%';"

# 期限切れの件数
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '\_transient\_timeout\_%' AND option_value < UNIX_TIMESTAMP();"

どのトランジェントがあるかは WP-CLI で一覧にできます。--human-readable を付けると、有効期限が「39 mins」「expired」のように表示されます。

wp transient list --fields=name,expiration --human-readable

WP-CLI で削除する(推奨)

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

# 期限切れのサイトトランジェントを削除
wp transient delete --expired --network

# 名前を指定して1つ削除
wp transient delete my_plugin_cache

期限内のものも含めてすべて削除する場合は --all を使います。

wp transient delete --all
wp transient delete --all --network

--all はキャッシュとして使われているものも消すため、削除の直後は各プラグインが値を作り直し、一時的に表示が遅くなることがあります。まず --expired で様子を見るのが無難です。

SQL で削除する(WP-CLI が使えない場合)

phpMyAdmin などで実行する場合は、WordPress 本体の delete_expired_transients() と同じ形の SQL を使います。値の行と有効期限の行を組にして、期限切れのものを両方削除します。

-- 期限切れのトランジェント(値と有効期限の両方)を削除
DELETE a, b FROM wp_options a, wp_options b
WHERE a.option_name LIKE '\_transient\_%'
  AND a.option_name NOT LIKE '\_transient\_timeout\_%'
  AND b.option_name = CONCAT('_transient_timeout_', SUBSTRING(a.option_name, 12))
  AND b.option_value < UNIX_TIMESTAMP();

-- 単一サイトの期限切れのサイトトランジェントを削除
DELETE a, b FROM wp_options a, wp_options b
WHERE a.option_name LIKE '\_site\_transient\_%'
  AND a.option_name NOT LIKE '\_site\_transient\_timeout\_%'
  AND b.option_name = CONCAT('_site_transient_timeout_', SUBSTRING(a.option_name, 17))
  AND b.option_value < UNIX_TIMESTAMP();

SUBSTRING(a.option_name, 12) は、先頭の _transient_(11文字)を除いた名前を取り出しています。同じテーブルを IN (SELECT ...) のサブクエリで参照する DELETE は、MySQL では「You can't specify target table ... for update in FROM clause」というエラーになるので使いません。

PHP から削除する

WordPress の関数 delete_expired_transients()(WordPress 4.9 以降)を呼ぶと、上の SQL と同じ処理が行われます。WP-CLI からは次のように実行できます。

wp eval 'delete_expired_transients( true );'

引数の true は、外部オブジェクトキャッシュを使っているときでもデータベースに対して削除を行う指定です。

定期的に削除したい場合

WordPress 本体が毎日削除するので、独自の WP-Cron イベントを追加する必要はありません。アクセスが少なく WP-Cron が動きにくいサイトや、WP-Cron を止めているサイトでは、サーバーの cron で WP-CLI を実行します。

# crontab -e で追加する例(毎日 4:30。パスは自分の環境に合わせる)
30 4 * * * cd /var/www/example.com/public_html && /usr/local/bin/wp transient delete --expired --quiet

大量に削除した後にテーブルの領域を詰めたい場合は、アクセスの少ない時間帯に次のコマンドを実行します。InnoDB ではテーブルの作り直しになり、大きなテーブルでは時間がかかるため、毎日実行するものではありません。

wp db query "OPTIMIZE TABLE wp_options;"

Redis などのオブジェクトキャッシュを使っている場合

Redis Object Cache などで外部オブジェクトキャッシュを有効にしていると、トランジェントは wp_options ではなくキャッシュ側に保存され、期限切れのものはキャッシュの仕組みが自動で捨てます。その場合、wp_options に残っているトランジェントは有効化する前に作られた古いもので、使われていません。

  • WordPress 本体の定期削除は、外部オブジェクトキャッシュを使っているときはデータベースを処理しません。残った古い行は、上の SQL か wp eval 'delete_expired_transients( true );' で削除します。
  • Redis Object Cache の設定は、wp-config.php の wp-settings.php を読み込む行より上に WP_REDIS_HOST などの定数を書き、管理画面の「設定」→「Redis」でキャッシュを有効にします(WP-CLI では wp redis enable)。ページキャッシュ用の WP_CACHE は、オブジェクトキャッシュには関係ありません。

まとめ

  • 期限切れのトランジェントは、読み出したときと1日1回の定期処理で WordPress が自動で削除します。
  • 手作業で消すときは wp transient delete --expired(サイトトランジェントは --network を追加)を使います。
  • SQL で消す場合は、WordPress 本体と同じ DELETE a, b の形で、値と有効期限の行を組にして削除します。
  • 有効期限なしのトランジェントは期限切れにならないので、件数が多い場合は作っているプラグインを確認します。

wp_options の自動読み込みデータ全体の見直しは wp_optionsテーブルの最適化 を参考にしてください。

お気軽にご相談ください

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