まず、wordpressの各ページに投稿や固定ページのデータを出力する流れを解説します。
ループを使って出力する方法は、WordPressのテンプレートやページ作りの根幹といえる部分なので、よく理解しておく必要があります。
ループとは?
メインページやアーカイブページなど、WordPressのほとんどのページでは、投稿か固定ページを出力するようになっています。
この出力は、テンプレート内の「WordPressループ」で行い、投稿(または固定ページ)の情報を1件ずつ取り出して、それらの情報を順に出力していくという処理を行います。
たとえばトップページの記事一覧や、カテゴリーの記事一覧など、投稿が一覧で表示されているところにループが使われています。
WordPressで使用される、一般的なループ処理の例は以下の通りです。
<?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 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
$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_title
や the_content
のテンプレートタグを利用できるようになりますが、グローバル変数 $post
を書き換えるので、wp_reset_postdata();
でリセットは必須になります。
条件分岐など複雑ではない単純な記事一覧の作成であれば、この get_posts
を使用したサブループで出力する方法が簡単です。
サブループ:WP_Query
WP_Query
は、WordPressが投稿データなどをデータベースから取得するためのクラスで、指定した条件に応じてデータを取得し、ループ処理で取得した記事の一覧を出力することができます。
get_post
と WP_Query
の違いはそこまでありませんが、WP_Query
ループ内での条件分岐などできることが多くいので、その場合は WP_Query
がオススメです。
<?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();
でリセットは必須になります。