トップページでよく見かけるブログの新着記事ですが、 ブログ全体の新着記事ではなくて、ニュースなど特定のカテゴリ記事だけ一覧表示したいときってありませんか?
例えば、下図のように「ニュース」「ブログ」と分けて投稿記事を表示したときなど、結構あるのではないと思います。
WordPressでは、特定の条件を指定して投稿記事を呼び出すquery_posts()という関数がありますので、この関数をうまく使って特定のカテゴリーに紐付けされた記事のみ表示される方法をご紹介したいと思います。
STEP1 特定のカテゴリIDを調べる
管理画面より、カテゴリ作成ページを開きます。
下図の右側、「編集」ボタンを押すと該当するカテゴリの編集画面に遷移するので、URLの「tag_ID」に注目をします。
↓ 下図は、カテゴリ編集ページのURL(編集ボタンを押した後のページ)を、ブラウザで確認した画面です。
イコール(=)の右辺がカテゴリIDになりますので、メモなどして覚えておきます。
上図の場合のカテゴリIDは、「3」ということになります。
STEP2 query_posts() 関数で特定のカテゴリを呼び出す
WordPressのquery_posts()関数を使ってSTEP1でメモをしたカテゴリ記事を呼び出します。
query_posts()の使い方ですが、カテゴリIDが3に紐付けされた記事リストをページ内に5件だけ表示させたい場合は、以下のような記述になります。
1 |
<?php query_posts("cat=3&showposts=5"); ?> |
query_postsの括弧()で囲まれた内容ですが、cat イコール(=)の右辺がカテゴリID、 showpost イコール(=)の右辺の数字が表示させる件数になりますので、上記の場合、「カテゴリIDが3の投稿記事を、5件表示する」という意味になります。
WordPressの twentyfourteen テーマの index.php を例に、トップページへカテゴリIDが「3」の記事リストを表示させるソースコードは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<div id="primary" class="content-area"> <div id="content" class="site-content" role="main"> // ↓ ループの直前に query_posts を記述します! // 以下の例では、カテゴリーIDが3の記事を最大5件表示される例です。 <?php query_posts("cat=3&showposts=5"); ?> <?php if ( have_posts() ) : // ← ループスタート while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; twentyfourteen_paging_nav(); else : get_template_part( 'content', 'none' ); endif; // ← ループエンド ?> </div><!-- #content --> </div><!-- #primary --> |
ポイントは、5行目のhave_posts()より前に、query_posts()を使うことです。
通常ですと、5行目のhave_posts()の箇所から、カテゴリーに関係なくすべてのブログ記事が時系列に表示されますが、 have_posts()(ループ処理より前)にquery_posts()を使って特定のカテゴリーを指定することで、特定のカテゴリーの記事だけループ処理が行われるようになります。
特定のカテゴリーを除外して表示させる場合
上記では、query_posts()を使って特定のカテゴリーに紐付けされた記事のみ表示させる方法をご紹介しましたが、 場合によっては、特定のカテゴリー記事を除外して表示させたいこともあるかと思います。
例えば、先頭の図のように、「ブログ」にはすべての投稿記事から時系列で最新記事を表示させたいが、「ニュース」カテゴリーだけは除外したいといった場合などが考えられます。
そういった場合も、query_posts()に除外したいカテゴリーを指定することで実現ができます。
除外したいカテゴリーの指定方法はとってもシンプルで、以下のように除外したいカテゴリーIDにマイナス(-)を付けるだけです!
以下の例では、カテゴリーIDが3以外の記事を表示させる方法になります。
1 2 3 4 5 6 7 8 |
<?php query_posts('cat=-3'); ?> // 3をマイナス(-)の値にします。 <?php if ( have_posts() ) : // ← ループスタート while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; endif; // ← ループエンド ?> |
複数のカテゴリーを除外したい場合には、カテゴリーIDをカンマ(,)区切りで指定します。
下の例では、カテゴリーIDが5と7以外の記事を表示させる例になります。
1 2 3 4 5 6 7 8 |
<?php query_posts('cat=-5,-7'); ?> // 5,7をマイナス(-)の値にします。 <?php if ( have_posts() ) : // ← ループスタート while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; endif; // ← ループエンド ?> |
先頭の図のように、トップページへ「ニュース」カテゴリーとそれ以外の記事「ブログ」を分けて表示させるコードは以下のようになります。以下の例では、ニュースカテゴリーのIDが3の記事と、それ以外の記事を表示させる例になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// ↓カテゴリーIDが3(ニュース)の記事を5件表示させる <div id="post" > <?php query_posts('cat=3&showposts=5'); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; endif; ?> <div > // ↓カテゴリーIDが3(ニュース)以外の記事を5件表示させる <div id="news" > <?php query_posts('cat=-3&showposts=5'); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; endif; ?> <div > |