WordPressの投稿一覧やカテゴリーアーカイブ等で、本日の日付よりも古い記事を非表示にする方法をご紹介したいと思います。
「カスタムフィールドの日付が今日よりも前か判別する方法」と「投稿日が今日よりも前か判別する方法」の2パターンをご紹介いたします。
WordPressの投稿一覧で本日の日付よりも古い記事を非表示にする方法
カスタムフィールドの値から判別する方法
まずは、カスタムフィールドに設定した日付が今日よりも前かどうかを判別し、日付が今日よりも前であれば一覧から非表示にする方法です。
下記コードをfunctions.phpに記述することで、カスタムフィールドに設定された日付よりも古い記事は「ホームの記事一覧」「カテゴリーアーカイブ」「タグアーカイブ」「月別アーカイブ」で表示されなくなります。
function posts_change_sort( $query ) { if ( is_admin() || ! $query->is_main_query() ) { return; } $current_date = date_i18n( 'y/m/d' ); if ( $query->is_home() || $query->is_category() || $query->is_tag() || $query->is_month() ) { $query->set( 'order', 'ASC' ); $query->set( 'orderby', 'date' ); $query->set('meta_query', array( array( 'key' => 'custom_date', //カスタムフィールド名 'value' => $current_date, 'compare' => '>=', 'type' => 'DATE' ) ) ); } } add_action( 'pre_get_posts', 'posts_change_sort' );
「date_i18n( ‘y/m/d’ )」で本日の日付を取得し、「custom_date」の値と比較しています。「custom_date」は該当のカスタムフィールド名に変更してください。
「$query->is_home() || $query->is_category() || $query->is_tag() || $query->is_month()」が日付の判別を反映させるページになるので、条件を指定する必要がないページは削除してください。逆に追加したいページがある場合は、条件を追加します。
また、「$query->set( ‘order’, ‘ASC’ )」と「$query->set( ‘orderby’, ‘date’ )」で投稿日が古い順に並べ替えているので、こちらも必要ない場合は削除・変更してください。
投稿日で判別する方法
投稿日が本日の日付よりも古いかどうかを判別するには、以下のように記述します。
function posts_change_sort( $query ) { if ( is_admin() || ! $query->is_main_query() ) { return; } $current_year = date_i18n( 'y' ); $current_month = date_i18n( 'm' ); $current_day = date_i18n( 'd' ); if ( $query->is_home() || $query->is_category() || $query->is_tag() || $query->is_month() ) { $query->set( 'order', 'ASC' ); $query->set( 'orderby', 'date' ); $query->set('date_query', array( array( 'year' => $current_year, 'month' => $current_month, 'day' => $current_day, 'compare' => '>=', 'column' => 'post_date' ) ) ); } } add_action( 'pre_get_posts', 'posts_change_sort' );
投稿日が今日よりも前の記事を非表示にすることはないかもしれませんが、上記のように投稿日と比較して記事を絞り込むことも可能です。
あとがき
いずれもpre_get_postsを使って記事を絞り込んでいます。表示する記事を絞り込んだり、並び順を変更したりする時は、pre_get_postsを使えば各テーマフィアルを触らなくて済むので楽ですね。