WordPressカスタムクエリ–WP_Queryクラスの使用
公開: 2021-02-06WordPressは、ほとんどの場合、データベースから必要な情報を取得できる、すぐに使用できるさまざまな機能を提供します。 しかし、WordPress Webサイトを開発する場合、フィルターまたはアクションが目的の結果を達成するのに十分でないシナリオが多数あります。 これらの場合。 WordPressは、 WP_Query
クラスの形式で回避策を提供します。
WP_Query
クラスの使用方法を見てみましょう。
カスタムクエリケース
注:この記事は、PHPとMySQL / MariaDBにある程度の知識があり、WordPressの操作に精通していることを前提としています。
どのページにアクセスしても、WordPressは「メインクエリ」と呼ばれるものを実行してコンテンツを表示します。 したがって、たとえばカテゴリビューのようなページにアクセスすると、 WP_Query
オブジェクトがバックグラウンドで作成され、データベースから必要なすべてのデータを取得してページを表示します。
WP_Query
が基本的に行うことは、SQLクエリを使用せずにWebサイトのデータベースからコンテンツを取得する機能を提供することです。
これを行うには、ニーズに対応する引数を定義するだけで、新しいWP_Query
オブジェクトが作成され、SQLクエリに変換されます。
WP_Queryを使用した例
特定のカテゴリの投稿を別のカテゴリテンプレート内に表示する場合は、新しいクエリオブジェクトを作成する必要があります。
この例では、Twenty Twentyテーマをアクティブにし、「Category1」というカテゴリの下に2つの投稿を作成し、「Services」という名前のカテゴリの下に2つの投稿を作成しました。
さらに、「カテゴリ1」の投稿用にカスタムカテゴリビューテンプレートを作成しました。 このカテゴリのスラッグは「category-1」であるため、テーマのフォルダの下のファイルはcategory-CATEGORYSLUG.php
である必要があります。この場合、 category-category-1.php
です。
以下をcategory-category-1.php
ファイルに貼り付けてください。
<?php /*** Custom Category 1 Template */ get_header(); ?> <main role="main"> <section class="site-content"> <div role="main"> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h3 class="archive-title">Category: <?php single_cat_title( '', true ); ?></h3> </header> <?php while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; endif; ?> </div> </section> </main> <?php get_sidebar(); ?> <?php get_footer(); ?>
ループの前に、 have_posts
メソッドを使用して、ループで使用可能な投稿が他にあるかどうかを判断します。
the_post()
は、ループが投稿を繰り返し、WordPressに投稿配列の次の投稿に移動するように指示するために必要です。
この時点で、カテゴリのフロントエンドビュー( https://mycompanyname.com/category/category-1/ )は次のようになります。
このコードを使用することで、多くの投稿情報を含めることを怠ったことは知っていますが、この例では、シンプルに保ち、投稿のタイトルのみを表示することをお勧めします。
WordPressがこのビュー用に作成したクエリオブジェクトのプロパティを確認するには、 endif;
声明。
var_dump ( $wp_query->query_vars );
ページを更新すると、投稿リストの下に次の情報が表示されます。
array(63) { ["category_name"]=> string(10) "category-1" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["tag"]=> string(0) "" ["cat"]=> int(16) ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["post_type"]=> string(0) "" ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }
上記の投稿の下に「サービス」カテゴリに属する投稿のリストを表示するとします。 ページには現在のカテゴリのクエリオブジェクトがすでに作成されているため、既存のメインクエリ引数を操作してこれを回避する必要があります。
WordPressがこれを実現する方法を見てみましょう。
query_posts関数
query_posts()
関数は、WordPressが投稿を表示するために使用するメインクエリを変更する方法です。 これは、メインクエリを片側に配置し、それを新しいクエリに置き換えることによって行われます。 これは、紹介されているwp-includes/query.php
ファイルで確認できます。
function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); }
endwhile;
現在の標準ループの。
query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;
そして、あなたは行きます:
ただし、この方法には欠点があります。 クエリオブジェクトに含まれているカテゴリを印刷しようとすると、変更されていることがわかります。
var_dump ( $wp_query->query_vars["category_name"] );
を挿入してみてください。 サービスクエリの後、ページを更新します。 次の結果が表示されます。
string(8) "services"
これは、クエリが変更されたが元に戻されなかったために発生しました。 このアプローチは、クエリに続くコンテンツで多くの問題を引き起こす可能性があります。
これらの競合を回避し、 query_posts
を呼び出した後にクリーンアップするには、 wp_reset_query()
を呼び出すと、元のメインクエリが復元されます。 したがって、コードは次のようになります。
query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );
ページを更新すると、最初のページカテゴリがクエリに戻っていることがわかります。
string(10) "category-1"
最後に、 query_posts
は、実際にメインクエリが再度実行されるため、クエリにオーバーヘッドが追加されるため、回避する必要があることに注意してください。
get_posts()関数
get_posts()
関数を使用して、指定された基準に一致する投稿の配列を取得しても、同じ結果を得ることができます。
以下に示すサービスループを置き換えます…
query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );
…これで:
$my_query = get_posts( array ( 'category' => 17 ) ); foreach($my_query as $post) : setup_postdata($post); the_title( '<h4 class="example"></h4>' ); endforeach; var_dump ( $wp_query->query_vars["category_name"] );
今回ご覧のとおり、WordPressで定義されているget_posts()
引数に従って、カテゴリ名ではなくカテゴリIDを使用する必要がありました。
ここで注意すべきもう1つの重要な点は、クエリをリセットしなかったとしても、クエリカテゴリのvar_dump
出力はそのままで、「services」に変更されていないことです。 これは、 get_posts()
自体がメインクエリを変更しないためです。 新しい変数' $my_query
'を使用して、クエリオブジェクトを置き換えずに新しいインスタンスを作成しました。
get_posts()
関数はquery_posts()
と同じパラメーターを使用し、安全で使いやすいため、テンプレートの任意の場所に静的カスタムループを追加する場合に使用することをお勧めします。
新しいWP_Queryオブジェクトを作成します
$wp_query
はWP_Query
クラスのオブジェクトであり、現在のページに必要なデータベースコンテンツを取得します。 このクラスをオーバーライドすることで、結果をカスタマイズし、さまざまなコンテンツを表示できます。
これは、使用するコードの一部です。
$services_query = new WP_Query( 'category_name=services' ); if ( $services_query->have_posts() ) { while ( $services_query->have_posts() ) : $services_query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; } wp_reset_postdata(); var_dump ( $wp_query->query_vars["category_name"] );
'category_name'引数を使用して、投稿を表示するカテゴリのスラッグを定義しました。
新しいオブジェクトを保存しましたnew WP_Query( 'category_name=services' );
$services_query
変数内。
次に、whileループを使用して内容を表示し、その後、 wp_reset_postdata();
メインクエリの元のデータに復元するため。
WP_Query WordPressクラスの他の引数を試してみたい場合は、WordPressCodexページで完全なリストを見つけることができます。