wordpress ループの書き方・使い方まとめ

Pocket

wordpressのブログを作るのに必ず必要になるのがループ。ブログを書いてるだけならそれほど重要じゃないからと、よくある定型文を使っている方も多いと思います。

でもループの使い方をマスターすればwordpressのデータベースからどんな情報でも簡単に引き出すことができるため、より自由度の高いコンテンツの表示が可能になります。

カテゴリ、タグ、投稿者情報の取得方法はこちら。ループ中やループ外でそれぞれの情報を取得、出力する方法をまとめたので是非こちらもご覧下さい。

ループって何?

より詳しい情報については公式codexのこちらをご覧下さい。ここではざっくりと簡単に説明したいと思います。

wordpressのループは一言で言ってしまえば繰り返し処理です。データベースからテンプレートに送られてきたデータをテンプレートタグを使って表示することができます。

データベースの各カラム(記事のIDやタイトル、投稿者名など)のデータはテンプレートタグを使って取得します。テンプレートタグには以下のようなものがあります(その他はcodex参照)。

//投稿(記事)のURLを取得して出力
<?php the_permalink(); ?>

//投稿(記事)のタイトルを取得して出力
<?php the_title(); ?>

//投稿(記事)の本文を取得して出力
<?php the_content(); ?>

//投稿(記事)のカテゴリー名を取得して出力
<?php single_cat_title(); ?>

テンプレートにデータが送られてきたら、ループを回してテンプレートタグを必要な場所に設置し、データを表示させるというわけです。

また、wordpressには一般的なテンプレートタグの他に、条件分岐や様々な処理ができる関数が用意されておりこれらも駆使しながらwebサイトと作っていくことになります。

基本的なループの使い方

では最初に基本的なループの使い方から確認していきます。while文の定型文としてよく使うのがこちら。

//テンプレートに送られてきたデータがあればループ処理
//データがなければ記事がないことを表示
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>

//ここにループの中身

<?php endwhile; // end of the loop. ?>

//pagenationなどの設置

<?php else: ?>

//記事がない場合に表示
  <?php _e('記事が見つかりませんでした。'); ?>

<?php endif; ?>

while文以外にもforeachを使ってループを書くこともできます。

<?php $my_posts = get_posts(); ?>
<?php foreach ( $my_posts as $post ) : setup_postdata( $post ); ?>

//ここにループの中身

<?php endforeach;  wp_reset_postdata(); ?>

ループの条件設定方法

先ほどのコードでループを使えるようになるのですが、このままでは全てのデータを出力することになります。そこで、覚えておきたいのがループの条件設定について。

ループを開始する前に条件設定や条件分岐などを使って様々なデータの取得、出力方法を実装することができるようになります。

データを取得するためのタグはget_posts()とWP_Query()があります(query_posts()は省略)。2つの違いはget_posts()の方は表示数や順序、カテゴリーの指定などテンプレートで表示するデータを制御するもの。WP_Query()はより複雑な条件でデータを取り出すことが可能、といった感じ(例えば特定日時の記事だけ取得など。get_posts()では順序の指定のみ可能)。

get_posts()の使い方

ではget_posts()の使い方を見ていきます。

//パラメータの設定、必要なものだけ設定。以下はデフォルト
<?php $args = array(
  'posts_per_page'   => 5,
  'offset'           => 0,
  'category'         => '',
  'orderby'          => 'post_date',
  'order'            => 'DESC',
  'include'          => '',
  'exclude'          => '',
  'meta_key'         => '',
  'meta_value'       => '',
  'post_type'        => 'post',
  'post_mime_type'   => '',
  'post_parent'      => '',
  'post_status'      => 'publish',
  'suppress_filters' => true ); ?>

//条件をセット
<?php $myposts = get_posts( $args ); ?>
<?php foreach ( $myposts as $post ) : setup_postdata( $post ); ?>

<li>
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
  </li>

<?php endforeach; wp_reset_postdata(); ?>

WP_Query()の使い方

次にWP_Query()の使い方。こちらはさらに細かい条件を設定することが可能です。全て書き出すのは大変なので、設定できる条件については公式codexのこちらをご覧下さい。

<?php 
//条件のセット
$the_query = new WP_Query( $args ); ?>

<?php if ( $the_query->have_posts() ) : ?>
  <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

//ループの中身

<?php endwhile; wp_reset_postdata(); ?>

<?php else:  ?>

<?php _e( 'Sorry, no posts matched your criteria.' ); ?>

<?php endif; ?>

query_posts()を使わない理由

データの取得にはquery_posts()というタグもあるのですが、公式codexのこちらにあるように使うには注意が必要とのことです。

wordpressのテンプレートは読み込まれた時点ですでにデータを取得し終わっているため、query_psots()を使うことで再読み込みが発生。サイトのパフォーマンスに影響が出る可能性があり、基本的には上で紹介した2つのどちらかを使うとよいということです。

ただ個人のブログレベルではそれほど気にする必要はないかも、とも書かれているので使ってしまっても良いのかもしれませんね。

さいごに

この記事ではループの使い方、書き方と題してループについて紹介しました。基本的な使用方法はこちらで紹介した通りですが、さらに条件分岐や、条件設定を駆使していろんな形でデータを表示することができます。

また、カテゴリー、タグ、投稿者情報の取得に関しては以下でまとめたのでそちらも合わせてご覧下さい。

最後までご覧いただきありがとうございました。