サポート » 使い方全般 » 子ターム名と記事一覧をtaxonomy.phpに表示させる際に子タームの順番を指定したい

  • 解決済 gooooma

    (@gooooma)


    taxonomy.phpテンプレートで「prd_ctg」というタクソノミに紐づく子ターム名と、その子タームに所属している記事とを表示させたいと思いました。

    taxonomy-prd_ctg.phpというファイルを作成、下記のページの「アクセスしているカテゴリーアーカイブを自動判別してリストを出力する場合」のソースを利用することで、子ターム名と記事一覧の取得は出来ましたが子タームの表示順を変更したいです。
    (現在はID順に表示されているようです)

    ▼ 参考サイト
    http://q.hatena.ne.jp/1382148601

    orderbyで表示順を指定出来るというのは解るのですが、参考にしたソースにget_termsなどの表記が見当たらず…
    PHPの知識に乏しいため途方に暮れています。

    ソースは下記の通りです(参考にしたソースほぼそのままです)

    <?php
      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(
    		'post_type' => 'en_products',
    		'nopaging' => true,
    		'tax_query' => array(
    			array(
    				'taxonomy' => $taxonomy_name,
    				'field' => 'id',
    				'terms' => array( $tax_slug ),
    			)
    		),
    		'orderby' => 'date',
    		'order' => 'ASC' // 並び順
    	);
    
    	query_posts($args);
    
    	if ( have_posts() ) : 
    ?>
    
            <h4 class="productsTtl01"><?php echo $term_info->name; ?></h4>
            <ul class="productsItemList01 clearfix">
    	<?php while ( have_posts() ) : the_post(); ?>
              <li><a href="<?php the_permalink(); ?>">
                <div class="picBox"><?php the_post_thumbnail('full'); ?></div>
                <div class="name"><?php the_title(); ?></div>
                </a> </li>
    	<?php endwhile; ?>
            </ul>
    <?php endif; ?>
    <?php wp_reset_query(); ?>
    <?php endforeach; ?><!-- $taxs -->
    <?php endif; ?><!-- End of If parent category -->
    

    上記の <h4 class="productsTtl01"><?php echo $term_info->name; ?></h4> 以下に表示される子タームの順番を変更したいのです…

    お知恵をお貸しいただければ幸いです。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック投稿者 gooooma

    (@gooooma)

    読み返してみるとかなり説明不足ですね…

    製品の一覧をカスタム投稿で作成しておりまして、現在は「PRODUCTS」という固定ページに全記事の一覧を、各製品カテゴリ別の一覧をtaxonomy.phpで作成をしております。
    各ページの表示は下記のようになっています。

    PRODUCTS(固定ページ)の表示
    ・カテゴリ1
     - カテゴリ1の子タームA  ←子タームはorderbyで名前順にしている
      - 子タームAの記事1
      - 子タームAの記事2
      - 子タームAの記事3

     - カテゴリ1の子タームB
      - 子タームBの記事1
      - 子タームBの記事2
      - 子タームBの記事3

    ・カテゴリ2
     - カテゴリ2の子タームC
      - 子タームCの記事1
      - 子タームCの記事2
      - 子タームCの記事3

     - カテゴリ2の子タームD
      - 子タームDの記事1
      - 子タームDの記事2
      - 子タームDの記事3

    ・カテゴリ3
      :
      :

    各製品カテゴリページ(taxonomy.php)の表示
    ・カテゴリ1
     - カテゴリ1の子タームB  ←子タームがID順になる
      - 子タームBの記事1
      - 子タームBの記事2
      - 子タームBの記事3

     - カテゴリ1の子タームA
      - 子タームAの記事1
      - 子タームAの記事2
      - 子タームAの記事3

    やりたいことは下記の4点です。

    1)各製品カテゴリページを開いた時にそのタクソノミID、nameを自動で判別
    2)タクソノミに紐づいた子タームの取得
    3)子タームに所属する記事の一覧を表示
    4)取得した子タームの表示順をorderbyで変更できるようにする

    どうかお知恵をお貸しください。
    宜しくお願いいたします。

    こんにちは

    get_term_children() と get_term_by() の代わりに、get_terms() を使用するとソート等のパラメーターを指定できるので簡単でいいかと思います。

    $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 );
    
    (省略)
    
    		'terms' => array( $tax_slug ),

    $terms = get_terms( $taxonomy_name, array( 'child_of' => $term_id, 'orderby' => 'name', 'order' => 'ASC' ) );
    foreach ( $terms as $term_info ) {
    
    (省略)
    
    		'terms' => array( $term_info->term_id ),

    なお、query_posts() はテンプレート内で使用することは推奨されていないので、get_posts() や WP_Query クラス等を使用することをおすすめします
    https://wpdocs.osdn.jp/テンプレートタグ/query_posts

    トピック投稿者 gooooma

    (@gooooma)

    ishitaka さま

    有難うございます!
    教えていただいたように置き換えまして、思い通りの並び順にすることが出来ました!
    二日ほどずっと悩んでいたので、本当に感謝です!!

    query_postsはWP_Queryに変更し、以下のような形で出力させました。
    有難うございました!

    <?php
      if($wp_query->queried_object->parent == 0) :
    	$term_id = $wp_query->queried_object->term_id;
    	$taxonomy_name = $wp_query->queried_object->taxonomy;
    	$terms = get_terms( $taxonomy_name, array( 'child_of' => $term_id, 'orderby' => 'name', 'order' => 'ASC' ) );
    	foreach ( $terms as $term_info ) {
    
    	  $args = array(
    		'post_type' => 'en_products',
    		'nopaging' => true,
    		'tax_query' => array(
    			array(
    				'taxonomy' => $taxonomy_name,
    				'field' => 'id',
    				'terms' => array( $term_info->term_id ),
    			)
    		),
    		'orderby' => 'date',
    		'order' => 'ASC' // 並び順
    	  );
    
    	$wp_query = new WP_Query($args);
    ?>
      <?php if( $wp_query->have_posts() ) : ?>
            <h4 class="productsTtl01"><?php echo $term_info->name; ?></h4>
            <ul class="productsItemList01 clearfix">
    	<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
              <li><a href="<?php the_permalink(); ?>">
                <div class="picBox"><?php the_post_thumbnail('full'); ?></div>
                <div class="name"><?php the_title(); ?></div>
                </a> </li>
    	<?php endwhile; ?>
            </ul>
      <?php endif; ?>
    <?php wp_reset_query(); ?>
    <?php } ?>
    <?php endif; ?>
3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「子ターム名と記事一覧をtaxonomy.phpに表示させる際に子タームの順番を指定したい」には新たに返信することはできません。