かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress taxonomy.phpのページ現在のページのtermを取得したい。

taxonomy.phpのページ、つまりタクソノミーのターム(term)のアーカイブページで現在のタームtermを取得する方法。

get queried object を使う

現在クエリされているオブジェクトを取得します。例えば:

タクソノミーのアーカイブページならこんな感じ。

<?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 on get_queried_object() returning a post type simply because is_post_type_archive() is true.

出典: Function Reference/get queried object « WordPress Codex

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案件やってる時。
前にも似たようなこと書いた気がすると思ったらやっぱり書いてた。


[参考]

エアコンついてないのに壁の薄すぎて部屋の中で凍死しそうだったので、これ👇買いました。今の所かなり快適になりました。(尚電気代...

建築技術も上がっているはずなのに、未だに気密性がなく非人道的なアルミサッシの小屋が多いのナンデ?
昔の人は「夏を旨とすべし」とは言ったけれど今の技術なら室内の湿度の問題を解決したまま気密性高くして夏は涼しく冬は温かいお家造れるはずなのに…
Hei-Sayも終わろうとするのに未だに人に合わせるじゃなくて、モノに人が合わせる戦前マインドと人名よりコスト優先なんですかねー…
辛いからお金持ちになって自分でお家作りたい。