【pre_get_posts】カスタムフィールドに入力した日付で今日以降の記事を表示

知人のホームページでライブスケジュールなどを見ている日以降だけ表示させたくて色々調べてみました。

前のやり方だと「query_posts」で表示させたいテンプレート上で振り分けてましたが(うちに有る本は大半これ^^;)重くなる原因になったり非推奨になってく流れの様なので、「pre_get_posts」でやってみる事に。


参考にさせて頂いたサイト
query_postsを捨てよ、pre_get_postsを使おう【追記あり】【報告あり】 | notnil creation weblog

第6回WordBench大阪 SlideShare


WordBench大阪さんの方で「query_posts」を使ってカスタムフィールドの日付を元に今日以降の記事を表示する方法が出てたので
それをベースに「pre_get_posts」で書きなおしてみました。

function custom_schedul_posts($query) {
    if ( is_admin() || ! $query->is_main_query() )
       return;

    $currnet_date = date_i18n( 'y/m/d' );

    if ( $query->is_archive('schedul') ) {
       $query->set( 'posts_per_page', -1 );
       $query->set( 'orderby', 'meta_value' );
       $query->set( 'meta_key', 'date' );
       $query->set( 'order', 'ASC' );
       $query->set('meta_query',
                                array(
                                    array(
                                    'key' => 'date',
                                    'value' => $currnet_date,
                                    'compare' => '>=',
                                    'type' => 'DATE'
           )
         )
      );
   }
}
add_action( 'pre_get_posts', 'custom_schedul_posts' );

これをfunctions.phpに書き込んで、後は受け側のテンプレート(この場合「archive-schedule.php」)に標準のループと必要なカスタムフィールドの呼び出しコード書くだけで動きました!できてしまえば「query_posts」使うより簡単な気もしますね。


コードの解説もしときましょー

    $currnet_date = date_i18n( 'y/m/d' );

「$currnet_date」に「年月日」のフォーマットで「ローカルの日付」を代入
これを「meta_query」にarrayで指定して見ている日と比較
当日以降の記事を表示って感じになってます。

$query->set('meta_query',
                  array(
                      array(
                         'key' => 'date',//カスタムフィールドの「dete」で
                         'value' => $currnet_date,//「ローカルの日付」と比較
                         'compare' => '>=',//より多いか等しい
                         'type' => 'DATE'//フォーマットは日付
           )
         )
      );

ここらへん
こういう感じで任意の項目で比較する事もできるんですね
色々勉強になしました。