WordPress 基本的なループの表示方法を紹介

Last update 
/ Posted by Takumi Hirashima

WordPress 基本的なループの表示方法を紹介

WordPress で投稿を表示するための基本的なループの表示方法を紹介します。
ループは大きく分けてメインループとサブループの二つがありますが、この投稿では主にサブループの表示方法を紹介していきます。

  1. メインループの表示方法
  2. サブループ(カスタム投稿タイプ)の表示方法
    1. 投稿の表示件数を制御する方法
    2. タクソノミーのターム別に絞り込む方法
    3. 特定の記事を除外する方法
    4. 投稿の並び順を指定する方法
    5. 現在表示している記事を除外して同じカテゴリの記事をランダムに表示する方法
    6. 記事数を取得する方法
  3. 固定ページの内容をトップページなどに表示させる方法

メインループの表示方法

メインループは投稿を表示するために使用します。一つのテンプレートファイルで使用できるメインループは一回までです。
次のコードを投稿を表示させたいテンプレートファイルに追加します。

<?php if (have_posts()): ?>
<?php while (have_posts()) : the_post(); ?>
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php echo get_the_date(); ?>
<?php the_permalink(); ?>
<?php echo get_the_title(); ?>
<?php the_content(); ?>
</div>
<?php endwhile; ?>
<?php else: ?>
<!-- 投稿が無い場合の処理 -->
<?php endif; ?>

必ず投稿がある場合は、次のようにコードを省略することもできます。

<?php while (have_posts()): the_post(); ?>
<!-- 中略 -->
<?php endwhile; ?>

サブループ(カスタム投稿タイプ)の表示方法

サブループはメインループとは別にループを作りたい時に使用します。
カスタム投稿タイプ Products の投稿を表示する場合、次のコードをテンプレートファイルに追加します。

<?php 
  $args = array( 'post_type' => 'Products' );  // カスタム投稿タイプ Products
  $the_query = new WP_Query($args); if($the_query->have_posts()): 
?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php echo get_the_date(); ?>
<?php the_permalink(); ?>
<?php echo get_the_title(); ?>
<?php the_content(); ?>
</div>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<!-- 投稿が無い場合の処理 -->
<?php endif; ?>

サブループはメインループと違い、ループの終わりにクエリをリセットする必要があります。
そのため、endwhile(ループの終わり) の後に wp_reset_postdata(ページ送り関数) を追加してクエリをリセット、直前のクエリを復元します。

そもそも、メインループ(メインクエリ)とサブループ(二番目のクエリ)は次のように違いがあります。
メインループは、URL によるリクエストに基づいたクエリが、テンプレートが読み込まれる前に実行されるのに対して、サブループはテーマのテンプレートやプラグインのファイルの中で実行されるます。そのためサブループを実行後は、サブループがクエリを上書くためメインクエリを復元してあげる必要があります。

投稿の表示件数を制御する方法

表示件数を制御する場合は posts_per_page を追加します。
例えば、投稿を5件だけ表示したい場合は ‘posts_per_page’ => 5 と指定します。

<?php 
  $args = array( 
    'post_type' => 'Products', // カスタム投稿タイプ Products
    'posts_per_page' => 5 // 投稿を5件表示
  ); 
  $the_query = new WP_Query($args); if($the_query->have_posts()): 
?>
<!-- 以下省略 -->

全件表示したい場合は ‘posts_per_page’ => -1 と指定します。

タクソノミーのターム別に絞り込む方法

カスタム分類(タクソノミー) Products-cat のターム item1 で絞り込む場合は tax_query を追加します。

<?php 
  $args = array( 
    'post_type' => 'Products', // カスタム投稿タイプ Products
    'tax_query' => array( 
      array( 
        'taxonomy' => 'Products-cat', // カスタム分類 Products-cat
        'field' => 'slug',
        'terms' => 'item1', // ターム item1 で絞り込む
      ) 
    ) 
  ); 
  $the_query = new WP_Query($args); if($the_query->have_posts()): 
?>
<!-- 以下省略 -->

特定のタームを除外する場合は ‘operator’ => ‘NOT IN’ を追加します。

<?php 
  $args = array( 
    'post_type' => 'Products', // カスタム投稿タイプ Products
    'tax_query' => array( 
      array( 
        'taxonomy' => 'Products-cat', // カスタム分類 Products-cat
        'field' => 'slug',
        'terms' => 'item1', // ターム item1 で絞り込む
        'operator' => 'NOT IN' // item1 を除外する
      ) 
    ) 
  ); 
  $the_query = new WP_Query($args); if($the_query->have_posts()): 
?>

特定の記事を除外する方法

特定の記事を除外する場合は post__not_in を追加します。
例えば、記事ID 11,22,33,44,55 を除外する場合はこちら。

<?php 
  $args = array( 
    'post_type' => 'Products',
    'post__not_in' => array( 11,22,33,44,55 ) 
  ); 
  $the_query = new WP_Query($args); if($the_query->have_posts()): 
?>

現在表示しているページを除外する場合は post__not_in に $post->ID を指定します。

<?php 
  $args = array( 
    'post_type' => 'Products',
    'post__not_in' => array($post->ID) 
  );
  $the_query = new WP_Query($args); if($the_query->have_posts()): 
?>

投稿の並び順を指定する方法

最低から最高へ昇順で並び変える場合は ‘order’ => ‘ASC’ を指定します。

<?php 
  $args = array( 
    'post_type' => 'Products',
    'order' => 'ASC' 
  ); 
  $the_query = new WP_Query($args); if($the_query->have_posts()): 
?>

現在表示している記事を除外して同じカテゴリの記事をランダムに表示する方法

現在表示している記事を除外して、同じカテゴリの記事をランダムに表示する場合、get_the_terms から、属しているタームを取得します。
※紹介している方法は、タームを複数選択している場合には対応していません。

<?php 
  $terms = get_the_terms($post->ID,'products-cat'); 
  foreach( $terms as $term ) { 
    $term_slug = $term->slug; // 現在表示している投稿に属しているタームを取得
  } 
  $args = array( 
  'post_type' => 'Products', // カスタム投稿タイプ Products
  'post__not_in' => array($post->ID), // 現在表示している記事を除外
  'posts_per_page' => 9, // 表示件数9件
  'orderby' =>  'rand', // ランダム
  'tax_query' => array( // タクソノミーの指定
    array( 
      'taxonomy' => 'products-cat',
      'field' => 'slug',
      'terms' => $term_slug, // 取得したタームを指定
    ))
  ); $the_query = new WP_Query($args); if($the_query->have_posts()): ?>

WordPress のプラグイン Anything Order など、並び順変更プラグインを使用して記事の並べ替えを行うと、プラグインの Ver によっては、クエリとテンプレートの記述がぶつかって表示がランダムにならない場合があります。その場合は、プラグインのアップデートやプラグインの停止などで対応しましょう。

記事数を取得する方法

指定したクエリから記事数を取得する場合は $the_query->found_posts を使って実現します。

<?php echo $the_query->found_posts; ?>

固定ページの内容をトップページなどに表示させる方法

トップページに固定ページの情報を出したい時は post_type を page_id に変更する事で実現する事ができます。
例えば固定ページのIDが 123 の場合はこちら。固定ページのIDは、管理画面の固定ページの編集画面のURLから参照することができます。

<?php $args = array( 'page_id' => 123 ); $the_query = new WP_Query($args); if($the_query->have_posts()): ?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<!-- 中略 -->
<?php endwhile; ?>
<?php else: endif; ?>
<?php wp_reset_postdata(); ?>

ページIDをページスラッグにする場合は page_id を pagename に変更して、スラッグを指定します。

<?php$args = array( 'pagename' => 'products' ); $the_query = new WP_Query($args); if($the_query->have_posts()): ?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<!-- 中略 -->
<?php endwhile; ?>
<?php else: endif; ?>
<?php wp_reset_postdata(); ?>

まとめ

サブループでできる表示のカスタマイズは、メインループでもできることなので、いろいろチャレンジしてみましょう。

スポンサーリンク