WordPressのトップページ(front-page.php)はブログ投稿を表示したり、お知らせ投稿を表示したりしたいこと、ってありますよね?
WP_Query クラスを使って、投稿タイプが「投稿(post)」である最新記事を取得する方法を解説します。
まずは一番基本的なコードから
通常の投稿を新着順で6記事取得するコードです。
<?php
// カスタムクエリのパラメータを設定
$args = array(
'post_type' => 'post', // 投稿タイプ(通常の投稿)
'posts_per_page' => 6 // 取得する件数
);
// クエリを作成
$the_query = new WP_Query($args);
// 投稿があるかどうかを判定
if ($the_query->have_posts()) : ?>
<ul>
<?php
// 投稿がある場合はループ開始
while ($the_query->have_posts()) : $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<?php the_title(); // 投稿タイトルを表示 ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php
endif;
// メインクエリ(グローバルクエリ)を復元
wp_reset_postdata();
?>
コードの意味・解説
WP_Query用のパラメータを設定
$args = array(
'post_type' => 'post',
'posts_per_page' => 6
);
post_type
: 取得したい投稿タイプを指定します。ここでは通常の「投稿(post)」を指定。
posts_per_page
: 取得したい件数を指定。ここでは「6件」を指定。
ここでパラメータを追加すれば特定のカテゴリーに属する記事のみを取得したり、並び順をタイトル順やランダムにしたり、タグで絞り込んで表示したりすることができます。

詳しくは後ろで説明します!
WP_Queryのインスタンスを生成し、クエリを作成
$the_query = new WP_Query($args);
$args
で設定したパラメータを使って新たにクエリを作成し、$the_query
に代入します。
ループ開始(投稿が存在するかどうかを確認)
if ( $the_query->have_posts() ) :
have_posts()
は、現在のクエリに該当する投稿があるかどうかをチェックします。もし投稿が存在しない場合には false
となります。
投稿データがある間はループを回して表示する
while ( $the_query->have_posts() ) : $the_query->the_post();
...
endwhile;
the_post()
は、ループ内で使用する「投稿データ」をセットし、テンプレートタグ(the_title()
, the_content()
など)でその投稿の情報を取得できるようにします。<li>
〜</li>
の間で、各投稿タイトルやパーマリンクを表示しています。
ループ後、グローバルクエリを復元
wp_reset_postdata();
new WP_Query()
を使用した後は、ループが終了した段階で必ず wp_reset_postdata()
を呼び出して、$post
グローバル変数を初期の状態に戻します。これをしないと、メインクエリや他のクエリに悪影響が出る可能性があります。
特定のカテゴリー(スラッグ: news)だけを取得
'category_name' => 'news'
category_name
というパラメータを使って、スラッグ(例: “news”, “blog”, “event”など)を指定して、そのカテゴリーの記事のみ取得できます。
<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'category_name' => 'news'
);
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) : ?>
<ul>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php endif;
wp_reset_postdata();
?>
表示内容は the_title()
や the_excerpt()
を使用してカスタマイズできます。