例えば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 |
|