カスタム投稿の記事をターム毎に一覧表示する【WordPress】

カスタム投稿の一覧ページを作る時に、ターム毎に区切って記事タイトルやアイキャッチ等を表示したい時、ありませんか?私は時々あります。

こんな表示にしたい。

映画レビューページを作成。ジャンル毎に分けてレビュー一覧を表示したいと思います。

後日追記ここから↓↓↓:

厳密に言うと、メインクエリ(メインループ)の場合は、アクションフック(pre_get_posts)でクエリ実行前に条件を指定してあげる方が良いと思います。WordPress Codexもそれを推奨しています。
※例えば本記事のソースを記述するテンプレートが「archive-moviereview.php」等の場合です。

↓↓↓ こんなイメージ(未検証) functions.php ↓↓↓

ただ、今回のようにターム&記事を変数を利用して紐づけする場合など若干ややこしい場合は、別にいいかな…とも思います。リクエストが増えるので、ちょっと効率悪いよね、という話ですが…
(賢者はまとめてfunctions.phpに記述するのでしょう…。)

後日追加ここまで↑↑↑

スポンサーリンク

まずはソース全部

ここから説明

Step.1

まずは「get_terms」関数を使用して
ターム(ホラー、アクション、コメディ…)一覧を表示します。<h2>のタイトル部分です。

関数リファレンス/get terms

ちなみに「get_terms」関数ではなくて、
カテゴリー一覧表示に便利な「wp_list_category」という関数もあるのですが、細かく条件を指定して読み込みをしたい場合はget_terms」関数を使用する必要があります。

「get_terms」関数の1つ目のパラメータに「カスタム分類」の名前を入れます。
2つ目のパラメータにはorderbyやorder、hide_emptyなど条件を指定する配列をお好みで入れてあげます。ここは「get_categories」関数と同じです。

ちなみに上記のソース例では、タームに親子関係があったとしても最上位のタームのみ出力するように設定しています。

そしてこの後、foreach(ループ)でターム名一覧を取得します。

ちなみに当記事では詳細は割愛しますが
各ターム(ジャンル)にアーカイブページへのリンクを貼りたいんだよ!
という時には「get_term_link」関数を使うと実現できます。

ここまでで、各ジャンル(ホラー、アクション、コメディ…)の
タイトルの出力が完了しました。

Step.2

次に各タームに属する投稿の情報を出力します。
//ここから追加 //ここまで追加 とコメントを書いている部分になります。

例では投稿のタイトルと詳細ページへのリンクを出力しています。
「スプラッター熊」や、「熊子3D」といった映画のタイトルになります。

ここでは「WP_Query」オブジェクトを作成して読み込む内容の条件指定をしています。
「post_type」にカスタム投稿投稿タイプ名(moviereview)を指定します。
加えて、「tax_query」という配列も加えてカスタムタクソノミー(カスタム分類)の条件を指定します。

$term -> slug ←この指定がポイントです。
ここで先に記述した「get_terms」のループで取得したターム情報から、スラッグを取得しています。

‘terms’ => array($term -> slug),
↓↓↓上記記述によりタームのスラッグが格納されるようになります。
‘terms’ => array(‘horror‘), //ホラー

その後、ループで、投稿タイトル(スプラッター熊、熊子3D)と詳細ページのリンクを出力。

最後にメインループに戻してあげる<?php wp_reset_postdata(); ?>を記述します。

補足:ちなみに今回の様な例では「WP_Query」を使用せず、「get_posts」でも同じ結果が得られます。
WP Queryは正確にはWordPressのコアに存在してるクラスの1つで、get_postsはテンプレートタグです。
個人的に記述に慣れているので今回の例では「WP_Query」を使用しました。
最近の実用書(2016年現在)などもほぼ「WP_Query」を使用していたりするので…。

ちなみに「query_posts」は現在は非推奨なので使用NGです。

誤り、改善点などありましたらコメントよりご指摘ください…

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする