前提
掲題の通りですが、複数投稿タイプがある場合、各アーカイブページにて該当タームのプルダウンを作りたいのですが、
各投稿ページのタームを取り出す記述がわかりません。
現在、Wordpressでは下記のような構造になっています。
カスタム投稿タイプ
├ NEWS
└ SHOP
上記投稿タイプに共通のタクソノミー「items」があり、タームは1~4あるとします。
共通タクソノミー items
├ 1
├ 2
├ 3
└ 4
各投稿のアーカイブページ(archive-news.php、archive-shop.php)で、各投稿で保有するタームをプルダウンで表示したいのですが、
各投稿ごとに保有するタームではなく、NEWSとSHOP合算されたタームが表示されてしまいます。
具体的に、下記のようなイメージです。
NEWS
└ items ─ 1の記事・4の記事
投稿タイプ・NEWSに、ターム1とターム4の記事があったとして、
NEWSのアーカイブページにてタームを選択するプルダウン(1と4が選択できる)を作りたいです。
発生している問題・エラーメッセージ
上記のカスタム投稿・NEWSで例えると、archive-news.phpのプルダウン部分の記述は以下になっています。
php
1 2<?php // プルダウン 3 $taxonomy_slug = 'items'; // タクソノミーのスラッグを指定 4 $terms = get_terms($taxonomy_slug); // タームの取得 5 $args = array( 6 'post_type' => array('news'), 7 'hide_empty' => 0, 8 'orderby' => 'name', 9 'order'=>'ASC', 10 ); 11 $terms = get_terms('items', $args); 12 if( $terms && !is_wp_error($terms) ){ // タームがあれば表示 13 echo '<select name="○○" onChange="location.href=value;">'; // option の value 値を URL とする 14 echo '<option value="○○">全てのアイテム</option>'; // 必要がなければこの行は削除 15 foreach ( $terms as $value ) { // 配列の繰り返し 16 echo '<option value="'.get_term_link($value->slug,$taxonomy_slug).'">'.esc_html($value->name).'</option>'; // タームのURLとタイトルを表示 17 } 18 echo '</select>'; 19 } 20 ?>
上記では'post_type' => array('news') を指定しているにもかかわらず、NEWS以外の該当タームも表示されてしまいます。
例えば、もう一つの投稿タイプ・SHOPで、NEWSでは記事を保有していなかったターム2,3の記事を保有していたとします。
すると、上記の記述ではNEWSのアーカイブページのプルダウンでターム2,3のリンクも生成されてしまいます。
NEWSのアーカイブページのプルダウンでは、NEWSの記事が該当するタームのみ表示させるには、どのようにすればよいでしょうか。
うまく伝わるかわかりませんが、情報不足な点があったらお知らせください。
よろしくお願いいたします。
ページャーについて
記事とプルダウン(ターム)、それぞれ投稿タイプごとに所有するものが表示されるようになりましたが、ページャーがそれごとに生成されません。
恐らくNEWS以外のページの記事も合算されてページャーが生成されています。
例えば1ページ10の記事が表示されるとして、NEWS記事は5、他投稿タイプで30の記事がある場合、
NEWSで4ページ分のページャーが生成されてしまいます。
(表示されている記事は5つのみ、2ページ目以降は記事はなくページャーのみ)
php
1//functions.phpの内容です 2 3<?php //ページャー部分 4function pagination( $pages, $paged, $range = 2, $show_only = false ) { 5 $pages = ( int ) $pages; 6 $paged = $paged ?: 1; 7 $text_first = "<<"; 8 $text_before = "<"; 9 $text_next = ">"; 10 $text_last = ">>"; 11 if ( $show_only && $pages === 1 ) { 12 echo '<div class="pager"><ul class="pager-list"><li><a class="current" href="">1</a></li></ul></div>'; 13 return; 14 } 15 if ( $pages === 1 ) return; // 1ページのみで表示設定もない場合 16 if ( 1 !== $pages ) { 17 //2ページ以上の時 18 echo '<div class="pager"><ul class="pager-list">'; 19 // echo '<div class="pagination"><span class="page_num">Page ', $paged ,' of ', $pages ,'</span>'; 20 //現在のページ数などを表示する場合はこの上のコメントアウトを外す。 21 if ( $paged > $range + 1 ) { 22 // 「最初へ」 の表示 23 echo '<li class="prev-area"><a href="', get_pagenum_link(1) ,'" class="prev">', $text_first ,'</a></li>'; 24 } 25 if ( $paged > 1 ) { 26 // 「前へ」 の表示 27 echo '<li class="prev-area"><a href="', get_pagenum_link( $paged - 1 ) ,'" class="prev">', $text_before ,'</a></li>'; 28 } 29 for ( $i = 1; $i <= $pages; $i++ ) { 30 if ( $i <= $paged + $range && $i >= $paged - $range ) { 31 // $paged +- $range 以内であればページ番号を出力 32 if ( $paged === $i ) { 33 echo '<li><a class="current" href="">', $i ,'</a></li>'; 34 } else { 35 echo '<li><a href="', get_pagenum_link( $i ) ,'">', $i ,'</a></li>'; 36 } 37 } 38 } 39 if ( $paged < $pages ) { 40 // 「次へ」 の表示 41 echo '<li class="next-area"><a href="', get_pagenum_link( $paged + 1 ) ,'" class="next">', $text_next ,'</a></li>'; 42 } 43 if ( $paged + $range < $pages ) { 44 // 「最後へ」 の表示 45 echo '<li class="next-area"><a href="', get_pagenum_link( $pages ) ,'" class="next">', $text_last ,'</a></li>'; 46 } 47 echo '</ul></div>'; 48 } 49} 50?> 51
php
1 2<ul> 3 <?php 4 $paged = get_query_var('paged') ? get_query_var('paged') : 1 ; 5 $term = wp_get_object_terms($post->ID, 'items'); 6 $args = array( 7 'post_type' => 'news', 8 'taxonomy' => 'items', 9 'term' => $term[0]->slug, 10 'posts_per_page' => 7, 11 'paged' => $paged 12 ); 13 $custom_query = new WP_Query( $args ); 14 if ( $custom_query->have_posts() ) : 15 while ( $custom_query->have_posts() ) : 16 $custom_query->the_post(); 17 ?> 18 <!-- ▽ ループ開始 ▽ --> 19 <li> 20 記事内容 21 </li> 22 <!-- △ ループ終了 △ --> 23 24 <?php endwhile; 25 endif; 26 wp_reset_postdata(); 27 ?> 28</ul> 29<!-- ページネーション --> 30<?php 31if ( function_exists( 'pagination' ) ) : 32 pagination( $wp_query->max_num_pages, get_query_var( 'paged' ) ); 33endif; 34?> 35 36
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/22 10:11
2021/03/22 13:50
2021/03/22 13:51
2021/03/24 01:29