サポート » 使い方全般 » 都道府県別3階層のカテゴリーをタームごとにループしたい

  • 解決済 yoshizumi555

    (@yoshizumi555)


    西日本、東日本の2ページに分けて表示する都道府県別店舗紹介ページで

    カスタム投稿のカテゴリは
    ・西日本
    ー兵庫県
    ーー神戸市
    ーー加古川市
    ー京都府

    ・東日本
    ー東京都
    ー神奈川県

    など、2階層のものと3階層のものがあり、

    ■兵庫県
     ー神戸市
      ・店舗名
      ・店舗名
     ー加古川市
      ・店舗名
      ・店舗名
    ■京都府
     ・店舗名
     ・店舗名

    のように、3階層の場合はさらにループさせたいのですが

    if($wp_query->queried_object->parent == 0) :
    		$term_id = $wp_query->queried_object->term_id;
    		$taxonomy_name = $wp_query->queried_object->taxonomy;
    		$termchildren = get_term_children( $term_id, $taxonomy_name );
    
    		foreach ( $termchildren as $child ) :
    			$taxs[] = $child;
    		endforeach;
    
    		foreach( $taxs as $tax_slug) :
    			//ターム名取得
    			$term_info = get_term_by( 'id', $tax_slug, $taxonomy_name );
    
    			$args = array(
    				'taxonomy' => 'saloncategory',
    				'nopaging' => true,
    				'tax_query' => array(
    					array(
    						'taxonomy' => $taxonomy_name,
    						 'field' => 'id',
    						'terms' => array( $tax_slug ),
    					)
    				),
    			);
    
    			query_posts($args);
    
    			if ( have_posts() ) :
    			?>
    
    				<h2><?php echo $term_info->name; ?></h2>
    				<ul>
    				<?php
    				while ( have_posts() ) : the_post(); ?>
    
    					<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    				<?php endwhile; ?>
    				</ul>
    			<?php endif;?>
    			<?php wp_reset_query(); ?>
    		<?php endforeach; ?><!-- $taxs -->
    	<?php endif; ?><!-- End of If parent category -->

    このコードだと3階層もつ場合、2階層目と3階層目が同じ階層の扱いになって
    ■兵庫県
     ・店舗名
     ・店舗名
    ■神戸市
     ・店舗名
     ・店舗名

    となってしまいます。
    3階層名がある場合さらにループさせるにはどうすればいいでしょうか。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • モデレーター jim912

    (@jim912)

    get_term_children を使った場合、該当する親の子孫を全て取得してしまうため、同じ階層の扱いとなってしまいます。

    解決砲としては、get_terms の parent を使って、直接の子カテゴリのみを取得するようにします。
    子カテゴリが取得できた場合は、さらに孫カテゴリが存在するかをget_termsで取得を試みるようにします。
    get_terms の返りが空の配列となった場合に、query_postsを実行すれば、一番末端のカテゴリでのみ店舗が表示されるようになります。

    効率的な書き方としては、再帰処理を行う関数で実装する方法となります。関数の処理としては、

    1. get_terms で子カテゴリを取得
    2. 子カテゴリがある場合は、子カテゴリをforeach でループして、自関数(定義した関数名自体)を呼び出す。
    3. 子カテゴリがない場合は、処理中のカテゴリを指定して query_posts を実行し、店舗名を表示

    この手法ですと、コードを短くできる他、階層がさらに深くなった場合においても、自動的に対応してくれます。ただし、再帰処理は分かりにくい部分もあります。
    三階層限定であれば、関数にしないで、get_terms で子カテゴリが得られた場合は、子カテゴリの foreach の中で query_posts を実行させる手法の方が、分かりやすいかもしれません。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • トピック「都道府県別3階層のカテゴリーをタームごとにループしたい」には新たに返信することはできません。