WordPressのカスタム投稿タイプを取得するいくつかの方法

WordPressでサイトを作る際に便利なカスタム投稿タイプですが、様々な場面で投稿タイプを知りたくなることがあります。その方法をパターン毎にまとめてみました。

投稿タイプがわかれば、get_post_type_object($post_type)で投稿タイプの情報を取れるので、そこからラベルを表示させたりできるようになります。

シングルページ

カスタム投稿のシングルページで投稿タイプを取得するのは簡単です。

$post_type = get_post_type();

get_post_type()で現在の投稿の投稿タイプを取得できます。

カスタム投稿タイプのアーカイブページ

カスタム投稿タイプのアーカイブページでは、シングルページと同様、get_post_type()で取れます。

……と、言いたいのですが、これは投稿が一件以上なくてはいけませんget_post_type()はあくまで現在の投稿の投稿タイプを取得する関数だからです(内部的には$post->post_typeを返すだけ)。まだ投稿がなかったり、なんらかの理由で全て表示しない設定にしたりしていると、正しく投稿タイプを知ることはできなくなります。

投稿の有無によらず、アーカイブページで投稿タイプを取得するには以下のようにします。

$post_type = get_query_var('post_type');

WordPressではグローバル変数$wp_queryに、現在のページのリクエスト情報が入ってます。その中の連想配列$query_varsから値を引き出すのがget_query_var()です。

アーカイブページでは「この投稿タイプの投稿をくれ」というリクエストが必要ですから、$wp_queryから投稿タイプを知ることができるわけですね。この方法はシングルページでも有効です。

カスタムタクソノミーのアーカイブページ

カスタム投稿タイプと一緒に、カスタムタクソノミーを設定することもあると思います。

カスタムタクソノミーのアーカイブページでも、投稿が一件でもあればget_post_type()で投稿タイプを取得できますが、投稿の有無によらずに取得するのはちょっと面倒です。

$taxonomy = get_query_var('taxonomy');
$post_type = get_taxonomy($taxonomy)->object_type[0];

まずget_query_var('taxonomy')で現在のタクソノミーを取得し、get_taxonomy()に渡してあげることでタクソノミー情報が取得できます。このタクソノミーオブジェクトのobject_typeプロパティの配列に投稿タイプが入ってます。

もしかしたら他にもっとスマートなやりかたがあるかもしれません。いい方法があれば教えてください。

まとめ

いずれも投稿が一件以上必ず存在するのであればget_post_type()で投稿タイプを取得できます(ただし$postが上書きされてないこと)。

それでも不測の事態に備えて、ちゃんとそれぞれに対応したやりかたを用いた方がいいでしょうね。

おまけ:条件分岐

それぞれのページの判定方法です。

/* シングルページ*/
is_singular('投稿タイプ');

/* アーカイブページ */
is_post_type_archive('投稿タイプ');

/* タクソノミーアーカイブページ */
is_tax('タクソノミー');//特定のタクソノミー
is_tax('タクソノミー', 'ターム');//特定のタクソノミーのターム

引数をなしにすれば、投稿タイプやタクソノミーによらない判定が可能です。

Comments