前提・実現したいこと
WordPressの個別ページ内で記事の表示順を変更したいのですが、苦戦しております。
具体的には、
「JOBS」という個別ページ内で「募集中」or「終了」のどちらかのタグを持つ記事を、以下のような記事の表示順に変えたいと思っております。
1.「募集中」のタグを持つ記事を投稿日順で出力
2.「終了」のタグを持つ記事を投稿日順で出力
「募集中」のタグを持つ記事が先頭に来て、後半に、「終了」のタグを持つ記事が出力されるイメージです。
以下に記載しました方法で試してみましたが、うまくいかず、でした。
仕様的にはページ下部にページネーションもおく仕様になっております。
6/23追記
説明だけでは伝わりにくいと思い、画像を添付いたします。
実現したいこととしてはしたの図の通りです。
Wordpressプラグインの「Intuitive Custom Post Order」での並び替えで実現できるのはできるのですが、記事数が多くなると、かなり面倒だと思い、あまり現実的な方法だとは言えないのかなといった印象です。
試したこと
https://macoblog.com/order_by_category/
こちらの記事を参考に、タグに優先度をつければいけるかと思いましたが、現在のコードに合わせる書き方がわからず、断念しました。
Advanced Custom fieldのプラグインを使用し、
添付画像のように、募集中or終了を選択するチェックボックス式のフィールドを用意しました。
https://gyazo.com/24699c59d423605c624a3ad3ff6d4fb1
「募集中」のタグをもつ記事だったら募集中に、「終了」のタグをもつ記事だったら終了に、チェックを入れるような仕様にしました。
カスタムフィールドでの並び替えも試しましたが、私の調べた限りでは達成することができませんでした。
個別ページ内でサブループを2回回して、
一回目を「募集中」をもつ記事を出力、
その下で「終了」をもつ記事を出力
といった感じで実装すると、順番的には、達成できるのですが、ページネーションが機能しなくなります。
ちなみにページネーションは固定ページ内で以下のように出力しています。
php
1<?php pagination($the_query->max_num_pages);?>
参考コード
参考までに現在のコードを添付いたします。
php
1// function.php 2function sub_loop($type = "", $number = -1, $paged = "", $tag_name="") { 3 $args = array( 4 'post_type' => $type, 5 'posts_per_page' => $number, 6 'no_found_rows' => false, 7 'tag' => $tag_name, 8 'paged' => $paged, 9 ); 10 11 $wp_query = new WP_Query($args); 12 13 return $wp_query; 14} 15 16function pagination($pages = '', $range = 2) { 17 $showitems = ($range * 2)+1; 18 19 global $paged; 20 if (empty($paged)) { 21 $paged = 1; 22 } 23 24 if ($pages == '') { 25 global $wp_query; 26 $pages = $wp_query->max_num_pages; 27 if (!$pages) { 28 $pages = 1; 29 } 30 } 31 32 if (1 != $pages) { 33 echo '<ul class="p-pagination">'; 34 if ($paged > 1) { 35 echo "<li class='p-pagination__icon -arrow'><a class='p-pagination__link -arrow -prev' href='".get_pagenum_link($paged - 1)."'><span></span></a></li>"; 36 } 37 38 for ($i=1; $i <=$pages; $i++) { 39 if (1 !=$pages &&(!($i>= $paged+$range+1 || $i <= $paged-$range-1) || $pages<=$showitems)) { 40 echo ($paged==$i)? "<li class='p-pagination__icon'><a class='p-pagination__link is-active' href='".get_pagenum_link($i)."'>".$i."</a></li>" : "<li class='p-pagination__icon'><a class='p-pagination__link' href='".get_pagenum_link($i)."'><span>".$i."</span></a></li>"; 41 } 42 } 43 44 if ($paged < $pages) { 45 echo "<li class='p-pagination__icon -arrow'><a class='p-pagination__link -arrow -next' href='" .get_pagenum_link($paged + 1)."'><span></span></a></li>"; 46 } 47 echo '</ul>'; 48 } 49 }
php
1// page-jobs.php 2<ul class="p-news-panel__news-list"> 3 <?php 4 $the_query = sub_loop("projects", 1, $paged); 5 if ($the_query->have_posts()) : while ($the_query->have_posts()) : 6 $the_query->the_post(); 7 ?> 8 <li class="p-news-panel__news"> 9 <a href="<?php the_permalink();?>"> 10 <div class="p-news-panel__news-info"> 11 <p class="p-news-panel__news-created-at"> 12 <time><?php the_time('Y.m.d');?></time> 13 </p> 14 <ul class="p-news-panel__news-tags"> 15 <?php $tags = get_the_tags(); 16 if ($tags) { 17 foreach($tags as $tag) { 18 echo '<li class="p-news-panel__news-tag js-post-tag '. $tag->slug .' ">' . $tag->name . '</li>'; 19 } 20 } 21 ?> 22 </ul> 23 </div> 24 <h3 class="p-news-panel__news-title"> 25 <span><?php the_title();?></span> 26 </h3> 27 </a> 28 </li> 29 <?php 30 endwhile; 31 endif; 32 wp_reset_postdata(); 33 ?> 34 </ul>