Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

メインクエリとサブクエリで悩んでいるあなた(俺)へ捧ぐ

WordPressでサイト制作を必ず出会う言葉

メインクエリ・サブクエリ

今回の記事では、なんとなくの理解で使用しているメインクエリ・サブクエリについての理解を深めることを目的に記事執筆していきます。

メイン・クエリとサブクエリとは

メインクエリ・サブクエリを理解するために、まずはWordPressがどのような処理をどのような順番で行っているのかをみていきましょう!
名称未設定のアートワーク.png

1.PCからURLによって表示させたいページのリクエストをサーバーに送る
2.URLを受けて、サーバーからデータベースへ必要なデータを検索する。
 (固定ページのURLなら、固定ページの情報を検索。記事一覧のURLなら記事の情報を検索)
→このリクエストのことをメインクエリと呼ぶ
3.必要なデータをデータベースから抽出してまとめたものを、$wp_query(必要なデータをまとめたオブジェクト)を生成。
$wp_queryには様々な投稿情報が入っている
4.PHPで処理して表示

メインクエリのカスタマイズ

サーバーからデータベースへ必要なデータを検索する際に、カスタマイズするときにどう行うかをみていきます。
例えば、投稿記事を5件のみ取得したいときや、特定のカテゴリーのみ取得したいときといったケースがあげられます。

結論として、フックを使用することで可能になります。
フックを作動させることで検索をかける前に
投稿記事を3件のみ取得したいとき
特定のカテゴリーのみ取得したい
といったことを叶えることができるようになります。

フックを使うときにはpre_get_postsを使用しましょう。
https://cleysense.com/blog/how-to-use-pre_get_posts/
の記事が非常に参考になりました。

query_postでも可能のようですが、非推奨なのでやめておきましょう!
https://www.sejuku.net/blog/67035

投稿記事を5件のみ取得したいときに書くコードです。(codexより引用)

functions.php
function five_posts_on_homepage( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', '5' );
    }
}
add_action( 'pre_get_posts', 'five_posts_on_homepage' );

サブクエリとは

メインクエリでは取得できなかった情報をリクエストします。
($wp_queryでは取得できなかったもの)

同じページに、「新着ニュース」「制作実績」を二つ表示したいときにどうするかを考えていきます。
新着ニュースをデフォルトの投稿タイプ・制作実績をカスタム投稿タイプで表示させるケースでいくと、
ニュースがメインクエリで取得表示であれば、実績をサブクエリで取得・表示するようにします。

そして、サブクエリを取得する際のサンプルコードがこちらになります。

<?php
$args = array(
 'post_type' => 'works',
);
$the_query = new WP_query($args);
?>

https://esample.info/wp/402
の記事めっちゃ参考になりそうなので、置いておきます。

まとめ

メインクエリ・サブクエリ・フックなどよくわからない言葉だなぁっと思っていたんですが、
自分でまとめていくと理解できるようになりますね。

わたしが、崇拝しているアッキーさんの動画はめちゃくちゃ勉強になりますので
お時間あればみてみてください。
今回の記事は、ほぼほぼこちらの動画を参考にして執筆しました。
IMAGE ALT TEXT HERE

※YoutubeをQiitaに埋め込むのもちょっと手間でした。
こちらの記事を参考にしてみてください。
https://qiita.com/tnarihi/items/762b6ba4ac0a160eef5b

OKALOG_info
知多半島でWebフリーランスをしています。 勉強の毎日です。
http://okalog.info/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away