2026年5月27日

2026年5月27日

WordPressのトランジェント(Transient)を削除する方法|WP-CLI・SQL・PHP

WordPress のトランジェント(Transients API)は、外部 API の応答や重いクエリの結果などを、期限付きで保存しておく仕組みです。古い値が残って表示が更新されない、期限切れのトランジェントがデータベースにたまっている、といったときは削除して作り直させます。この記事では、まず保存先を確認し、WP-CLI・SQL・PHP のそれぞれで削除する方法と、削除したときの影響を説明します(2026年10月時点の WordPress と WP-CLI の公式ドキュメント・ソースコードに基づきます)。

トランジェントの保存先を確認する

トランジェントの保存先は、サイトの構成によって変わります。削除の方法もそれに合わせる必要があります。

  • 通常(永続オブジェクトキャッシュなし): wp_options テーブルに保存されます。値は _transient_{名前}、有効期限は _transient_timeout_{名前} という名前の行です。
  • サイトトランジェント(set_site_transient() で保存されるもの): シングルサイトでは wp_options の _site_transient_{名前} と _site_transient_timeout_{名前}、マルチサイトでは wp_sitemeta テーブルに保存されます。
  • Redis や Memcached などの永続オブジェクトキャッシュを導入している場合: トランジェントはデータベースを使わず、オブジェクトキャッシュに保存されます。この場合、データベースから削除しても効果はありません。

WP-CLI が使えるなら、次のコマンドで保存先を確認できます。

wp transient type

「Transients are saved to the database.」ならデータベース、「Transients are saved to the object cache.」ならオブジェクトキャッシュに保存されています。

WordPress による自動の掃除

WordPress 4.9 以降には、期限切れのトランジェントを削除する処理(delete_expired_transients)があり、管理画面にアクセスしたときに1日1回の予定として WP-Cron に登録されます。ただし、外部のオブジェクトキャッシュを使っている場合、この処理はデータベースに対して何もしません。

また、有効期限は「最長でこの時間まで」という意味で、期限前に消えることもあります。トランジェントを使うコードは、値が無ければ作り直す前提で書かれているため、削除しても通常は次のアクセスで作り直されます。

WP-CLI で削除する

WP-CLI の wp transient コマンドを使うのが手軽で安全です。

中身を確認する

# データベースにあるトランジェントの一覧(名前・値・有効期限)
wp transient list --human-readable

# 名前で絞り込む(* と ? のワイルドカードが使える)
wp transient list --search='*feed*' --fields=name,expiration --human-readable

# 件数だけを見る
wp transient list --format=count

1件だけ削除する

# 通常のトランジェント
wp transient delete sample_key

# サイトトランジェント
wp transient delete sample_key --network

キーは _transient_ を除いた名前で指定します。たとえば wp_options に _transient_feed_abc123 という行があれば、キーは feed_abc123 です。

期限切れだけ、またはすべてを削除する

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

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

# すべてのトランジェントを削除
wp transient delete --all

# すべてのサイトトランジェントを削除
wp transient delete --all --network

まずは --expired で期限切れのものだけを消し、それでも問題が直らない場合に --all を使うのが無難です。

マルチサイトでは、サイトごとのトランジェントが別のテーブルにあるため、全サイト分を消すには次のように実行します(WP-CLI の公式ドキュメントの例です)。

wp transient delete --all --network && wp site list --field=url | xargs -n1 -I % wp --url=% transient delete --all

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

永続オブジェクトキャッシュが有効なサイトで wp transient delete --all を実行すると、「Transients are stored in an external object cache, and this command only deletes those stored in the database. You must flush the cache to delete all transients.」という警告が出ます。データベースの分しか消えないという意味です。

オブジェクトキャッシュ上のトランジェントをまとめて消すには、キャッシュ全体を消去します。トランジェント以外のキャッシュもすべて消えるため、アクセスの少ない時間に行います。

wp cache flush

個別のキーなら、オブジェクトキャッシュを使っていても wp transient delete sample_key で削除できます(内部で delete_transient() を呼ぶため)。

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

phpMyAdmin などから SQL で消す場合は、作業前にデータベースのバックアップを取ってください。テーブル接頭辞(既定は wp_)は自分のサイトのものに置き換えます。

よく見かける LIKE '%transient_%' という条件は使わないでください。LIKE の _ は「任意の1文字」という意味のワイルドカードで、先頭の % もあるため、プラグインの設定など名前に「transient」を含むトランジェント以外の行まで消してしまうおそれがあります。_ は \_ とエスケープし、先頭一致で指定します。

-- 削除の前に件数を確認
SELECT COUNT(*) FROM wp_options
WHERE option_name LIKE '\_transient\_%'
   OR option_name LIKE '\_site\_transient\_%';

-- トランジェントとサイトトランジェント(期限の行も含む)を削除
DELETE FROM wp_options
WHERE option_name LIKE '\_transient\_%'
   OR option_name LIKE '\_site\_transient\_%';

期限切れのものだけを消す場合は、有効期限の行の値(UNIX 時刻)が現在より前のものを対象にします。値の行と期限の行の両方を消す必要があるため、WP-CLI の --expired を使える環境ならそちらが簡単です。

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

SUBSTRING(a.option_name, 12) は、先頭の _transient_(11文字)を除いた名前を取り出す指定です。

PHP で削除する(開発者向け)

自分のプラグインやテーマで作ったトランジェントは、データが変わったときに delete_transient() で消すのが基本です。次の例は、投稿を保存したときに、最新記事の一覧を保存していたトランジェントを削除するものです。

<?php
// 最新記事一覧のキャッシュを、投稿の保存時に削除する
add_action( 'save_post', function ( $post_id ) {
	if ( wp_is_post_revision( $post_id ) ) {
		return;
	}
	delete_transient( 'myplugin_latest_posts' );
} );

サイトトランジェントは delete_site_transient() で削除します。期限切れのものをデータベースからまとめて消す関数 delete_expired_transients() もありますが、外部のオブジェクトキャッシュを使っている環境では、引数に true を渡さない限り何もしません。

削除した後に起きること

  • 一時的に表示が遅くなることがある: 次のアクセスで、各プラグインが外部 API への問い合わせや集計をやり直すためです。アクセスの多いサイトでは、混雑する時間を避けて実行します。
  • 更新情報は作り直される: update_plugins や update_themes などのサイトトランジェントも消えますが、WordPress が次の確認で作り直します。
  • 期限なしのトランジェントは自動では消えない: 有効期限を付けずに保存されたトランジェントは期限切れにならず、自動読み込み(autoload)の対象にもなります。不要になったプラグインが残したものは、名前を確認して個別に削除します。

まとめ

  • まず wp transient type で保存先を確認する。オブジェクトキャッシュならデータベースから消しても効かない
  • WP-CLI の wp transient delete で、個別・--expired・--all(サイトトランジェントは --network)を使い分ける
  • オブジェクトキャッシュ上のトランジェントは wp cache flush でまとめて消える(ほかのキャッシュも消える)
  • SQL で消すときは '%transient_%' を使わず、'\_transient\_%' のように先頭一致・エスケープで指定し、事前にバックアップと件数確認を行う
  • 開発するコードでは、データが変わったときに delete_transient() で消す

関連記事:

お気軽にご相談ください

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