カテゴリアーカイブページでの記事の並び順コントロール

お題

イベント情報など特定の種類のアーカイブページでは、記事の投稿日時順よりも記事で取り上げているイベントの開催日順で表示させたい。

考え方

要望はこんな感じ ・一覧ページ閲覧時点の日付よりも前に開催されるイベントについては、一覧ページには表示されないor最後にまとまっている状態にする ・一覧ページ閲覧時点の日付以降のイベントを昇順で並べたい(直近のものから順番に並べる) ・イベントには優先順位も存在し、優先順位の高いイベントについてはイベント開催日によらず一覧ページの上部に表示させたい 開催日の軸が降順ならまだしも、昇順で並べて記事が尽きたら、今日以前のイベント記事を付け加えるなんて芸当は駆け出しの自分には荷が重いと判断して、サクッと表示されないようにすることに。 それなら、カスタムフィールドの値を使った検索絞り込みの応用でどうにかなりそうだと思ったので。

実装方法

今回はイベント系がまとまっているカテゴリ一覧ページのデフォルトを上記要望通りの表示にしてほしいとのことだったので、functions.phpにソート&絞り込みの機能を記述して、特定のカテゴリアーカイブのときのみ機能するようにすればおkかなぁと。 優先順位とイベント開催日の情報を持たせるためにカスタムフィールドを作成 優先順位は数値で、イベント開催日についてはyyyymmddの8桁の数字でデータを入れることとする。 そうすることで、閲覧時点の日付をyyyymmddの8桁で取得すれば数値の大小比較で今日よりも後に開催されるイベントかどうかが判断できる。 並び替えのキーと並び替え順序は$queryの’orderby’に配列で指定し、絞り込み条件などは’meta_query’に配列で指定する。 絞り込みと並び替えを同時にしなきゃいけない場合は、このようにするんだそうな。

サンプルコード


// URLにsdateキーのパラメータpastが設定されてたら開催日が本日以前のセミナーを表示
function change_posts_query( $query ) {
  // 管理画面 or メインクエリじゃない ときは何もしない
  if( is_admin() || !$query->is_main_query()) {
    return;
  }
  
  if( is_archive() ) {
    if( is_category('seminar') || is_category('tokyo') || is_category('osaka') || is_category('kyoto') || is_category('aichi') || is_category('fukuoka') || is_category('others') ) {
        $query->set('orderby',array(
                                    'meta_internal-seminar-priority'=>'DESC',
                                    'meta_internal-seminar-sdate'=>'ASC'
                                   )
                   );

        $query->set('meta_query',array(
                                       'meta_internal-seminar-priority' => array(
                                                                                 'key'=>'internal-seminar-priority',
                                                                                 'type'=>'NUMERIC'
                                                                                ),
                                       'meta_internal-seminar-sdate' => array(
                                                                              'key'=>'internal-seminar-sdate',
                                                                              'value'=>(int)date('Ymd'),
                                                                              'compare'=>'>=',
                                                                              'type'=>'NUMERIC'
                                                                             )
                                      )
                   );
    }
  }
}

add_action('pre_get_posts', 'change_posts_query');
The following two tabs change content below.

Web勉強中おじさん

最新記事 by Web勉強中おじさん (全て見る)

0