@ WordPress

WordPressループ

メインループ

WordPress では要求されたページの URL に応じて抽出条件を決定し、データベースから投稿に関するデータを抽出します。

この抽出条件をメインクエリと言います。

メインクエリにより抽出された投稿に関するデータは複数存在する場合があるので、繰り返し処理(ループ)をする必要があります。

この繰り返し処理をメインループと呼びます。

メインループの基本的な書き方は以下のようになります。

example.php

<?php if(have_posts()): while(have_posts()): the_post();?> <!-- ループ開始 -->
    <?php the_date(); ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
<?php endwhile; endif; ?> <!-- ループ終了 -->

WordPress Codex:ループ

WordPressループ内で、投稿に関する基本情報を表示するテンプレートタグには次のようなものがあります。

表示項目 テンプレートタグ
タイトル <?php the_title();?>
本文 <?php the_content();?>
抜粋 <?php the_excerpt();?>
タグ <?php the_tags();?>
カテゴリ <?php the_category();?>
サムネイル画像(アイキャッチ) <?php the_post_thumbnail();?>
ファイル名(スラッグ/slug) <?php echo $post->post_name;?>
公開日付 <?php the_date();?>

サブループ

メインループはアクセスされた URL から表示条件を決定していますので、例えば投稿個別表示ページに新着情報を表示させたい場合などには記事を抽出することができません。

そのような時はメインクエリとは別の抽出条件で記事を抽出するサブクエリを利用します。

サブクエリによって抽出された記事の繰り返し処理はサブループと呼びます。

例えば、WordPress ループの出力対象の投稿のうち、特定のカテゴリーに属する投稿だけを出力し、それ以外の投稿を後で出力したいとします。

この場合、まず WordPress ループを1回実行して特定のカテゴリーに属する投稿を出力し、その後に WordPress ループをもう一回実行して残りの投稿を出力することになります。

特定カテゴリーの投稿を先に出力し、後で残りの投稿を表示する例を以下に示します。

example.php

<h1>メインループ</h1>
<?php if(have_posts()): while(have_posts()): the_post();?>
<?php if(in_category('special_cat')): ?>
    <?php the_date(); ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
<?php endif; ?>
<?php endwhile; ?>
<?php endif; ?>

<!-- 巻き戻し -->
<?php rewind_posts()?>

<h1>メインループの再処理</h1>
<?php while(have_posts()): the_post();?>
<?php if(!in_category('special_cat')): ?>
    <?php the_date(); ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
<?php endif; ?>
<?php endwhile; ?>

このように、WordPress ループが終わった後で、二度目のループでも同じ様に処理を行うには rewind_posts() を使いますい。 この関数にはパラメータはなく、同じクエリを再利用するためにループの投稿情報を巻き戻し、別のループを実行出来るようにします。

その後に WordPress ループを実行すれば、1回目のループと同じ投稿を再度処理することができます。

WordPress Codex:関数リファレンス/rewind posts

既に標準のクエリに関するループを終了したあと、別のクエリを使う場合は、get_post() を使って以下のようにサブループを作ることができます。

example.php

<h1>メインループ</h1>
<?php if(have_posts()): while(have_posts()): the_post();?>
    <?php the_date(); ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
<?php endwhile; ?>
<?php endif; ?>

<h1>サブループ</h1>
<?php
$args = array(
    'posts_per_page' => 5,
    'category_name' => 'special_cat'
);
$postslist = get_posts($args);
foreach ($postslist as $post) :
    setup_postdata($post);
?>
<div>
    <?php the_date(); ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
</div>
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

WordPress Codex:関数リファレンス/get post

標準のクエリを保持しておきたければ、新しいクエリオブジェクトを生成するという方法があります。

example.php

<h1>メインループ</h1>
<?php if(have_posts()): while(have_posts()): the_post();?>
    <?php the_date(); ?>
    <?php the_title(); ?>
    <?php the_excerpt(); ?>
<?php endwhile; ?>
<?php endif; ?>

<h1>新しいクエリオブジェクトを生成</h1>
<?php
$args = array(
    'posts_per_page' => 5,
    'category_name' => 'special_cat'
);
$my_query = new WP_Query( $args );
?>
<?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?>
    <?php the_title()?>
<?php endwhile; ?>

<?php rewind_posts()?>

<h1>メインループの再処理</h1>
<?php while(have_posts()): the_post();?>
    <?php the_title(); ?>
<?php endwhile ;?>

WordPress Codex:関数リファレンス/WP Query