出力の基本:ループ

LOOPを出力するイラスト

まず、wordpressの各ページに投稿や固定ページのデータを出力する流れを解説します。

ループを使って出力する方法は、WordPressのテンプレートやページ作りの根幹といえる部分なので、よく理解しておく必要があります。

ループとは?

メインページやアーカイブページなど、WordPressのほとんどのページでは、投稿か固定ページを出力するようになっています。

この出力は、テンプレート内の「WordPressループ」で行い、投稿(または固定ページ)の情報を1件ずつ取り出して、それらの情報を順に出力していくという処理を行います。

たとえばトップページの記事一覧や、カテゴリーの記事一覧など、投稿が一覧で表示されているところにループが使われています。

WordPressで使用される、一般的なループ処理の例は以下の通りです。

PHP

<?php if(have_posts()): ?>
    <?php while(have_posts()): the_post(); ?>
        <!-- 投稿を出力する処理 -->
    <?php endwhile; ?>
<?php else: ?>
    <!-- 投稿データない時の処理 -->
<?php endif; ?>

関数:have_posts

個々のテンプレートの処理に入る際は、そのテンプレートに合った投稿(または固定ページ)が、あらかじめ読み込まれた状態になっています。

そして、その投稿(固定ページ)を順に1つずつ取り出して、データを出力していくという流れになりますが、投稿があるかどうかを判断するには have_posts という関数を使います

この関数にはパラメータはなく、戻り値は、出力すべき投稿(固定ページ)があるかどうかを表す値になります(あればtrue、なければfalse)。

関数:the_post

WordPressループ内で個々の投稿(固定ページ)のデータを出力する際は、まずthe_post という関数を実行して、出力の準備を整えるようにします

この関数を実行すると、読み込まれた投稿(固定ページ)から1件が取り出され、必要な準備が行われて、データを出力できる状態になります。

基本的なループの例

ページで投稿記事のタイトルと内容を一覧表示する場合、以下のような記述になります。

この記述は、トップページの「index.php」や「front-page.php」などのテンプレートに対しては、特に設定しなくてもそのまま「投稿」の情報を読み込みます。

PHP

<?php if(have_posts()): ?>
    <?php while(have_posts()): the_post(); ?>
        <?php the_title( '<h2>', '</h2>' ); ?>
        <div><?php the_content(); ?></div>
    <?php endwhile; ?>
<?php else: ?>
    <p>投稿がありません。</p>
<?php endif; ?>

タイトルを h2 要素で囲み、本文をdivで囲み出力します。

そして、投稿がない場合「投稿がありません。」と出力します。

サブループ:get_posts

サブループは、固定ページに投稿記事一覧を出したい、投稿ページに固定ページ一覧を出したいなど、メインになっているループ以外でループを同じページで使いたいという際に、任意で設定した条件に基づき取得した投稿データを出力するための処理です。

このように任意の条件でサブループを使うことで、サイトに色々なコンテンツや機能を入れること可能です。

以下は、get_posts を使用したサブループの関数で、指定した条件に応じて投稿データを取得することができます。

PHP

<?php
    $args = array (
        'category'       => '23', // カテゴリーID
        'post_type'      => 'post', // 投稿タイプ
        'posts_per_page' => 5, // 取得する投稿数
    );
    $myposts = get_posts( $args );
    foreach( $myposts as $post ):
    setup_postdata($post); // グローバル変数$postを書き換え
?>
<!-- 投稿を出力する処理 -->
<?php
    endforeach;
    wp_reset_postdata(); // $postをグローバル変数に戻す
?>

setup_postdata()the_titlethe_content のテンプレートタグを利用できるようになりますが、グローバル変数 $post を書き換えるので、wp_reset_postdata(); でリセットは必須になります。

条件分岐など複雑ではない単純な記事一覧の作成であれば、この get_posts を使用したサブループで出力する方法が簡単です。

サブループ:WP_Query

WP_Query は、WordPressが投稿データなどをデータベースから取得するためのクラスで、指定した条件に応じてデータを取得し、ループ処理で取得した記事の一覧を出力することができます。

get_postWP_Query の違いはそこまでありませんが、WP_Query ループ内での条件分岐などできることが多くいので、その場合は WP_Query がオススメです。

PHP

<?php
    $args = array(
        'post_type'      => 'post',
        'order'          => 'DESC',
        'posts_per_page' => 5,
    );
    $top_news = new WP_Query( $args );
    if($top_news->have_posts()): while($top_news->have_posts()): $top_news->the_post();
?>
<!-- 投稿を出力する処理 -->
<?php
    endwhile; endif; wp_reset_postdata();
?>

WP_Query もグローバル変数 $post を書き換えるので、wp_reset_postdata(); でリセットは必須になります。