WP_Queryは、WordPressの強力なクエリクラスであり、分類、ラベル、著者、時間、その他の条件に基づいてクエリ記事をカスタマイズできます。これにより、時間、ランダムな順序、または非常に強力なコメントの数など、さまざまな方法で記事を並べ替えることができます。簡単に言えば、wp_queryはメインクエリとは無関係にクエリインスタンスです。
WordPressでは、メインクエリはフロントエンドリクエストによって自動的に生成され、URLのパラメーターとWordPress設定のデフォルト値に基づいてクエリを構築します。より洗練されたクエリが必要な場合は、wp_queryを使用してカスタムクエリを実行する必要があります。
WP_QUERYは強力な機能を提供しますが、ほとんどの場合、メインクエリに小規模な調整を行う必要があります。たとえば、メインループ内の特定のカテゴリの記事を除外するか、特定の著者からの記事のみが表示されます。 wp_queryを直接使用する場合、メインクエリのパラメーターを無視します。これにより、予想される結果を満たさないクエリ結果が発生する場合があります。
したがって、カスタムクエリがメインクエリのパラメーターを継承し、クエリ結果の競合を回避できるように、WP_Queryをメインクエリとマージする必要があります。
メインクエリとカスタムクエリをマージするには2つの方法があります。1つはfunctions.phpでpre_get_postsフックを使用することで、もう1つはテンプレートファイルのクエリパラメーターを直接変更することです。各方法には利点と短所があり、特定のニーズに従って適切な方法を選択する必要があります。
pre_get_postsは、WordPressの重要なフック関数であり、クエリの前にクエリパラメーターを変更できます。 functions.phpファイルでpre_get_postsフック関数を使用することにより、メインクエリのパラメーターを簡単に変更して、必要な効果を実現できます。
これが例です:
function my_custom_query($query) {
// バックグラウンドクエリではなく、メインクエリの場合,クエリパラメーターを変更します
if (!is_admin() && $query->is_main_query()) {
$query->set('cat', '-1,-2,-3'); // 除外しますIDのために1、2、3分類
$query->set('author', '1'); // 表示のみを表示しますIDのために1著者による記事
}
}
add_action('pre_get_posts', 'my_custom_query');
上記のコードでは、$ query-> set()関数を使用してクエリパラメーターを変更し、特定のカテゴリを除外し、特定の著者記事のみを表示する機能を達成します。
テンプレートファイルのクエリを簡単に変更する必要がある場合は、クエリパラメーターを直接変更できます。これはより直接的でシンプルです。例えば:
// ホームページテンプレートのコード
$featured_posts = new WP_Query(array(
'category_name' => 'featured', // 表示のみを表示します特定分类的文章
'posts_per_page' => 5, // 表示のみを表示します5記事
));
while ($featured_posts->have_posts()) {
$featured_posts->the_post(); // 記事のタイトルを表示します、コンテンツなど
}
// 元のクエリを復元します
wp_reset_postdata();
上記のコードでは、category_nameとpost_per_pageパラメーターを設定して、特定のカテゴリの最初の5つの記事を照会します。同時に、wp_reset_postdata()関数を使用して元のクエリを復元して、後続のクエリに影響を与えないようにします。
pre_get_postsフックを使用している場合でも、クエリパラメーターを直接変更している場合でも、次のポイントに注意する必要があります。
WP_QUERYとメインクエリのマージは、WordPress開発において非常に実用的なスキルです。クエリをより正確にカスタマイズし、競合を回避するのに役立ちます。 pre_get_postsフックを使用する場合でも、クエリパラメーターを直接変更する場合でも、不必要な副作用を避けるために合理的に使用する必要があります。