Site icon Tips Note by TAM

【WordPress】カスタム投稿タイプの記事をカスタムフィールドの値順で並び替える

記事の投稿日ではなく、カスタムフィールドに入力した日付を判定して記事を一覧表示させる方法をご紹介いたします。

 実装したかったこと

  • イベント開催日としてカスタムフィールドに入力した日付で判定
  • 開催日が今日以前のイベント情報は表示させない
  • 一覧表示させるのはカスタム投稿タイプのアーカイブページ

参考サイトを見ながら下記のように設定してみました。

function event_schedul_posts($query) {
  $currnet_date = date_i18n( 'y/m/d' );
  if (is_admin() || ! $query->is_main_query())
      return;
  if ($query->is_post_type_archive('event')) {
      $query->set( 'posts_per_page', 10 );
      $query->set( 'orderby', 'meta_value' );
      $query->set( 'meta_key', 'event_date' );
      $query->set( 'order', 'ASC' );
      $query->set('meta_query',
        array(
          array(
            'key' => 'event_date',
            'value' => $currnet_date,
            'compare' => '>=',
            'type' => 'DATE'
          )
        )
      );
  }
}
add_action('pre_get_posts', 'event_schedul_posts');
上記コードをfunctions.phpに追記して、表示させたいテンプレート(カスタム投稿タイプのアーカイブページ用PHPファイル)に標準のループを記述すると表示されます。
$currnet_date = date_i18n( 'y/m/d' );
  現在日時取得を取得して変数「currnet_date」に格納します。
if ($query->is_post_type_archive('event')) {
  is_post_type_archive('投稿タイプ名')で表示させたいカスタム投稿タイプを設定します。
$query->set( 'posts_per_page', 10 );
  10件ずつ表示させます。全件表示させたいときは -1 を指定します。
$query->set( 'orderby', 'meta_value' );
$query->set( 'meta_key', 'event_date' );
  meta_keyでカスタムフィールドを指定し、orderbyでmeta_valueを選択します。
$query->set('meta_query',
  array(
    array(
      'key' => 'event_date',
      'value' => $currnet_date,
      'compare' => '>=',
      'type' => 'DATE'
    )
  )
);
  カスタムフィールドの日付と今日の日付を比べて今日以降の記事だけを表示するように条件指定しています。

meta_queryパラメータは、カスタムフィールドの絞り込み条件を指定するためのもので、
複数の条件を組み合わせて設定することもできます。