WordPress 未来の日付の投稿の表示方法

WordPress 未来の日付の投稿の表示方法

WordPress で未来の日付の投稿を表示する方法を紹介します。
例えば、未来の予定を表示するスケジュールページを作りたい場合に便利な方法です。
そのほかに、現在から三ヶ月後までの投稿を表示する期間を指定した表示方法を合わせて紹介します。

  1. 未来の日付の投稿を表示する
  2. 公開日時を基準に期間を指定して投稿を表示

未来の日付の投稿を表示する

未来の日付の投稿を表示する方法を紹介します。
この方法は、Tips Note by TAM さんの【WordPress】未来投稿機能を無効にする方法で紹介されている方法を参考にさせていただきました。

未来の日付の投稿を表示するには、投稿の投稿ステータスを予約済から公開済にする必要があります。
通常、投稿を未来の日付にすると投稿ステータスは予約済になり、投稿は予約投稿の状態になります。
この投稿ステータスを公開済に変更できると、未来の日付でも投稿を表示することができるため、投稿ステータスを上書できるようにカスタマイズします。
例えば、カスタム投稿タイプ schedule の投稿を、未来の日付でも表示できるようにするには、次のコードを functions.php に追加します。

/* 【出力カスタマイズ】未来の日付の投稿を表示する */
function stop_post_status_future_func($data,$postarr) {
if ( ( $data['post_type'] == 'schedule' && $data['post_status'] == 'future' ) && $postarr['post_status'] == 'publish' ){
$data['post_status'] = 'publish';
}
return $data;
};
add_filter( 'wp_insert_post_data', 'stop_post_status_future_func', 10, 2 );

通常は、新規投稿に未来の日付を設定、予約投稿のボタンを押したタイミングでステータスを上書きします。

コード追加前からある予約済の投稿は、手動で投稿ステータスを更新する必要があります。
方法は、一度予約済の投稿を下書き状態に変更、変更後に改めて予約済投稿で更新するとステータスを更新できます。

投稿タイプの指定は、コード冒頭の $data['post_type'] == 'schedule'schedule の部分を任意の投稿タイプに変更して利用してください。
特定の投稿タイプを除外する場合は $data['post_type'] == 'schedule' の比較演算子 ==(等しい場合)から !=(等しくない場合に) に変更することで対応できます。

投稿の表示方法はWordPress メインループとサブループの表示方法を紹介をごらんください。

公開日時を基準に期間を指定して投稿を表示

投稿の公開日時が今月から三ヶ月後までの間の投稿を表示したい場合など、期間指定をして投稿を表示する方法を紹介します。
この方法は、先に紹介した未来の日付の投稿を表示が実装されていないと未来の日付の投稿は表示されません。
例えば、今日の日付を元に今月から三ヶ月後までの投稿を表示できるようにするには、次のコードを任意のテンプレートファイルに追加します。

<?php
// 今日の日付を取得
date_default_timezone_set('Asia/Tokyo'); // タイムゾーンの指定(必要なければ削除)
$this_date = date('Y-m-1'); // 今日の日付を元に今月の月初めを取得
$this_year = date('Y', strtotime($this_date)); // 年を取得
$this_month = date('m', strtotime($this_date)); // 月を取得
// 今日を基準に数カ月後の日付を取得
$in_three_month = date('Y-m-1',strtotime($this_date . "+2 month")); // 数ヶ月後の日時を取得
$in_three_month_year = date('Y', strtotime($in_three_month)); // 数カ月後の年を取得
$in_three_month = date('m', strtotime($in_three_month)); // 数カ月後の月を取得
?>
<?php // クエリのカスタマイズ
$args = array(
'post_type' => 'education', // カスタム投稿タイプ education
'order' => 'ASC',
'date_query' => array( // 期間指定
array(
'compare'=>'BETWEEN', // 2つの値で指定した範囲内
'inclusive'=>true, // 2つの値で指定した範囲内を含む
'after' => array(
'year' => $this_year, // 今年
'month' => $this_month, // 今月
),
'before' => array(
'year' => $in_three_month_year, // 数カ月後の年
'month' => $in_three_month, // 数カ月後の月
),
),
),
);
$the_query = new WP_Query($args); if($the_query->have_posts()):
?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<?php // 月の表示
if ($month != get_the_date('n')){ // 同じ月でなければ表示
$month = get_the_date('n'); // 月の取得
echo get_the_date('Y').'年'.$month.'月<br />';
}
?>
<a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>

ポイントは、日付の取得で月初めの日付を取得する。
例えば、31日など月によってない日があると次の月へ繰り越してしまうため、取得する日付を月初めにして処理します。
このコードは月ごとにその月が表示されるようになっています。月の表示が不要であれば、該当箇所を削除してください。

取得する月を変更する場合は、$in_three_month = date('Y-m-1',strtotime($this_date . "+2 month"));+2 を任意の数字に変更してください。

その他、タイムゾーンの指定 date_default_timezone_set('Asia/Tokyo'); が必要なければ削除してください。

まとめ

WordPress で未来の日付の投稿を表示する方法を紹介しました。