WordPressでループを入れ子にする方法

March 15, 2016

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

 

RELATED POSTS