WordPressの仕組みついて


こんにちわ。泉原です。今回はWordPressの仕組みとメインループ、サブループについて解説したいと思います。対象はWordPressでサイトを作成したいと思っている方や、仕組みを理解したい方向けです。噛み砕いて記事を書いています!分からない点などあればお気軽にTwitterにDM(リンク)下さい!それでは本編に入ります。
リクエストとレスポンスでサイトを表示させている
リクエストとレスポンスを行ってサイトを表示させています。ユーザーが閲覧したいページのURLをリクエストして、WordPressが情報をレスポンスします。それぞれ矢印の向きに情報を渡しています。非常にシンプルですよね?
リクエスト
レスポンス
3人の登場人物が出てきます。ユーザーとWordPressとデータベースです。ユーザーは説明しなくても大丈夫だと思います。サイトを閲覧したい人ですね。WordPressはHTMLを作成したりサイトの仕様を決めています。最後はデータベースです。投稿された記事やユーザー情報などを保管しています。それでは、もう少し具体的に見ていきます。
リクエスト
-
ユーザーはURLをクリックして、WordPressがURLを解析します。
-
表示に必要な情報をデータベースに問い合わせします(クエリを要求)
このような感じです。2番目のクエリを要求について補足しておきます。クエリとはデータベースにデータを要求することです。例えば、お知らせ一覧の記事が必要なら、記事をデータベースに問い合わせします。 何を問い合わせるかはユーザーがどんなページを見たいかによります。 ページによってWordPressが自動的にデータベースにクエリを要求します。次にレスポンスです。
レスポンス
-
データベースからデータが返却されます。
- データは
$wp_query
と呼ばれるグローバル変数に代入されます。
- データは
-
WordPressがデータを加工して、ユーザーに返却します。
-
ユーザーがサイトを閲覧出来ます。 以上がリクエストとレスポンスになります。1番の返却されたデータは
$wp_query
と呼ばれるグローバル変数に代入されている点を抑えておいて下さい。それでは次にメインループとサブループを解説します。
メインループはテンプレートに応じてクエリを要求する
メインループはテンプレートに応じて、必要な情報を繰り返し処理をします。メインクエリとは上で説明した通り、ユーザーがページを閲覧するために必要なデータをデータベースに要求することです。例えば、トップページなら投稿記事が返却されます。カテゴリーページなら、カテゴリーに紐付いているページのデータを返却します。
メインループのコード
<?php if(have_posts()): ?>
<?php while(have_posts()): ?>
<?php the_post(); ?>
<!-- 繰り返し処理する内容 -->
<?php endwhile; ?>
<?php else: ?>
<!-- 投稿データが取得できない場合の処理 -->
<?php endif; ?>
コードの解説とグローバル変数について
それぞれのコードの意味は以下のとおりです。
if(have_posts())
投稿があるかどうか調べます。投稿があれば次に進みます。while(have_posts())
投稿があれば繰り返し処理するthe_post()
は次の投稿を取得して,$post
変数に代入する
このような動きをしています。3番目のthe_post()
メソッドは取得したデータを$post
に代入されています。レスポンスの1番で見たように返却されたデータは$wp_query
に代入されています。このデータは膨大で投稿記事だけを編集したいときに不便です。なので、現在の投稿は$post
に代入するような動きになっています。
サブループは自分で取得したいデータを決める事が出来る
サブループはメインループと違って自分で取得したいデータを決める事が出来ます。メインループはWordPress側で決められているテンプレートによってデータを取得するんでした。それでは固定ページなどで投稿の記事をランキング形式で取得したり、カスタム投稿タイプの記事を取得することが出来ません。そこでサブループを使用します。
サブループのコード
<?php
$news_query = new WP_Query(
array(
'post_type' => 'post',
'category_name' => 'news',
'posts_per_page' => 5,
)
);
?>
<?php if ( $news_query->have_posts() ) : ?>
<?php while ( $news_query->have_posts() ) : ?>
<?php $news_query->the_post(); ?>
<p><?php the_title(); ?></p>
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
<?php get_footer(); ?>
サブループとメインループの大きく違うところは$news_query
となっているところです。arry()の中で条件を決めて、$news_query
にオブジェクトを代入しています。
サプループの条件は以下の通りです。
post_type
=> 投稿タイプは「投稿」category_name
=> カテゴリースラッグは「news」posts_per_page
=> 取得するデータの数は「5」wp_reset_postdata()
はその名の通りWordPressの投稿データをリセットするメソッドです。the_post()
を実行すると$post
に現在の投稿が追加されます。これをメインクエリの投稿情報に戻すために実行しています。
なぜサブループには$news_queryと書かれているの?
これは$news_query
オブジェクトのhave_posts()メソッド
にアクセスしているからです。意味わからないですよね。オブジェクトは関数(メソッド)やプロパティー(データの値)などを保持しています。オブジェクトの中にあるメソッドにアクセスするときは->
と書きます。JavaScriptのconsole.log()とかと同じですね。consoleオブジェクトの中にあるlog()メソッドにアクセスしてブラウザで値を確認することが出来ます。JavaScriptだと.
がそれに当たります。
ではなぜメインループでは書かれてないの?と思いませんか?これは省略出来るんです。メインループだと取得したデータは$wp_query
に格納されます。なので
以下のように書き直しても正しく動きます。
メインループのコード(省略無し)
<?php if($wp_query->have_posts()): ?>
<?php while($wp_query->have_posts()): ?>
<?php $wp_query->the_post(); ?>
<!-- 繰り返し処理する内容 -->
<?php endwhile; ?>
<?php else: ?>
<!-- 投稿データが取得できない場合の処理 -->
<?php endif; ?>
ざっくりとメインクエリとサブループの違いは理解しましたか?実際にlocalなどのアプリを使ってコードを書いてみて、違いを見てみると理解が深まると思います。それではありがとうございました!