WordPressネタです。
特定のカスタムタクソノミーに分類され、かつ特定のタームに所属するカスタム投稿記事を取得して、自由に表示するTIPSです。
マニアックですが、自分的にも忘れないようにメモ書きとして残しておきます。
カスタム投稿記事をループさせる
これはさほど難しくありません。ループにはquery_postやWP_Query、get_postsなどいくつか取得できるタグがありますが、get_postsで取得した例文です。
<?php $posts = get_posts(‘post_type=custom_posttype_name’); //カスタム投稿タイプ名をいれます ?>
<ul>
<li style=”list-style-type: none”>
<ul><!–?php foreach ($posts as $post) : setup_postdata($post); ?–>
<li></li>
</ul>
</li>
</ul>
これだけであれば以下のようにカスタム投稿記事のリンク付き記事一覧が生成されます。
簡単ですね。これならば問題ないんですが、一つのカスタム投稿内において、カスタムタクソノミーに分類され、いくつかタームを設定している場合もあると思います。そのように「特定のカスタム投稿タイプかつ、特定のタームに属する記事のみループさせたい」となると話が変わります。
タクソノミーとタームを設定してループさせる
仮に、投稿タイプを「制作事例」、タクソノミーを「エリア」、タームに「国内」「海外」となるカテゴライズされた記事があるとし、「国内だけの記事一覧を表示させる」というコードを書きます。
・カスタムタクソノミー:エリア(area)
・ターム:国内(domestic)
<ul>
<li style=”list-style-type: none;”>
<ul><?php $args = array( ‘post_type’ => ‘works’, //投稿タイプは制作事例なのでworksに設定 ‘tax_query’ => array( //タクソノミー、タームの設定 array( ‘taxonomy’ => ‘area’, //タクソノミーはエリアなのでareaに設定 ‘field’ => ‘slug’, //基本的にslugに指定します(必須) ‘terms’ => ‘domestic’ //タームは国内なのでdomesticに設定 ) ) ); $domestic_post = get_posts($args); if($domestic_post) : foreach($domestic_post as $post) : setup_postdata( $post ); ?>
<li></li>
</ul>
</li>
</ul>
表示する記事がありません。
上記のような感じで表示ができました。
適宜変数や名称は変更してください。
解説
カスタム投稿タイプだけの時はget_postsに直接指定していましたが、タクソノミーやタームの指定をする場合、「tax_query」を指定する必要があり、配列で見た目的に別の変数に代入した方がわかりやすいため、今回は変数$argsを作成しています。
この「tax_array」は配列で指定する必要があり、「taxonomy」「field」「terms」を指定します。
タクソノミー、タームはそれぞれ該当する文字列を入力します。
fieldに関しては「タクソノミーをidかslugで選択する」ためにあるのですが、基本slugで設定しておくのが無難です。
これら指定を忘れると表示されずハマるので注意しましょう。僕はこれでハマりました。
get_postsで条件のループが取れれば、あとはforeachでループさせればOKです。
また、setup_postdata()の変数はグローバル変数$postに設定します。別の変数にしたら動きません。
参考:関数リファレンス/setup postdata
コメントを残す