Autoload:一緒に読み込まれるオプションを測定して切り替える
ここで実際に測られているもの
WordPress は、一つひとつの呼び出しのたびに — トップページ、画像、REST の呼び出し — autoload 列が立っているすべてのオプションを、1 回のクエリで読み込みます。つまりこれらの行は、一度だけ時間を食うのではなく、常に食い続けます。この列のどの値が「読み込まれる」と数えられるかは、Kakapo が WordPress 自身に問い合わせます(wp_autoload_values_to_autoload、6.6 以降、フィルターも含む)。それより古い設置では、yes、on、auto-on、auto のリストが使われます。そのうえで、それぞれの値の長さを PHP で数えます。つまり実際のバイト数です。SQL の LENGTH() のほうが速いのですが、ドライバーによってはバイトではなく文字を数えるため、SQLite ではウムラウトや絵文字があると、画面に誤った数字が並んでしまいます。読み取りは 100 行きざみで、1 回の処理につき最大 20,000 行までです。この上限に達した場合は画面がそれを伝え、数字を下限値であるとはっきり示します。測定はこの領域を開いたとき、または「再測定」を押したときにだけ走り — 訪問者のページ生成中には決して走りません — その後 300 秒間有効です。
4 つの指標を正しく読む
上部には 4 つの数字が並びます。「呼び出しのたびに読み込まれる量」は、合計サイズ、オプションの数、測定にかかった時間を示します。「警告しきい値に対する割合」は、それを 800,000 バイトに対して計算します — WordPress コアの「ウェブサイトの状態」のチェックとまったく同じしきい値で、そのフィルターも含みます。1 つの設置に異なる警告の境界が 2 つあっても、混乱するだけだからです。「うち切り替え可能」は、有効な持ち主のいない部分、つまり実際に手を触れられる分です。「すでに切り替え済み」は、ここで読み込みから外した分を合計します。その下の「負荷の出どころ」カードは同じ量を出どころ別に分けて示し、2 枚目のカードは大きい順に 25 件の個別項目を示します。
割り当ては名前の比較であって、証明ではありません
options テーブルには「所有者」という列がありません。そのため Kakapo は、オプション名を実際にディスク上にあるものと照合します。インストール済みの各プラグインのディレクトリ名、メインスクリプトのファイル名、テキストドメイン、そしてすべてのテーマのスラッグです。一致する接頭辞のうち最も長いものが優先されます。そうしないと「kakapowp」が「kakapowp_performance」に勝ってしまい、間違ったプラグインが表示されます。プラグインがオプションに実際に何を使っているかは、どのヘッダーにも書かれていません — 「wpseo」のような略称を「Yoast SEO」から導き出すことはできません。そうしたケースは「割り当てなし」の入れ物に入ります。これは「分からない」という意味であり、「どこにも属さない」という意味ではありません。接頭辞が確実に分かっている場合は、フィルター kwpp_autoload_praefixe で追加してください。プラグインも自身の接頭辞について同じことをしています。
切り替えられるもの — そして、多くがロックされたままである理由
「切り替え」ボタンが現れるのは、2 つの条件が同時に満たされたときだけです: そのオプションが 1 KB 以上あり、かつ有効な構成要素のどれにも属していないことです。したがってロックされたままになるのは、WordPress コアのオプション(populate_options に由来する固定のリストと、theme_mods_*、widget_*、*_user_roles のパターン — これらは呼び出しのたびに本当に必要です)、一時的な保存領域(Transients は詳細クリーンアップの担当で、そこでは読み込みが後回しになるだけでなく、まるごと消えます)、有効なプラグインや有効なテーマに属するものすべて、そして 1 KB 未満のものすべてです。1 KB 未満では、追加の個別クエリのほうが、節約できるバイト数より高くつくからです。灰色になっているボタンにマウスを乗せてください。その理由がヒントとして添えられています。割に合うのは、ほとんどの場合、無効になっている、あるいはとうに削除された拡張機能の、置き去りになった行です。有効なライセンスがなければ、この領域は休止状態です — 測定と表示は引き続き行われますが、切り替えは行われません。
切り替え、記録、取り消し
書き込みはコアの wp_set_option_autoload() を通して行い、独自の UPDATE は使いません: そうして初めて、あとで正しい一時保存がクリアされるからです。そうでなければ、外部のオブジェクトキャッシュが古い状態を返し続けます。この関数がない設置では、Kakapo は「no」を設定し、alloptions、notoptions、そして当該の単独の項目そのものをクリアします。書き込みの前に、その行をもう一度あらためて確認します: まだ存在するか、そもそもまだ「読み込まれる」状態か、そしてこの瞬間のサイズはどれくらいか。記録には、本当に読み込みから外されたものが残るべきだからです。データベースが変更を実行しなかった場合、メッセージはそれをはっきり伝え、何も変更されていません。記録は、変更前の列の値、サイズ、日時、ユーザー名とともに、最大 200 件を保ちます。取り消しは、個別にも、まとめて一度にも行えます。書き戻される値は「読み込まれる」です。WordPress の中間の値「auto」は、コア関数からは復元できないからです — 元の値は記録の中で引き続き見られます。あいだにオプションがまるごと消えていた場合、たとえばプラグインがアンインストールされた場合には、Kakapo はそのことを伝え、「取り消しました」と主張する代わりに、対象を失った項目を取り除きます。