記事の詳細
WordPressのカスタム投稿の記事内に異なるカスタム投稿の共通カスタムタクソノミーターム一覧を表示させるループの作り方
あるカスタム投稿ページで別のカスタム投稿の記事一覧が取得できて、かつそれがエディタ上で配置を変更できる、そしてその記事一覧が記事ページが属するタクソノミ―と同じタクソノミ―で出力される……という、ちょっとわかりにくいことをしたかったのです。
そもそもどういう仕組みなのかというと、
- 投稿コンテンツがA、Bとあり、AにはA2、C1というタクソノミーがあって、BにはB2、C1というタクソノミーがあり、それぞれにタームが付随している。
- C1のタクソノミ―はA、Bともに共有である状態。
- 投稿コンテンツAのC1内タームの記事ページを表示している際、投稿コンテンツBにあるC1内ターム記事一覧を表示
ということをがやりたかったわけです。
以下のようなフローになります。
- カスタム投稿A、Bをつくる
- カスタムタクソノミーA2、B2、C1を作る
- カスタム投稿AにカスタムタクソノミーA2、C1を適応、カスタム投稿BにカスタムタクソノミーB2、C1を適応
- 投稿コンテンツBのタームC1の記事一覧が表示されるサブループを作り、functionにショートコードを設置する
- 投稿コンテンツAの記事内にショートコードで呼び出す
今回のブログの見出しはコチラです!
カスタム投稿に共通のカスタムタクソノミーを適応する
利用したプラグインは「Custom Post Type UI」になります。
カスタム投稿の設置の仕方は割愛。
「利用するタクソノミー」部分にチェックを入れることで、各カスタム投稿に共通のタクソノミーを設置することができます。
タクソノミ―C1のループ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $terms = get_the_terms($post->ID, 'ここにタクソノミ―C1名'); $args = array( 'paged' => $paged, 'numberposts' => 6, //表示(取得)する記事の数 'post_type' => 'カスタム投稿タイプBの名前', 'tax_query' => array( 'taxonomy' => 'タクソノミ―C1名', 'field' => 'slug', 'terms' => $term->slug, ), ); $posts = get_posts( $args ); if( $posts ) : foreach( $posts as $post) : setup_postdata( $post ); ?> <!--ここにループ内容--> <?php endforeach; ?> <?php else : ?> <div class="blog-box"><p>記事はまだありません。</p></div> <?php endif; wp_reset_postdata(); ?> |
get_the_terms で投稿に紐づく任意のタクソノミーを取得。「カスタム投稿AのタクソノミーをC1を取得したとき、カスタム投稿BのC1の一覧が取得」できるようになります。
これでカスタム投稿Aのシングルページに共通カスタムタクソノミーC1のいずれかのタームが設定されている場合、同タームのチェックが入っているカスタム投稿Bの投稿記事一覧が呼び出されます。(post_typeでカスタム投稿Bを指定しています)
これをテンプレートとしてphpファイルにまとめました。loop_custom.phpとか適当に名前は付けておきます。
ショートコードでループを呼び出せるようにする
以下のコードをfunctionに追加します。
1 2 3 4 5 6 |
function loop_brand_php( $atts ){ ob_start(); get_template_part('loop_custom'); return ob_get_clean(); } add_shortcode( 'loop_custom', 'loop_custom_php' ); |
「loop_custom」のところを指定したphpファイル名に変えます。
記事内にショートコードを呼び出す
Gutenbergだとブロックのウィジェット項目に「ショートコード」があります。ここに上記で指定したショートコードを記載します。
ブロック形式だと好きなところに反映できるのでレイアウトが組みやすいですね。
特に共通のカテゴリー、タクソノミーでなくていい場合は、ショートコードでループを呼び出すだけ。
上記は共通のタクソノミーを利用して、同じチェックが入っているものを呼び出すためにつくったものですが、単純に別のタームのループを呼び出したいだけなのであれば、以下のように記載します。よく使うサブループですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $args = array( 'paged' => $paged, 'numberposts' => 6, //表示(取得)する記事の数 'post_type' => '投稿タイプの名前', 'tax_query' => array( 'taxonomy' => 'タクソノミ―名', 'field' => 'slug', 'terms' => 'ターム名', ), ), ); $posts = get_posts( $args ); if( $posts ) : foreach( $posts as $post) : setup_postdata( $post ); ?> <!--ここにループ内容--> <?php endforeach; ?> <?php else : ?> <div class="blog-box"><p>記事はまだありません。</p></div> <?php endif; wp_reset_postdata(); ?> |
tax_queryの使い方がポイント
single.phpなどが属するカテゴリやタクソノミーを呼び出すときに使える関数は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 |
【投稿タイプ呼び出し】 <?php get_post_type( $post ); ?> 【カスタム投稿タイプ呼び出し】 <?php get_taxonomy( $taxonomy ) ?> 【カテゴリ呼び出し】 <?php get_the_category( $id ); ?> 【ターム呼び出し】 <?php get_the_terms( $id, $taxonomy ); ?> |
single.phpなどカテゴリやタクソノミー、タームを保有するページで、サブループを使う際、上記の要素を取得するには、サブループの最初でそれらを「取得する」作業が必要になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $terms = get_the_terms($post->ID, 'ここにタクソノミ―C1名'); $args = array( 'paged' => $paged, 'numberposts' => 6, //表示(取得)する記事の数 'post_type' => 'カスタム投稿タイプBの名前', 'tax_query' => array( 'taxonomy' => 'タクソノミ―C1名', 'field' => 'slug', 'terms' => $term->slug, ), ); $posts = get_posts( $args ); if( $posts ) : foreach( $posts as $post) : setup_postdata( $post ); ?> <!--ここにループ内容--> <?php endforeach; ?> <?php else : ?> <div class="blog-box"><p>記事はまだありません。</p></div> <?php endif; wp_reset_postdata(); ?> |
このサブループの
1 |
$terms = get_the_terms($post->ID, 'ここにタクソノミ―C1名'); |
最初のこれですね。
「tax_query」の中の「terms」 に「$term->slug」を指定していますが、この$termは表示されるsingle.phpからタームを取得する、=>slug で「スラッグで」という意味になります。
tax_queryの呑み込みが遅くて苦労したゆえ覚書……。
WordPressは奥が深い……。