2026年9月18日
2026年9月18日
WordPressのwp_optionsテーブルを最適化する方法|autoloadの確認と整理
wp_options テーブルには、サイトの設定やプラグインの設定が保存されています。このうち autoload(自動読み込み)が有効な行は、ページを表示するたびに最初の1回のクエリでまとめて読み込まれます。不要な行や大きな行が autoload のまま増えると、すべてのページで余分なデータを読み込むことになり、表示が遅くなります。この記事では、autoload の状態を調べ、削除や切り替えで整理する手順を説明します。内容は2026年10月時点のWordPress 6系とWP-CLI 2系を前提にしています。
作業の前にデータベースのバックアップを取ってください(wp db export など)。SQLの例はテーブル接頭辞が wp_ の場合です。
autoloadの値の意味(WordPress 6.6以降)
WordPress 6.6から、autoload 列に入る値が増えました。古い記事にある autoload = 'yes' だけの条件では、読み込まれる行を数え漏らします。
| 値 | 意味 | 毎回読み込まれるか |
|---|---|---|
yes、on |
自動読み込みする(yes は6.6より前の形式) |
はい |
auto-on |
WordPressの判断で自動読み込みする | はい |
auto |
指定なし。現在は読み込まれる | はい |
no、off |
自動読み込みしない | いいえ |
auto-off |
WordPressの判断で自動読み込みしない | いいえ |
6.6以降、プラグインが autoload を指定せずに保存したオプションは、値の大きさが150,000バイトを超えると auto-off になり、自動読み込みされません(wp_max_autoloaded_option_size フィルターで変更できます)。大きな行が新しく autoload されることは減りましたが、6.6より前に保存された行はそのまま残っています。
autoloadの合計と大きい行を調べる
管理画面で確認する
「ツール」→「サイトヘルス」は、自動読み込みされるオプションの合計が既定で約800KBを超えると、改善項目として警告を表示します。まずここで警告が出ているかを確認します。
WP-CLIで確認する
# autoload が on / yes のオプションの合計サイズ(バイト)
wp option list --autoload=on --format=total_bytes
# autoload が on / yes のオプションを大きい順に20件
wp option list --autoload=on --fields=option_name,size_bytes | sort -n -k 2 | tail -20
wp option list の --autoload=on が対象にするのは、値が on と yes の行だけです。auto と auto-on の行は含まれないため、すべてを数えるには次のSQLを wp db query で実行します。
SQLで確認する
wp db query "..." で実行するか、phpMyAdminのSQL画面で実行します。6.6以降の値も含めて条件を書きます。
-- 自動読み込みされる行の件数と合計サイズ
SELECT COUNT(*) AS cnt,
ROUND(SUM(LENGTH(option_value)) / 1024, 1) AS size_kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto');
-- 大きい順に20件
SELECT option_name, autoload,
ROUND(LENGTH(option_value) / 1024, 1) AS size_kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto')
ORDER BY LENGTH(option_value) DESC
LIMIT 20;
大きい行を見分ける
大きい行が見つかったら、名前の先頭部分から、どのテーマやプラグインのものかを調べます。wp option get オプション名 で中身を見ると、手がかりになることがあります。見分けたら、次のように扱いを決めます。
| 行の持ち主 | 扱い |
|---|---|
| 削除済みのプラグインやテーマ | 削除してよい(次の節) |
| 使用中のプラグイン | 勝手に削除しない。肥大化が続くなら、プラグインの設定(ログやキャッシュの保存先など)や更新で対処し、必要なら作者に問い合わせる |
WordPress本体(cron、rewrite_rules、active_plugins など) |
削除も autoload の変更もしない。どれもほぼ毎回のページ表示で使われるため、autoload を外すとかえってクエリが増える |
cron が数百KBになっている場合は、同じ予定が大量に登録されていることが多く、原因のプラグインを直す必要があります。wp cron event list で、同じ名前の予定が繰り返し並んでいないか確認します。
削除したプラグインの残りを消す
プラグインを削除しても、オプションが残ることがあります。名前の先頭部分で一覧を出し、中身を確認してから削除します。
# 「old_plugin_」で始まるオプションを一覧する
wp option list --search="old_plugin_*" --fields=option_name,autoload,size_bytes
# 一覧の内容を確認してから、まとめて削除する
wp option list --search="old_plugin_*" --field=option_name | xargs -I % wp option delete %
--search では * と ? が使えます。先頭部分が短すぎると、ほかのプラグインの行まで一致するので、削除の前に一覧の内容を見てください。
autoloadだけを切り替える
使い道は分かっているが、毎回のページ表示では使わない大きな行(例: 自作プラグインのログ)は、削除せずに autoload だけを無効にできます。
# autoload を無効にする(on / off で指定する)
wp option set-autoload my_plugin_log off
# 現在の値を確認する
wp option get-autoload my_plugin_log
PHPから変える場合は、WordPress 6.4で追加された関数を使います。wp_options を $wpdb->update() で直接書き換えると、オブジェクトキャッシュに古い値が残ることがあるため、こちらを使ってください。
<?php
// 1件の autoload を無効にする(WordPress 6.4 以上)
wp_set_option_autoload( 'my_plugin_log', false );
// 複数件をまとめて無効にする
wp_set_options_autoload( array( 'my_plugin_log', 'my_plugin_stats' ), false );
autoload を無効にした行は、使われるときに1件ずつ読み込まれます。毎回のページ表示で使われる行を無効にすると、その分クエリが増えて遅くなるため、使用中のプラグインの行は、動作を確認しながら1件ずつ変えてください。
Transientを整理する
Transient(期限付きの一時キャッシュ)は、保存のしかたによって autoload の扱いが変わります。
- 有効期限を指定したTransientは、autoload が無効の状態で保存され、期限の行(
_transient_timeout_で始まる行)が別に作られる - 有効期限を指定しない(0の)Transientは、autoload が有効の状態で保存される
期限切れのTransientは、WordPressが1日1回の予定処理(delete_expired_transients)で削除します。すぐに消したい場合は、次のコマンドを使います。
# 期限切れの Transient だけを削除する
wp transient delete --expired
# wp_options に保存されている Transient の行数を確認する
wp option list --transients --format=count
wp transient delete --all は、期限のないTransientも含めてすべて削除します。プラグインが作り直せないデータを保存している場合に不具合が出ることがあるため、通常は --expired を使ってください。
RedisやMemcachedの永続オブジェクトキャッシュを使っている場合、Transientは wp_options ではなくオブジェクトキャッシュに保存されます。この場合も自動読み込みのオプションはオブジェクトキャッシュに1つのまとまりとして保存されるため、合計が大きすぎないかは同じように確認します。
テーブルを最適化する
大量の行を削除した後は、テーブルを最適化すると、使われていない領域が整理されます。
wp db query "OPTIMIZE TABLE wp_options;"
InnoDBではテーブルの作り直しになり、その間は負荷が上がります。アクセスの少ない時間帯に実行してください。
自作のコードで肥大化させない
テーマやプラグインを自作している場合は、オプションを保存するときに、毎回のページ表示で使うかどうかで autoload を指定します。WordPress 6.7以降、autoload に 'yes'・'no' を渡すことは非推奨なので、真偽値で指定します。
<?php
// 毎回のページ表示では使わないデータは autoload を無効にして保存する
// add_option() の第3引数は使われていない(非推奨)ので空文字を渡す
add_option( 'my_plugin_report', $report, '', false );
update_option( 'my_plugin_report', $report, false );
// 作り直せる重い計算結果は、有効期限つきの Transient に保存する
$data = get_transient( 'my_plugin_heavy_data' );
if ( false === $data ) {
$data = my_plugin_build_heavy_data(); // 重い処理(自作の関数)
set_transient( 'my_plugin_heavy_data', $data, 6 * HOUR_IN_SECONDS );
}
update_option() の第3引数は、既存の行の autoload も変更します。省略した場合(null)は、既存の行の autoload は変わりません。
まとめ
- 自動読み込みされるのは
yes・on・auto-on・autoの行。wp option list --autoload=onはon・yesしか数えないため、合計はSQLで確認する - サイトヘルスは合計が約800KBを超えると警告する
- 削除済みプラグインの行は、一覧で確認してから
wp option deleteで消す - 使用中のプラグインやWordPress本体の行(
cron、rewrite_rulesなど)は、autoload を外さない - autoload の切り替えは
wp option set-autoloadかwp_set_option_autoload()を使う - Transientは
wp transient delete --expiredで整理する。自作コードでは autoload を真偽値で指定する
関連記事: