NOTE

【WordPress】ループの種類や特性、記述方法をざっくりに解説します

2021/2/2

2021/2/20

305 view

  【WordPress】ループの種類や特性、記述方法をざっくりに解説します

ワードプレスを自作する上で”ループの関数“は肝ですが、実際あまり理解せずに使っている人も多いと思います(私も含め)。
今回は、ループについて今一度調べたので、初級者向けといった内容でループについてざっくり解説をしておこうと思います。

“ざっくり”に説明にするわけ

ループについて完全に理解するのはちょっと大変!?

ループについてあれこれ検索してみると、とても詳しく解説されているサイトはけっこうありました。
しかし、それらの詳細な仕組みはプログラマー畑でないウェブデザイナーにとって完全に理解するには少し難しいものでした。

まずは要点を押さえておこうと思うよ

やはりそれらを完全に理解しようとなると結構な勉強が必要と感じました。
そこでまずは、分かってきた範囲で最低限のことを押えて、とりあえず実践向けとして要点のメモを記しておくのが今回の目的です。
なので、この記事の内容は自分用に超ざっくり砕いての解説記事となっています。

もし誰かのお役に立てれば・・・うれしい

しかしながら、WordPress初級者さんやこれから勉強しよう人にとってはもしかしたら少しお役にたてるかもしれません(苦笑)
そうであればちょっとうれしいです。

では、以下本題です。

覚えるループは3種類でOK!

まず、覚えるべきループは3つでOKです!
それは、

the_post()」(ざ ぽすと)

WP_Query」(だびゅるぴー くえり)

get_posts()」(げっと ぽすとす)

の3つです。とりあえずこれだけ覚えておけばOKです。
実は、query_postsというのもあるのですがこれは非推奨ということで省きます。

1. 「the_post()」の特性と記述方法は?

the_post()の特性や要点

メインループとよばれるものです

1ページ内に使うのは基本1回

表示中の記事のコンテンツを表示するときに使う

whileで回し、クエリのリセットは不要

もう少し詳しく

もう少し説明を加えると、WordPressの機能によって表示中のページのテンプレート毎によって自動で取得してくるデータのメインループというものを利用しています。

主な使用箇所

表示中の投稿のタイトルや本文、カテゴリーアーカイブでの記事一覧の取得など

the_post()の記述方法

<?php if (have_posts()): ?>
<?php while (have_posts()) : the_post(); ?>
<h1><?php echo get_the_title(); ?></h1>
<p><?php echo get_the_date(); ?></p>
<div><?php the_content(); ?></div>
<?php endwhile; ?>
<?php endif; ?>

もっとも見慣れているコードだと思います。
if分で格納されたページのデータ(クエリ)があるかどうかを判別し、あるならそれを取得してきます。

2.「WP_Query」の特性と記述方法は?

WP_Queryの特性や要点

サブループというものです

関連記事などのループはこれでもほぼOK

細かい条件指定やデータの抽出も可能

whileで回し、wp_reset_postdata()でリセットさせる

もう少し詳しく

もう少し説明を加えると、サブループというものを作るものになります。
サブループとはWordPressが自動でデータを取得するメインループとは違い、表示するテンプレートに関係なく指定した条件でループを行うというものになります。

主な使用箇所

関連記事や人気記事の一覧など

WP_Queryの記述方法

<?php
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 20,
);
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
?>
<h1><?php echo get_the_title(); ?></h1>
<p><?php echo get_the_date(); ?></p>
<?php endwhile; endif; ?>
<?php wp_reset_postdata(); ?>

the_post()となんとなく似ています。

3.「get_posts()」の特性と記述方法は?

get_posts()の特性や要点

サブループというものです

WP_Queryとほとんど同じ兄弟分

WP_Queryより簡易な内容のループに最適

・foreachで回し、wp_reset_postdata()でリセットする

もう少し詳しく

もう少し説明を加えると、WP_Queryと同じサブループを作れます。
ただ、WP_Queryより細かい条件や設定はできないものになります。
記事のただのタイトル一覧だけを表示するようなシンプルなものに適しています。

主な使用箇所

見出しと日付だけのお知らせの新着一覧など

get_posts()の記述方法

<?php
$args = array (
    'post_type' => 'post',
    'posts_per_page' => 20,
);
$myposts = get_posts( $args );
?>
<?php foreach( $myposts as $post ): setup_postdata($post); ?>
<h1><?php echo get_the_title(); ?></h1>
<p><?php echo get_the_date(); ?></p>
<div><?php the_content(); ?></div>
<?php endforeach ;?>
<?php wp_reset_postdata(); ?>

whileの代わりにforeachを使っているのが特徴です。

ついでに「pre_get_posts」というアクションフックも

ループの種類の解説は以上なのですが、「pre_get_posts(ぷれ げっと ぽすと)」というアクションフックの存在も覚えておくとさらに上級者へと近づきます。

アクションフックとは?

アクションフックとは、WordPressがデータベースにデータを取りにいく段階であれこれ注文を指定できる指示のようなもの(だぶん)です。

pre_get_postsって何してくれんの?

pre_get_postsは、メインループの動きにアクションフックを付けれます。
つまり、上記で紹介した「the_post()」をカスタムできるものと思ってください。
サブループの「WP_Query」と「get_posts()」は関係ありません。

pre_get_postsはどんな時に使う?

では、pre_get_postsはどんなときに使うのでしょうか?
それは、メインループの種類によって何か指示を与えたいときです。
使われるケースの事例などでいえば、「記事一覧は最大表示20件だけどカテゴリー一覧ページでは最大表示を10件にしたい」や、「検索結果ページで特定のカテゴリーの記事を除外したい」場合などです。

pre_get_postsの使い方と記述方法

重要なのが、pre_get_postsは「function.php」に記述するということです。
以下は、function.phpの記述例です。

/* メインクエリの書き換え(各ページのループ) */
function custom_query($query) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    //カテゴリーアーカイブページへのフック
    if ( $query->is_category()) {
        $query->set('posts_per_page', 10); // 最大表示を10件に
        $query->set('orderby', 'date'); // 日付で並び替える
    }
    // 検索結果ページへのフック
    if ( $query->is_search() ) {
        $query->set('cat', -5); // カテゴリーID5に属する記事を除外
    }
}
add_action('pre_get_posts', 'custom_query');

後は、category.phpなどのテンプレートファイルでthe_post()を実行したときに反映されます。

<?php if (have_posts()): ?>
<?php while (have_posts()) : the_post(); ?>
<p><?php echo get_the_title(); ?></p>
<p><?php echo get_the_date(); ?></p>
<?php endwhile; ?>
<?php endif; ?>

なぜpre_get_postsを使うのか?

function.phpをいじってまで、なぜわざわざpre_get_postsを使うのか?これを理解することは肝で、これを理解すれば頭が整理できると思います。以下説明です。

まず、細かな指示を与えたいループならメインループの「the_post()」を使わずに、サブループの「WP_Query」と「get_posts()」を使っても同じことができます。
しかし、category.phpやsearch.phpといったテンプレートファイルを読み込むときには、WordPressが自動でメインループのデータ(クエリ)を1回読み込んできます
なので、サブループを使うとわざわざ取ってきたデータを無視して、さらにもう一回データベースを読み込むことになります。

つまり、データベースをもう1回読み込むという無駄な動作が重複することなります。
そのことはサーバーへ負荷をかけるだけでなく、サイト表示も遅延させます
それらを避けるというのがpre_get_postsを使う理由になります。

まとめ

以上、ループの種類や特性、記述方法のざっくりした解説でした。
もしかしたら間違っていることもありますので、ご理解ください。
何かお気づきのことがあればお気軽にコメントください。

この記事へのコメント

  • まだ書き込みはありません

コメントを残す



関連記事

ページの先頭に戻る