WordPressでのサイト制作を行っていると、新規のサイト制作もあれば改修案件で人のコードを書き換えることがあります。その際に、投稿のループ処理について自分が普段使うループ処理とは異なるループ処理が書かれており、結局何を使えばいいのかっていうのがよく分からなくなったので、一度整理します。
そもそもループって
偉大なるCodexでの説明
「ループ」は、WordPress の投稿を表示するために使われるPHPコードです。このループを使えば、現在のページに表示される各投稿を処理したり、ループタグ内で指定された条件に沿って投稿の形式を整えたりできます。
投稿をwhileループで回して表示させているって考えてもらえばいいかなと思います。
ループの種類
1.メインループ
メインループとは、メインクエリから得られた投稿郡をループさせる処理の記述になります。
通常投稿記事をループさせるときに使用。
<?php
//記事があればentriesブロック以下を表示
if (have_posts() ) : ?>
<!-- entries -->
<div class="entries">
<?php
//記事数ぶんループ
while ( have_posts() ) :
the_post(); ?>
//ここに記事を投稿
<?php
endwhile;
?>
</div><!-- /entries -->
<?php endif; ?>
2.サブループ(WP_Query)
ここから、メインクエリとは異なる投稿群をループさせる処理になります。
とりあえずサブループではWP_Query
を使用すれば間違いないかなって思ってます。ご指摘あれば教えて頂きたい。。
<?php
//$argsのプロパティを変えていく
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'no_found_rows' => true, //ページャーを使う時はfalseに。
);
$the_query = new WP_Query($args);
if ($the_query->have_posts()) :
while ($the_query->have_posts()) : $the_query->the_post();
/* ループ内の記述 */
endwhile;
endif;
wp_reset_postdata();
?>
こちらのサイトから拝借。非常にまとまっていて分かりやすい。
https://wemo.tech/160
3.サブループ(get_posts)
クエリにマッチしたすべてのデータが格納された配列を返す関数になります。
get_posts関数
は単に情報を取得するだけでグローバル変数には影響を与えないが、後述するquery_posts関数
はグローバル変数の$wp_query
を使用し、$post
などの関連する情報も更新される。
WP_Query
の方が取得できる情報が多いのでこれを使う機会がイマイチ分かりません。
こちらの記事に綺麗にまとまっています。
https://www.m-hand.co.jp/program/4119/
ちなみに、foreach
が使われている改修案件で初めてget_posts
の存在を知りました。
<ul>
<?php
// get_posts()のパラメータを指定
$args = array(
// 記事を3件表示
'posts_per_page' => 3,
// 記事をランダムで表示
'orderby' => 'rand'
);
// パラメータに基づいた投稿データの配列を取得
$my_posts = get_posts( $args );
// ループ開始
foreach ( $my_posts as $post ) :
// サブループの投稿データをセット
setup_postdata( $post );
?>
<li>
<a href="<?php the_permalink(); ?>">
<h2><?php the_title(); ?></h2>
<?php the_content(); ?>
</a>
</li>
<?php
endforeach;
//ループ終了
// メインクエリの投稿データに戻す
wp_reset_postdata();
?>
</ul>
4.query_posts() 非推奨
こちらは、メインクエリを変更するためのものです。テーマから読んでしまうと意図しない動作が発生する可能性が高いとのこと。
メインクエリをカスタマイズする際には、pre_get_posts
を使ってメインクエリ実行前に差し込めるアクションフックがあるので、これを使った方がいいですね。
まとめ
とりあえずいろいろなループの方法があるのを知っておくことが大切かなと思いました。
自分が実装するときには、テンプレートをつくって毎回使い回す、既存サイトを改修の際に普段使わないループ処理があっても焦らない。これでいきましょう!!