例えば2つの投稿タイプ、製品(product)と納入事例(case)があり、単純に、あるタクソノミーに属する製品をループで回して一覧表示するのは、ごくごく簡単なことだ。
今回実現したいのは、ループで回した製品(product)毎に、その製品の納入事例(case)を表示させるというケース。
つまり、ループを入れ子で使いたいのだ。または二重ループや多重ループというのだろうか。
そして、さらに言うと、製品と納入事例は同じカスタム分類(タクソノミー)で紐付いており、その値を取得してループに使用したい。
さらに言うと、それを固定ページのテンプレートで管理し、固定ページのカスタムフィールドの値でタクソノミーを指定することで、作業を簡略化したい。
以下で実現できたので、コードを整えてメモしておく。
<?php ////親ループ $parm = array( 'post_type' => '投稿タイプ', 'tax_query' => array( array( 'taxonomy' => esc_attr(get_post_meta($post->ID,'カスタムフィールド', true)),//カスタムフィールドでタクソノミーを指定 'field' => 'slug',//カスタムフィールドをスラッグで指定するかIDで指定するか 'terms' => esc_attr(get_post_meta($post->ID,'カスタムフィールド', true)),//カスタムフィールドでタームを指定 ), ), 'showposts' => 4 ); $my_query = new WP_Query($parm); ?> <?php if($my_query->have_posts()): ?> <?php while ($my_query->have_posts()) : $my_query->the_post(); ?> <!--ループの内容--> <?php //親ループで回した投稿から取得するタームのタクソノミーを指定 $terms = get_the_terms($post->ID,'タクソノミー'); foreach($terms as $term){//タームのスラッグを取得 $term_slug = $term -> slug; } // カスタムフィールドで関連付けたければ $term_slug = get_post_meta($post->ID,'カスタムフィールド',TRUE); ?> <?php ////子ループ $parm = array( 'post_type' => '投稿タイプ', 'tax_query' => array( array( 'taxonomy' => 'タクソノミー', 'field' => 'slug', 'terms' => $term_slug, ), ), 'showposts' => 4 ); $sub_query = new WP_Query($parm); // カスタムフィールドで関連付けたければ meta_key' => 'カスタムフィールドの値', 'meta_value' => $term_slug, ?> <?php if($sub_query->have_posts()): ?> <?php while ($sub_query->have_posts()) : $sub_query->the_post(); ?> <!--ループの内容--> <?php endwhile; ?> <?php endif; ////子ループここまで ?> <?php endwhile; ?> <?php endif; ////親ループここまで ?>
上記のコードを応用して、カスタム投稿タイプsiteとlinkを作成し、サイトごとにリンクリストを作成するコードを以下に紹介。
<?php ////親ループ $parm = array( 'post_type' => 'site', 'orderby' => 'menu_order', 'order' => 'ASC', 'showposts' => -1 ); $my_query = new WP_Query($parm); ?> <?php if($my_query->have_posts()): ?> <?php while ($my_query->have_posts()) : $my_query->the_post(); ?> <dl class="clearfix"> <dt><a href="<?php echo $post->link_url; ?>" target="_blank" title="<?php echo $post->link_title; ?>"><?php the_title(); ?></a></dt> <dd><?php $cflsn = get_post_meta($post->ID,'link_site_name',TRUE); // カスタムフィールドlink_site_nameの値を格納 ?> <?php ////子ループ $parm = array( 'post_type' => 'link', 'meta_key' => 'link_site_name', 'meta_value' => $cflsn, 'orderby' => 'menu_order', 'order' => 'ASC', 'showposts' => -1 ); $sub_query = new WP_Query($parm); // カスタムフィールドlink_site_nameでサイト名を取得し同じサイト名のリンクを吐き出す ?> <?php if($sub_query->have_posts()): ?> <?php while ($sub_query->have_posts()) : $sub_query->the_post(); ?> <a href="<?php echo $post->link_url; ?>" target="_blank" title="<?php echo $post->link_title; ?>"><?php the_title(); ?></a> <?php endwhile; ?> <?php endif; ////子ループここまで ?> </dd> </dl> <?php endwhile; ?> <?php endif; ////親ループここまで ?>
以下の様なデータをcsvで管理し、インポート機能を使えば処理も簡単だ。
ID |
post_status |
post_type |
link_site_name |
link_title |
post_title |
link_url |
menu_order |
|
publish |
site |
サイト名 |
対策キーワード |
リンクテキスト |
リンクURL |
1 |
|
publish |
link |
サイト名 |
対策キーワード |
リンクテキスト |
リンクURL |
|