どこでもオブジェクトキャッシュ
WordPressは、データベースクエリの数をできる限り削減しようとします。
たとえば、メタフィールドまたは分類フィールドを取得するたびに、データベースを照会する前に、WordPressはそれが既に照会されキャッシュに保存されているかどうかを確認し、データベースを照会する代わりにそこから返します。
「キャッシュジョブ」は、WP_Object_Cache
クラスとwp_cache_*
関数(そのクラスメソッドのラッパー)を介して実行されます。
キャッシュが存在する場所
デフォルトでは、「キャッシュ」はPHPグローバル変数にすぎません。これはメモリ内にあることを意味しますが、リクエストごとに消えることも意味します。
ただし、ドロップイン(advanced-cache.php
および/またはobject-cache.php
)を介して、このキャッシュを処理するカスタムの方法を設定することができます。
通常、このドロップインは、単一の要求を「生き残る」ための何らかのキャッシュメカニズムをセットアップするために使用されます。
このため、WPの人々の間では、これらは「永続キャッシュ」プラグインとして知られています(バブルの外では「キャッシュ」と「永続」という言葉はあまり意味をなさない場合でも)。
最近の人気のある選択肢は、MemcachedまたはRedisです。
「永続キャッシュ」プラグインを使用すると、キャッシュがリクエストごとに更新されないため、データベースクエリの数を大幅に減らすことができます。
いくつかの例
$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);
上記の2行のコードは、最大で1つのデータベースクエリをトリガーします。
実際、カスタムフィールドをクエリすると、その投稿のすべてのフィールドがデータベースから取得され、オブジェクトキャッシュを介してキャッシュされ、その後のリクエストはdbではなくキャッシュからデータをプルします。
同じことがタクソノミー用語についても発生します。WordPressはタクソノミーのすべての用語を一度プルし、それらをキャッシュから返します。
オブジェクトキャッシュはWordPressで非常に広く使用されています。投稿、メタ値、分類だけでなく、ユーザー、コメント、テーマデータも...
何がWP_Query
このすべてに関係していますか?
WP_Query
デフォルトで、いくつかの投稿をクエリすると、WordPressはデータベース(またはキャッシュされている場合はキャッシュ)からそれらを取得するだけでなく、取得した投稿に関連するすべてのカスタムフィールドとすべての分類のキャッシュも更新します。
したがって、たとえば、を介して、get_the_terms()
またはget_post_meta()
を介して取得された投稿をループしているときにWP_Query
、データベースクエリをトリガーするのではなく、キャッシュから情報を取得します。
いいね、そうじゃない?
ええ、はい、しかし費用がかかります。
メタおよびタクソノミーWP_Query
で投稿をプルするときにWordPressが行うキャッシュ更新「マジック」。update_meta_cache
update_object_term_cache
これらの関数のソースコードを見ると、WordPressが各関数でdbクエリを1つ実行するだけでなく、多くの処理を実行していることがわかります。例えば、でupdate_object_term_cache
ある7を入れ子になったforeach
...あなたは分類法がたくさんあるし、ページあたりの投稿数が多い場合、これは非常にパフォーマンスではありません。
WP_Query
最後に、これらの引数について
何'update_post_meta_cache'
と'update_post_term_cache'
に設定したときにやっていることはfalse
、それぞれ、カスタムフィールドと分類法の更新キャッシュにワードプレスを防ぐためです。
その場合、カスタムフィールドまたは分類法が初めて照会されると、データベースクエリがトリガーされ、データがキャッシュされます。
手間をかける価値はありますか?
いつものように、答えは依存します。これらの値をに設定するほとんどのfalse
場合は、不要な処理やデータベースクエリが不要になり、カスタムフィールド/分類条件が初めて必要になったときにキャッシュが更新されるため、適切な選択です。
ただし、get_post_meta()
ループ中に一度でも呼び出して、get_the_terms()
投稿でサポートされるすべての(またはほとんどの)分類法を呼び出す場合、キャッシュの更新はとにかくトリガーされ、実際の利点はない可能性がありますこれらのクエリ引数をに設定しますfalse
。
wp_reset_postdata()
をリセットglobal $post
およびリセットする理由は何ですか?カスタムWP_Queryを実行すると、新しいキャッシュオブジェクトが作成されますが、リセットすると元のキャッシュを取得するために再クエリする必要があります。それとも、この質問の文脈で私は遠すぎます。