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