カテゴリごとの記事一覧をWP_Queryで表示する【WordPress】

WordPressでカテゴリ別の記事リストを作成するコードとアレンジ方法。非推奨のquery_postsからWP_Queryに書き換えるときはまった点をまとめました。表示件数で落とし穴あり。(^^;

カテゴリごとの記事一覧をWP_Queryで表示する【WordPress】

WordPressでカテゴリ別に記事をソートして表示する方法です。

件数を絞ってトップページで使えば最近よく見るカテゴリ別メニューが作れるし、全件数表示にすればアーカイブページにも使えますね。

query_postsによる非推奨コードをWP_Queryで書き直すときの書式で地味にはまったのでメモ。

カテゴリーページのリストを出力する

以前の記事アーカイブはカテゴリーリストで簡単に済ませてたんですが、記事一覧として取得したくなりました。

ちなみにカテゴリーページへのリンクリストを出すのはテンプレートタグ一行で出来ます。

【PHP】
<?php wp_list_categories('show_count=1&depth=1'); ?>

上記パラメータの場合、「含まれる投稿件数を表示・最上位のカテゴリのみ」でリスト表示します。

【 関連記事 】

【WordPress】ウィジェット不要のカテゴリ一覧を1行で書く

wp_list_categories()を使ってカテゴリアーカイブへのリストを表示する方法です。

WP_Queryで記事をカテゴリごとにソートする

さておき本題はこっちです。WP_Queryでカテゴリごとのループを作成します。こんな感じの全カテゴリリストを作ります。

WordPressでカテゴリ別の記事一覧(テキスト版)

【PHP】
<?php
function ozCategory_archive(){
  $categories = get_categories(); // 取得カテゴリを調節するときはこのパラメータを変更
  foreach( $categories as $category ):
 
  str = '<h4><a href='. get_category_link( $category->term_id ) .'>'. $category->cat_name .'</a></h4>
        <ul>';
 
  $args = array( // WP_Queryにリクエストする要件
    'cat'=> $category->cat_ID,
    'posts_per_page' => -1 // 件数の調整
  );
 
  $query = new WP_Query( $args );
  if ( $query ->have_posts() ) :
    while ( $query ->have_posts() ) :
    $query ->the_post();
 
    $title = get_the_title();
    $str .= '<li><a href="'. get_permalink() .'">'. $title .'</a></li>';
 
    endwhile;
  endif;
  wp_reset_query();
    $str .= '</ul>';
    $strFinal .= $str;
  endforeach;
  return $strFinal;
}
?>
<?php ozCategory_archive(); ?>

[WordPress]カテゴリ毎に記事の一覧を表示して、自由に変更する | 着ぐるみ技術部ペンギン

関数化してあるので、アルゴリズムと呼び出し部は切り離し可能です。
【 訂正:2016/01/23 】交ぜ書きから関数に書き換えるとき、エラーになる書き方してました。コード修正済みです、すみません。(´ཀ`」∠):_

function {~} を function.php などに置き、表示部には ozCategory_archive() だけ置くとスッキリします。 ただしHTML部分を細かく書きたいときは、テンプレートファイルにPHPと交ぜ書きした方が手軽かも。

パラメータ解説

ポイントは冒頭の get_categories() と、中盤の WP_Query() 。表示内容を変えるときはこの二つをいじります。

親カテゴリだけ取得する

子カテゴリが沢山あって煩雑な場合、親カテゴリだけ取得することも可能です。冒頭にある get_categories() のパラメータを変えます。

【PHP】
$categories = get_categories('parent=0');

特定カテゴリだけ抜き出す

個別にカテゴリを選ぶ場合はカテゴリIDを拾います。カンマ区切りで増やせます。

【PHP】
$categories = get_categories('include=ID,ID,ID');

特定カテゴリだけ除去

同様に、一部カテゴリだけ外したい場合は exclude で指定をします。こちらもカンマ区切りで増やせます。

【PHP】
$categories = get_categories('exclude=ID,ID,ID');

除外カテゴリ自体がツリー構造(子カテゴリを持っている場合)は、ツリーごと外すことも出来ます。

【PHP】
$categories = get_categories('exclude_tree=ID');

表示順序を入れ替える

表示順序を変えたいときはorderby を使います。それぞれ order で昇順と降順を切り替えられます。

  • orderby=ID … カテゴリID
  • orderby=name … カテゴリ名(アルファベット順)
  • orderby=slug … スラッグ
  • orderby=count … 投稿数
  • order=ASC … 昇順
  • order=DESC … 降順

ここまでがカテゴリの取得方法。

表示件数を変える

実際の表示は WP_Query 部分で必要な投稿を抜き出します。初期値はダッシュボードで設定した「1ページに表示する最大投稿数」が反映されます。

設定 > 表示設定 > 1ページに表示する最大投稿数

これを、ダッシュボード設定に関係なく好きな件数にしたい場合は posts_per_page にて書き換えます。

【PHP】
  $args = array( // WP_Queryにリクエストする要件
    'cat'=> $category->cat_ID,
    'posts_per_page' => 10 // 各項目を10件ずつ表示
  );

全件表示にしたい場合は posts_per_page=-1 とします。

【PHP】
  $args = array( // WP_Queryにリクエストする要件
    'cat'=> $category->cat_ID,
    'posts_per_page' => -1 // 全件表示
  );

おわりに

WP_Queryで全記事表示をしようとしたところ、なぜか表示件数が頭打ちになってしまって少しはまりました。「おかしいなー」と思って色々試してるうちにダッシュボードの設定が効いてることに気付いてがっくり。

たまに思ったような動作をしなくてあちこち見直してるときにダッシュボード設定に行き着くことが割とあるのでWordPress侮れません。忘れた頃にやられるダッシュボード設定…今後は気をつけようと思います。

最後に、WP_Queryの書式を探してて見つけた着ぐるみ技術部ペンギンのナカシマさん、ありがとうございました!

【 関連記事 】

WordPressでカテゴリ別の記事を出すWordPressで親カテゴリ毎に子カテゴリの記事一覧を表示する

親カテゴリ別に子カテの一覧を出すコード。get_posts()を使う方法です。

【 更新履歴等 】

2015/07/03 初稿発表
2016/01/23 バグフィックスしますた。(◞‸◟)