Codeworks Notes

 2019-08-19

 2020-02-10

Wordpress
バックエンド

記事の一覧を作る

条件指定して記事一覧を作る場合に ループ というものを使います。

ループって何

平たく言うとデータベースから条件に合わせて記事データを拾ってくる仕組みです。ループには メインループサブループ があります。

メインループとは

URLによって取得する内容が決まるタイプの呼び出しかたです。
投稿ページの呼び出しなどでよく使われます。

<?php
if ( have_posts() ):
  while ( have_posts() ): the_post();
    the_title();
    the_content();
  endwhile;
endif;
?>

サブループとは

URL依存せずに取得できる記事の呼び出しかたです。
複数条件を付けながら呼び出します。

サブループは WP_Queryget_posts() を使って条件を指定してから記事を取得します。これらの違いについては後述します。

get_posts() を使ったループの作り方

以下の書き方で取得します。下記条件は一例です。
増やしたい条件があれば追加し、絞りたくない条件は削るかコメント化します。
また、件数が多いときはページネーション(ページャー )を設けるとより親切です。

<?php
// 条件の指定
$my_posts = get_posts(array(
    'post_type' => 'post', // 投稿タイプ
    'category' => 1, // カテゴリIDを番号で指定する場合
    'category_name' => 'スラッグ', // カテゴリをスラッグで指定する場合
    'tag_id' => 1, // タグIDを番号で指定する場合
    'tag'    => 'タグ', // タグをスラッグで指定する場合
    'posts_per_page' => 20, // 表示件数
    'orderby' => 'date', // 表示順の基準
    'order' => 'ASC' // 昇順・降順 (ASC / DESC)
));
global $post;

// ループの指定
if($my_posts): foreach($cat_posts as $post): setup_postdata($post);
 
/*---- Loop start ----*/
?>

<h2><?php the_title(); ?></h2>
<p><?php the_content(); ?></p>

<?php
/*---- Loop end ----*/
endforeach;
wp_reset_postdata();

else: // マッチする記事が1件もない場合
?>

<p>お探しの記事は見つかりませんでした。</p>

<?php endif; ?>

WP_Query を使ったループの作り方

以下の書き方で取得します。

<?php
// 条件の指定
$args = array(
    'post_type' => 'post', // 投稿タイプ
    'category' => 1, // カテゴリIDを番号で指定する場合
    'category_name' => 'スラッグ', // カテゴリをスラッグで指定する場合
    'tag_id' => 1, // タグIDを番号で指定する場合
    'tag'    => 'タグ', // タグをスラッグで指定する場合
    'posts_per_page' => 20, // 表示件数
    'orderby' => 'date', // 表示順の基準
    'order' => 'ASC' // 昇順・降順 (ASC / DESC)
);

// クエリの取得(インスタンス化して取得する)
$the_query = new WP_Query( $args );

// ループの指定
<?php if ( $the_query->have_posts() ) : ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

/*---- Loop start ----*/

<h2><?php the_title(); ?></h2>
<p><?php the_content(); ?></p>

/*---- Loop end ----*/

<?php
endwhile;
wp_reset_postdata();

else : // マッチする記事が1件もない場合
?>
<p>お探しの記事は見つかりませんでした。</p>

<?php endif; ?>

WP_Query と get_posts()の違い

WP_Query はアーカイブや検索結果を取得するなどの条件に対して投稿を取り出します。get_posts() も投稿の取り出しができますが、大きく違うことはWP_Query のほうは取得条件と結果を 再利用できる というところです。
(つまり再利用しないページばかり作って済む場合は厳密に区別しなくても困らない)

WP_Queryget_posts() はそれぞれオブジェクトとして扱うか配列として扱うかの違いがあります。get_posts() が記事を直接配列として取得するのに対し、WP_Query は new WP_Query( $args ) でインスタンス化し、そこから記事を取得します。

get_posts() と決定的に違うのはこの部分です。
get_posts() は配列を取り出し終わったらおしまいなので取得結果しか扱えません。対して WP_Query は取得条件と結果の両方を保持しているので、wp_reset_postdata() でリセットするまでインスタンスを再利用することができます。

wp_reset_postdata(); の役割

WP_Query でもget_posts() でもループの終了時に実行しています。
この関数はサブループによって置き換えられたインスタンスをメインループに戻してくれます。

ここでいう WP_Query インスタンス$GLOBALS['wp_query'] のことをいいます。
サブループは $GLOBALS['wp_query'] が所有する post プロパティを上書きしますので、この post プロパティを $GLOBALS['post'] に戻すのが wp_reset_postdata() の役割です。