1. WP_Queryを実行する前にクエリを設定します
クエリを変更する唯一の機会は、もちろん、それがSQLデータベースで実行される前であるため、データベースクエリを最小限に抑えようとするとき、これは覚えておくべき最も重要なことのようです。
通常のクエリ
通常のクエリの場合、WordPressはwp()
関数を使用し、この関数はを呼び出します$wp->main( $query_vars )
。条件タグの「is_変数」は、に渡す前に設定さWP_Query->get_posts()
れ、MySQLデータベースクエリに変換され、最終的に$ wp_queryオブジェクトに保存されます。SQLデータベースで実際に実行される前にクエリをフィルタリングすることができます。
pre_get_posts
アクションは、それが渡される前に、クエリを変更することができ、このプロセスにフックWP_Query->get_posts()
。
たとえば、「注目」カテゴリの投稿のクエリをフィルタリングする場合add_action( 'pre_get_posts', 'your_function_name' );
は、in_category
内に条件タグを使用して含めますyour_function_name
。
function your_function_name( $query ) {
if ( $query->in_category( 'featured' ) && $query->is_main_query() ) {
// Replace 123 with the category ID of the featured category.
$query->set( 'cat', '123' );
}
}
add_action( 'pre_get_posts', 'your_function_name' );
プラグインAPI /アクションリファレンス/ pre get postsを参照してください«WordPress Codex
ページリクエスト
「機能」カテゴリのアーカイブページなどのページテンプレートに関しては、条件タグはpre_get_posts
フィルターから機能しません。たとえば、is_category
WP_Queryが実行されていないため、アーカイブページの確認に使用できません。
代わりに、のnew WP_Query
ようなページリクエストのメインクエリを変更する必要があります$query = new WP_Query( 'cat=123' );
。これにより、最初から適切な引数が設定されたクエリが実行されます。
参照クラスリファレンス/ WPクエリ«WordPressのコーデックス
2.データベースへの保存
フィルタを使用しwp_insert_post_data
て、カスタム投稿タイプに関連する$ dataのみがに返されるようにすることができますwp_insert_post
。カスタム投稿タイプを確認するための条件ステートメントを必ず含めてください。
プラグインAPI /フィルターリファレンス/ wp投稿データの挿入«WordPress Codex
このフックはwp_insert_post
関数によって呼び出されます。この関数は、通常下書きを保存するか、投稿を公開することにより、カスタム投稿タイプを更新するときにwp_update_postによって呼び出されます。
ただし、データベースで更新されるデータを削減することの最適化の重要性について個人的に話すことはできないため、自分でベンチマークを行う必要があります。
3.カスタム投稿タイプはパフォーマンスに影響しますか?
私の経験では、カスタム投稿タイプはコンテンツを管理するための強力なツールです。少ないリソースを使用する方法で許可されているすべての方法で投稿を管理する他の方法は知りません。個人的には、可能な限り行われるクエリの数を減らす方法を見つけることに集中します。
以前は、パーマリンク構造に関連するパフォーマンスの問題があったため、数字ではなくテキストで始まる場合にヒットしました。3これは、多数のページをホストするサイトでは特に面倒でしたが、WordPressバージョン3.3以降で解決されています。
スラッグは通常、パーマリンク構造の最初の部分であり、バージョン3.3より前のパフォーマンスに影響を与える可能性があるため、ここではパーマリンクのみを取り上げます。それ以外は、カスタム投稿タイプの使用から生じるパフォーマンスの問題については知りません。
その他のパフォーマンスオプション
Transients
これは、コード内でクエリを最小限に抑えるための代替ではありませんが、set_transientを使用してクエリをしばらく保存し、新しいクエリが不要になるようにすることができます。以下は、Dave Clementsの投稿で使用されている例です。また、save_post
特定の投稿タイプが更新されるたびに、一時的なイベントを削除するアクションを追加することをお勧めします。
<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( 'its_query' ) ) ) {
$pttimestamp = time() + get_option('gmt_offset') * 60*60;
$its_query = new WP_Query( array(
'post_type' => 'spotlight',
'posts_per_page' => 1,
'post__not_in' => $do_not_duplicate,
'meta_query' => array(
array(
'key' => '_hpc_spotlight_end_time',
'value' => $pttimestamp,
'compare' => '>'
)
)
) );
set_transient( 'its_query', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
// LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>
より多くのクエリの最適化
Thomas Griffinは、WordPressクエリの最適化チュートリアルでいくつかの良いヒントを持っています。彼の提案の簡単なリストを以下に示します。
'cache_results' => false
サーバーがMemcachedなどの永続的なキャッシュを使用していない場合は、1回限りのクエリで設定します。1回限りのクエリは、「少量のデータを表示するために使用されるクエリです。現在の投稿に関連するリンクされた投稿のタイトルを表示したい場合や、選択する投稿のドロップダウンを表示したい場合があります特定のオプション設定。」
彼の例: $query = get_posts( array( 'posts_per_page' => 1,
'cache_results' => false ) );
'no_found_rows' => true
ページネーションが不要な場所を設定します。これにより、「MySQLをバイパスして結果をカウントし、ページネーションが必要かどうかを確認します」。
彼の例: $query = new WP_Query( array( 'posts_per_page' => 1,
'no_found_rows' => true ) );
これはあなたが必要とするすべてである場合にのみ、ポストIDのクエリ'fields' => 'ids'
にget_posts
。これにより、返されるデータの量が大幅に削減されます。
データベースの説明«WordPress Codex
彼の例: $query = get_posts( array( 'posts_per_page' => 1,
'fields' => 'ids' ) );
最後のヒントに加えて、get_post_fieldを使用して1つまたはいくつかの投稿フィールドのみが必要な場合にも同じ推論を適用できます。
クエリがどのように機能するかをしっかりと理解することが不可欠です。クエリをより具体的にすればするほど、SQLデータベースに要求される作業が少なくなります。これは、データベースクエリを管理するための非常に多くの可能性があることを意味します。カスタムクエリを実行する場所(管理ページですか?)に注意し、直接クエリで適切なサニタイズを使用し、同じパフォーマンスを実現できるネイティブのWordPress機能を使用してみてください。