get_posts()のカスタム投稿タイプ・タクソノミー取得
カスタム投稿タイプの特定のカスタムタクソノミーの投稿一覧の表示や出力を行いたい場合は、query_posts()を利用して行うが、取得を行いたい場合は通常、get_posts()を使って行うのがお作法。
カスタム投稿タイプの投稿一覧データを取得する際はget_posts()で毎度のことながら行っているが、なんと今の今までget_posts()でカスタムタクソノミーが限定できることを知らなかった。
無知は罪。なんと罪深い。流石腐れコーダー。
まぁ、もちろん自虐がしたくてこの記事を書いているわけではない。これは一応ちゃんとした備忘録である。
で、何が備忘録かというと、なぜカスタムタクソノミーが限定できることを知らなかったかの言い訳と、実際に使ってみるにあたってget_posts()のカスタム投稿タイプとカスタムタクソノミーの限定時の注意をまとめておきたい(後者はquery_posts()にも当てはまるけど)。
で、まずはなぜカスタムタクソノミーが限定できることを知らなかったかと言うと・・・
理由:コーデックスに書いてない。
いや、だったら、コアのコード調べろよと。
はい、惰性で調べていませんでした。ごめんね!(投げやり)
コーデックスの他に幾つか愛用しているサイトさんがあるんだが、query_posts()でならカスタム投稿タイプとカスタムタクソノミーの限定ができることは前にその幾つかのサイトさんを閲覧していたときに一応知っていた。
query_posts()には書いてあった引数オプションが、get_posts()のページでは書いてなかったので、「ああ、get_posts()では使えないんだろうなー」とか思ってモヤっとしていたんだ。
だが、今回、カスタム投稿アーカイブとかカテゴリアーカイブでのget_posts()での投稿一覧データの取得が必を要されたので、件のサイトさんをチェック。
やっぱり書いていない。
いや、サイトさんに書いてないことに責任はない。ちゃんと調べていない俺が腐っているだけだ。
でも、書いていないからできないでは言い訳にさえならないので、とりあえず、引数オプションが有効かどうかをget_posts()にquery_posts()での同じ限定条件をぶち込んで試してみた。
コードとしてはこんな感じ。
$object = get_post_type_object(get_post_type()); $posts = get_posts( array( 'post_type' => $object->name, 'tax_query' => array( array( 'taxonomy' => 'you_maked_custom_taxonomy', ) ), ) );
で、これで現在表示しているテンプレート内のカスタム投稿タイプで、カスタムタクソノミーの投稿が全て取得できるのではないかと。
結果は・・・残念なことに上記の限定条件では取得できなかった。var_dumpで$postsを調べてみるもののarray{0}の表示が。
なんだやっぱり出ないじゃん・・・と思ったが、とりあえず適当にぶち込んだだけで結果を決めつけるのはいささか早計。
そこで、以前に書いていたquery_posts()でのカスタム投稿タイプのカスタムタクソノミー限定の引数を見返してみた。
ああ、taxonomy以外にtax_queryのfieldの指定をslugで入れてるよね。
そして、termsでカスタムタクソノミーをスラッグ名でターム限定してるよね。
物は試しで、以下のように書き換えた。
$object = get_post_type_object(get_post_type()); $posts = get_posts( array( 'post_type' => $object->name, 'tax_query' => array( array( 'taxonomy' => 'you_maked_custom_taxonomy', 'field' => 'slug', 'terms' => 'you_maked_custom_taxonomy_slug', ) ), ) );
そして、var_dump()で$postsの値を見る。
・・・取得できた!!やったぜ!!!
何だちゃんと使えるじゃんとモヤッとしていた部分が解決しました。
どうにしてもtax_queryではtaxonomy、field、termsは絶対的に必要な条件となるんだね・・・これは今後同じような形式のものを書くときの重要な注意事項になった。
そして、書いていないから使えないってのは単なる思い込みで、実際に試してみたいことにはやっぱりわからないもんというのはいい教訓になった。