かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress 投稿の並び順の指定を複数にしたい。

WordPressで投稿の並び順を操作する時
まずは、カスタムフィールドの値で並べて
カスタムフィールドの値が同じだったら投稿日順に並べる
のように並び替えの条件を複数使いたい時があったのでメモ。

投稿に発売日を入力するrelease_timeというカスタムフィールドを作っていたとします。 このrelease_timeが新しい順(大きい順)にして、発売日が同じだと管理画面で登録したのが新しいもの順になるイメージです。release_timeにはstrtotimeのような感じで数値が入ってるものとします

pre_get_posts で投稿のアーカイブページの時の並び順を変更させます。

<?php // function.php

function change_posts_query( $query ) {
  if( is_archive() ) {
    // 並び替えに使うカスタムフィールドを指定する
    $query->set('meta_key', 'release_time');
    // カスタムフィールド順 > 日付順
    // スペースを入れて2番目の並び順を指定する
    $query->set('orderby', 'meta_value_num date');
    // 大きい方から順番にする (降順)
    $query->set('order', 'DESC');
  }
}
add_action('pre_get_posts', 'change_posts_query');

これで上手く 発売日(release_time)が新しい順かつ発売日が同じだったら投稿日の新しい順で表示させることができました。

ただ、このケースの場合 発売日も投稿日も両方とも降順で指定したいという要件だったのでorderbyの指定をスペース区切りで増やすだけでうまくいきましたが、発売日は新しい順(降順)で発売日が同じだったら投稿日が古い順(昇順)にしたいのようにorderの条件が異なっている場合はこの方法では上手くいきません。
その方法はそのうち調べたら書きたいと思います。。。  

やりました。
orderを別々に指定する方法
 


[参考]