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

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
'post_status' => 'publish', // 公開済の投稿
'posts_per_page' => 5 // 投稿を5件表示
);
$the_query = new WP_Query($args); if($the_query->have_posts()):
?>
<!-- 以下省略 -->

非公開の投稿を除外したい場合は 'post_status' => 'publish'publish 公開済の投稿を指定します。
全件表示したい場合はパラメーター '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 を使用します。
この方法はタームを複数選択している場合には対応していません。
タームを複数選択している場合は WordPress 現在表示されている投稿と同じタームに分類された投稿を表示する方法をご覧ください。

<?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_typepage_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_idpagename に変更して、スラッグを指定します。

<?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(); ?>

まとめ

WordPress で投稿を表示するための基本的なループの表示方法を紹介しました。
サブループでできる表示のカスタマイズはメインループでもできることなので、いろいろチャレンジしてみましょう。

スポンサーリンク

私が続けて読みたい関連記事