【SWELL】アーカイブページをACFで設定した日の昇順に並べる

日が開いてしまったが、ここ最近、別案件で、SWELLを利用した
Wordpressカスタマイズの対応をしていた。

そこでは、出演予定一覧というアーカイブを作る必要があり、
投稿日時とは別に、出演予定日を軸に、未来日の記事のみ、昇順に表示させる必要があった。

そこで、ACFを利用して、出演予定日や、時間、場所を入力できるカスタムフィールドを作った。

Atsu

ACFは最近Secure Custom Fields(SCF)に変更になりましたが、検索すると、ACFのほうがまだ一般的なので、ここでもいったんACFとしておきます。
ACFのカスタムフィールドの作り方は別の人に譲るとして、
出演予定日をevent-dateという名前(ラベルはイベント日付だが)で設定した。

その後、アーカイブページでこの出演予定日を軸に並べ替えをさせようとしたのだが、私は、そもそもACFを使う前にCFSを使っていたので、ACFの項目ってCFSオブジェクトみたいにACFから取るんじゃないのか、と勘違いしていたのでちょっと遠回りしてしまった。
結果的には、普通にクエリをいじればよかった。

function modify_event_query($query) { 
  // 管理画面でない、メインクエリで、`event` カテゴリーのみに適用 
  if (!is_admin() && $query->is_main_query() && is_category(160)) {
    // `event-date` カスタムフィールドで昇順に並べ替え 
    $query->set('meta_key', 'event-date');  // 並べ替えに使うカスタムフィールド 
    $query->set('orderby', 'meta_value_num'); // 数値として並べ替え 
    $query->set('order', 'ASC'); // 昇順
   // 現在日付より未来の日付の投稿のみ表示 
    $query->set('meta_query', array(
        array( 'key' => 'event-date', 
            'value' => date('Ymd'), 
            'compare' => '>=', 
            'type' => 'NUMERIC', // 数値として比較 
        ),
    ));
   }
 }
 add_action('pre_get_posts', 'modify_event_query');
クエリに慣れたWordpressユーザーなら見慣れたコードだろう。
私も実際、これでOKだと思っていた。

しかし、実際にはたしかに未来日の投稿のみを抽出はできたのだが、順番がバラバラのままだった。
なぜなのか。
SWELLテーマを使っているからもしかして優先順位が問題になっているのかも。。。と思った。
ちなみに、CSSやJSと同じく、Wordpress内でも優先順位とかで本来動くべき機能が機能しなかったりする。

なので、add_actionで、優先順位をちょっと足してみた。(コードの最終行)

function modify_event_query($query) { 
  // 管理画面でない、メインクエリで、`event` カテゴリーのみに適用 
  if (!is_admin() && $query->is_main_query() && is_category(160)) {
    // `event-date` カスタムフィールドで昇順に並べ替え 
    $query->set('meta_key', 'event-date');  // 並べ替えに使うカスタムフィールド 
    $query->set('orderby', 'meta_value_num'); // 数値として並べ替え 
    $query->set('order', 'ASC'); // 昇順
   // 現在日付より未来の日付の投稿のみ表示 
    $query->set('meta_query', array(
        array( 'key' => 'event-date', 
            'value' => date('Ymd'), 
            'compare' => '>=', 
            'type' => 'NUMERIC', // 数値として比較 
        ),
    ));
   }
}
// 優先度を高くして、他のクエリ設定より先に実行
 add_action('pre_get_posts', 'modify_event_query', 20);

これで昇順にもなった。なるほど、やはり優先度を高くしたほうが良かったようだ。
SWELLの設定でカスタムフィールドや並べ替えが指定されている場合、それが優先されることがあるので
こういう優先度を高くするという対策が有効のようだ。

ちなみに、このコードはChatGPTといっしょに色々考えながら作った。
理由としては、検索してもなかなかいい感じのが出てこないので、プロンプトを工夫して、作ってみた。

ここの冒頭で書いたように、出演予定一覧を作りたいので、ACFでフィールドを作り、それを使って現在の日付から。。。と
いうふうにやりたいことを説明して、コードを吐き出してもらった。
そのおかげでACFフィールドを出力する方法がよくわかった。

しかし、なぜわかるかというと、やはり、クエリを出力する方法をあらかじめ知っていたからだ。
そのため、このコードが正しいというのがわかっていた。
私の悩んでいたポイントはACFフィールドのクエリでの出力方法だったので、そこだけでもよかったが
他にも良い書き方があるとわかって収穫だった。

また、今回の悩み、順番がバラバラのままというところの解決方法はないかを提案してもらい、
私の方でも原因を探りつつ、それをChatGPTに提案してみて、より良い解決方法を提案してもらった結果が
上の優先順位を高くする方法だったというわけだ。
(他にも提案の内容でわからなかったところを質問したりなどしたよ)

今回のChatGPTをうまくつかって事案を解決できた経験はこれからのコーディングにも活かせるだろう。
ただし、それと同時に、コードが正しいかどうかを見極めることができるようになるためにもこれからも勉強をし続ける必要はある。
知識がないとChatGPTは使いこなせない。
そのことを実感した出来事だったのでここに記録しておく。