🤔

【WordPress】WP_Queryを理解する

2022/06/20に公開

はじめに

雰囲気で使ってきたWP_Queryを整理し、理解するための記事です。

WP_Queryとは

WP_Query は wp-includes/class-wp-query.php に定義されているクラスで、WordPress ブログへの複雑な投稿やページのリクエストを取り扱います。 wp-blog-header.php (バージョン 2.0 では WP クラス) が $wp_query オブジェクトに現在のリクエストを定義する情報を与えることで、$wp_query はどのタイプのクエリを扱っているのか (カテゴリーアーカイブ、年月別アーカイブ、フィード、検索など) を確定し、要求された投稿を取り出します。$wp_query はリクエスト上の情報を多く保持していて、後からでも利用することができます。

要するに...

  • 定義済みのクラス
  • wp-blog-header.php が$wp_query オブジェクトにリクエスト情報を与え、要求された投稿を取り出す

といったところでしょうか?
WP_Queryにリクエスト情報を与えることで、通常のクエリと異なる情報を取り出せます。

使用ケース

通常のテンプレート構成で取得されるクエリではなく、条件分岐や別途ループを作成、出力したい場合に使用します。

例:

  • 固定ページ内に記事一覧を表示する
  • 投稿ページに関連記事を表示する

基本形

<?php

// クエリを指定
$the_query = new WP_Query( $args );

// ループ処理
if ( $the_query->have_posts() ) {
	echo '<ul>';
	while ( $the_query->have_posts() ) {
		$the_query->the_post();
		echo '<li>' . get_the_title() . '</li>';
	}
	echo '</ul>';
	/* メインクエリの$postグローバル変数をリセット */
	wp_reset_postdata();
} else {
	// 投稿が取得できない場合の処理
}

よくやる使い方

カスタム投稿の一覧を取得

個人的によくあるのは、カスタム投稿を一覧取得するケースですね。


// クエリを指定
<?php
    //取得する投稿のパラメーターを配列で指定
    $args = array(
        'post_type' => 'hogehoge', //カスタム投稿タイプを指定
        'posts_per_page' => 10,
    );
    $the_query = new WP_Query($args);
?>

// ループ処理
<?php
    if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
?>
    <li class="loop-item">
        <p><?php the_field('カスタムフィールドID'); ?></p>
    </li>
<?php
    endwhile;
    endif;
?>
// メインクエリの$postグローバル変数をリセット
<?php wp_reset_postdata(); ?>

最後に

パラメーター取得の部分は、公式ドキュメントを見ていただくと確認できると思います。
個人的には配列指定のところを雰囲気でやってたので、ドキュメントを確認することで何をやってるかが理解できました。

参考記事

https://wpdocs.osdn.jp/関数リファレンス/WP_Query

Discussion