taxonomy.php
のページ、つまりタクソノミーのターム(term)のアーカイブページで現在のタームtermを取得する方法。
get queried object を使う
現在クエリされているオブジェクトを取得します。例えば:
- 単一投稿ページを表示中なら、投稿オブジェクト。
- 固定ページを表示中なら、固定ページのオブジェクト。
- カテゴリーアーカイブを表示中なら、カテゴリーオブジェクト。
- 投稿者アーカイブを表示中なら、投稿者オブジェクト。
- 等々。 これは
$wp_query->get_queried_object()
のラッパー関数です。
出典: 関数リファレンス/get queried object - WordPress Codex 日本語版
タクソノミーのアーカイブページならこんな感じ。
<?php $queried_object = get_queried_object(); // $queried_object は WP_Term Object $term_id = $queried_object->term_id;
カスタム投稿タイプのときは保証されてないっぽい (WordPress 4.3以降)
英語のドキュメントに気になることが書いてありました。
Note that precedence plays an important role. As an example, if you visit a custom post type archive while also passing in a taxonomy term (ie. /my-post-type/?my_taxonomy=term), the request is both a post archive and a taxonomy archive. In this case it isn't obvious that
get_queried_object()
will return the term object and not the post type object (as of WordPress 4.3). The implication is that you cannot necessarily rely onget_queried_object()
returning a post type simply becauseis_post_type_archive()
istrue
.
WordPress 4.3以降では、カスタム投稿のタクソノミーのターム(term)アーカイブページではget_queried_object()
がpost type objectではなく、term objectを返すことは保証していないって感じっぽい?
ということで試してみました。
WordPress v5.0.3
カスタム投稿タイプ(post_type) talent
を作成してタクソノミ(taxonomy) talent_type
を作成してターム(term)にcute
, cool
を作成しました。図にするとこんな感じ
post_type: talent |- taxonomy: talent_type |- cute |- cool
cute
の投稿を作成し、cool
の投稿は0件のままにします。
それぞれのカスタム投稿タイプのtalent_type
のアーカイブページは下記の通り
アーカイブのテンプレートtaxonomy-talent_type.php
<?php $queried_object = get_queried_object(); var_dump($queried_object); $termName = $queried_object->name; echo $termName;
結果
cute
(投稿有り)
$queried_object => (WP_Term) Object $termName => 'cute'
cool
(投稿無し)
$queried_object => (WP_Term) Object $termName => 'cool'
保証されてないっぽいということでしたが、結果は投稿があってもなくてもget_queried_object()
でterm
のオブジェクトが取得できていました。
ただ保証されてないという事なので、$wp_query->query_vars
からタームのSlug名を取得する方法のほうが安全なように思います。
query_varsからtermオブジェクトを取得する方法
taxonomy-talent_type.php
<?php $termSlug = get_query_var('talent_type'); $term = get_term_by('slug', $termSlug, 'talent_type'); $termID = $term->id;
この方法でも試してみた所、アーカイブの投稿があってもなくても term オブジェクトを問題なく取得することが出来ました。
保証されていない方法より、確実な方法にしておく方がWordPressコアアップデートとかで挙動が変わってバグるということが発生しにくいでしょうから良いと思います。ご安全に!
WordPressの投稿が増えるときは大抵久しぶりにWordPress案件やってる時。
前にも似たようなこと書いた気がすると思ったらやっぱり書いてた。
[参考]
- 関数リファレンス/get queried object - WordPress Codex 日本語版
- Function Reference/get queried object « WordPress Codex
- php - How do I get current taxonomy term id on wordpress? - Stack Overflow
- WordPress カスタム投稿タイプのslug (URI)から投稿IDを取得したい - かもメモ
エアコンついてないのに壁の薄すぎて部屋の中で凍死しそうだったので、これ👇買いました。今の所かなり快適になりました。(尚電気代...

シャープ プラズマクラスター搭載 加湿機能付 セラミックファンヒーター ホワイト HX-H120-W
- 出版社/メーカー: シャープ(SHARP)
- メディア: ホーム&キッチン
- この商品を含むブログを見る
建築技術も上がっているはずなのに、未だに気密性がなく非人道的なアルミサッシの小屋が多いのナンデ?
昔の人は「夏を旨とすべし」とは言ったけれど今の技術なら室内の湿度の問題を解決したまま気密性高くして夏は涼しく冬は温かいお家造れるはずなのに…
Hei-Sayも終わろうとするのに未だに人に合わせるじゃなくて、モノに人が合わせる戦前マインドと人名よりコスト優先なんですかねー…
辛いからお金持ちになって自分でお家作りたい。