特定のカテゴリ記事一覧を表示する方法(WordPress)
2025.02.27.
WordPressで特定のカテゴリ記事一覧を表示したい場合、さまざまな方法があります。
ここでは代表的な2つの方法である、get_posts と query_posts を紹介します。
ただし、一般的に新しいテーマ開発やカスタマイズでは、query_posts よりも WP_Query や get_posts を使うことが推奨されています。
なぜなら、query_posts はメインクエリを直接書き換えてしまうため、ページネーション(ページ送り)が正しく動作しなくなる場合があるからです。
そのため、基本的には get_posts もしくは WP_Query を使うことをおすすめします。
get_posts で取得する場合
get_posts
は単純にデータを取得するためだけの関数で、ループ終了後に wp_reset_postdata()
を使って投稿データをリセットするのが一般的です(the_post()
などを使わない場合は不要なケースもあります)。
<?php
$posts = get_posts(array(
'post_type' => 'post', // 投稿タイプ(デフォルトは 'post')
'posts_per_page' => 10, // 表示件数
'category' => '1', // カテゴリIDまたはスラッグ(必要がなければ削除)
'orderby' => 'date', // 表示順の基準
'order' => 'DESC' // 昇順・降順
));
// 取得した投稿データがあるか確認
if ( $posts ) :
foreach ( $posts as $post ) :
setup_postdata($post);
?>
<!-- 表示したい内容をここに書きます -->
<h2><?php the_title(); ?></h2>
<p><?php the_excerpt(); ?></p>
<?php
endforeach;
// グローバル変数 $post を元に戻す
wp_reset_postdata();
endif;
?>
ポイント
post_type
にカスタム投稿タイプのスラッグ(例:my_custom_post
)を指定することで、カスタム投稿からの取得も可能です。category
パラメータにはカテゴリID、またはカテゴリスラッグを指定します。- たとえば、カテゴリスラッグが
news
であれば'category' => 'news'
と書けます。
- たとえば、カテゴリスラッグが
- ループ終了後には
wp_reset_postdata()
を呼び出すことで、グローバルな$post
変数が元の状態に戻ります。 - さらに細かく制御したい場合は、
tax_query
などを使用して特定のタクソノミーを条件に絞ることもできます。
query_posts で取得する場合
query_posts
はメインクエリを上書きするため、推奨されないことが多いです。どうしてもメインクエリを上書きしたい特別な事情がある場合にのみ利用します。
以下のように非常に簡潔に特定カテゴリの記事を取得できます。
<?php query_posts('cat=1&showposts=10'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<!-- 表示したい内容をここに書きます -->
<h2><?php the_title(); ?></h2>
<p><?php the_excerpt(); ?></p>
<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
- cat=1 はカテゴリIDを 1 と指定している例です。
- showposts=10 は表示件数を 10 に設定しています。
- ループ終了後には wp_reset_query() を使用し、メインクエリを元に戻します。
query_posts を使う際の注意点
query_posts()
はメインクエリを上書きするため、ページネーション(ページ送り)が崩れる、または意図しない動作を引き起こす場合があります。- WordPress 公式ドキュメントでも
query_posts
は非推奨で、WP_Query
クラスを使用する方法が推奨されています。
さらにおすすめ:WP_Query で取得する場合
実際の開発現場では、get_posts
よりも細かく制御できる WP_Query
がよく使われています。ページネーションや条件分岐をきめ細かく行う場合に便利です。
<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'category_name' => 'news', // カテゴリスラッグの場合は 'category_name' を使用
'orderby' => 'date',
'order' => 'DESC'
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
?>
<!-- 表示したい内容をここに書きます -->
<h2><?php the_title(); ?></h2>
<p><?php the_excerpt(); ?></p>
<?php
endwhile;
// 投稿データをリセット
wp_reset_postdata();
endif;
?>
category_name
にスラッグを設定できるほか、cat
に数値IDを指定することも可能です。WP_Query
では複数のカテゴリや複数のタクソノミーを指定するなど、柔軟な絞り込みが可能になります。
まとめ
- シンプルに特定カテゴリの記事を取得したい場合は、
get_posts
で十分対応できます。 - ページネーション(ページ送り)を使いたい場合や高度なクエリ制御が必要な場合は、
WP_Query
を使うのがおすすめです。 query_posts
はメインクエリを書き換えるため、基本的には非推奨である点に注意してください。
WordPress でカテゴリを指定して投稿を一覧表示するときは、目的と要件に応じて適切なメソッドを選択するのがポイントです。
以上、特定のカテゴリ記事一覧を表示する際のサンプルコードと注意点でした。