WordPressループのメインクエリとサブクエリについて

メインクエリ–main query
WordPressのコアAPIでは、URLリクエストに応じて必要な記事データを取得するクエリが発行されて、取得されたデータが $wp_query というグローバル変数に格納されます。
ここまでを自動的に行なう。この自動的に発行されるクエリを、メインクエリまたはメインループと呼びます。
メインクエリを出力する場合は、すべてのテンプレートで共通のループ構文を記述すればいいことになります。
メインクエリの書き方
<?php if (have_posts() ) : ?> <?php while (have_posts()) : the_post(); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endwhile; ?> <?php else : ?> Not Found. <?php endif; ?>
まず1行目の
<?php if (have_posts() ) : ?>
ですが、「have_posts()」関数で、現在のクエリにループできる結果があるかどうかをチェックします。
そして2行目の
<?php while (have_posts()) : the_post(); ?>
でループを次の投稿へ進めます。 次の投稿を取得して表示しましょうという感じです。
そして3行目の
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
ですと、各記事のタイトルを「h2」タグでマークアップし、をリンク付きで出力しましょうという記述です。
4行目の
<?php endwhile; ?>
で表示できるデータが無くなり、ループ処理の終わりである事を宣言します。
5行目の
<?php else : ?>
では、現在のクエリにループできる結果が無い場合という記述です。
6行目の
Not Found.
はループで出力できるデータが無いに出力する内容になります。
7行目の
<?php endif; ?>
で「if」文の終わりである事を宣言します。
サブクエリ–sub query
メインクエリで取得される記事データとは別のデータを取得したい場合、自前でクエリを発行する。
この自前で発行するクエリを、サブクエリまたはサブループと呼ぶ。
サイドバーに記事一覧を表示したり、トップページに post_type=$post_type(カスタム投稿タイプ) の記事一覧を表示したいときなどに使う。
サブクエリの発行方法は2種類。
いずれも引数はほぼ同じなので、単純に記事データ(メタデータも含む)だけが必要であればどちらを使っても問題はない。
1. WP_Queryクラスを使う
<?php $args = array( 'post_type' => '$post_type', ); ?> <?php $query = new WP_Query( $args ); ?> <?php if( $query->have_posts() ) : ?> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endwhile; wp_reset_postdata(); ?> <?php else : ?> Not Found. <?php endif; ?>
$post_typeにポストタイプを指定する
2. get_posts関数を使う
<?php $args = array( 'post_type' => '$post_type', ); ?> <?php $nicename_posts = get_posts( $args ); ?> <?php if( !empty( $nicename_posts ) ) : ?> <?php foreach( $nicename_posts as $post ) : setup_postdata( $post ); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endforeach; wp_reset_postdata(); ?> <?php else : ?> Not Found. <?php endif; ?>
$post_typeにポストタイプを指定する
まとめ
WordPressのカスタマイズで基礎となる部分ですので、しっかり身につけておきたいですね。