y.o.designers-works

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=&quot;<?php the_permalink(); ?>&quot;><?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のカスタマイズで基礎となる部分ですので、しっかり身につけておきたいですね。

参考にさせて頂いたサイト

スポンサーリンク

他にオススメな記事