web関連

カスタムフィールドのDate Picker(デイトピッカー)を使って日時の条件分岐

カスタムフィールドのDate Picker(デイトピッカー)を使って日時の条件分岐

カスタムフィールドのDate Picker(デイトピッカー)を使って、カスタム投稿内で指定した日時が来たら当日中の表示、指定した日時を過ぎたら次に用意した項目を表示するphpを使ったので備忘録がてらにメモ

実際のコード

<?php
$args = array(
'posts_per_page' => '-1',
'post_type' => 'カスタム投稿名',
'post_status' => 'publish',
'meta_key' => 'カスタマフィールド名',
'orderby' => 'meta_value',
'order' => 'ASC',
);
$posts = get_posts( $args );
if( $posts ) : foreach( $posts as $post ) : setup_postdata( $post );
?>
<?php
$eDate = get_post_meta( get_the_ID(), 'カスタムフィールド名', true );
$date = date_create( $eDate );
$eYear = date_format($date,'Y');
$eMonth = date_format($date,'n');
$eDay = date_format($date,'j');
$today = date_i18n('Ymd');
$preriod = strtotime($eDate) < strtotime($today);
$eToday = strtotime($eDate) <= strtotime($today);
?>
<?php if( $preriod ): ?>
// 日時が過ぎた投稿が入ってくる(基本的に何も入れません)
<?php elseif( $todays ): ?>
// 当日中の表示(ここと)
<?php break; ?>
<?php else: ?>
// 指定した日時を過ぎたら(ここを使う)
<?php break; ?>
<?php endif; ?>

<?php endforeach; ?>
<?php else : ?>
<?php endif;
wp_reset_postdata(); ?>

コード紹介

カスタム投稿を全件表示

$args = array(
	'posts_per_page' => '-1',
	'post_type'      => 'カスタム投稿名',
	'post_status'    => 'publish',
	'meta_key'       => 'カスタマフィールド名',
	'orderby'        => 'meta_value',
	'order'          => 'ASC',
);

該当のカスタム投稿を「-1」で全件表示させます。
meta_keyでDate Picker(デイトピッカー)を使ってるカスタムフィールド名を指定して、orderbyを「meta_value」にすることでカスタムフィールドの値で並べ替え出来るようになります。

設定は用途に合わせて変えてください。

日時関連を変数に代入

<?php
$eDate = get_post_meta( get_the_ID(), 'カスタムフィールド名', true ); // カスタムフィールドの値を取得
$date = date_create( $eDate ); // オブジェクト化?
$eYear = date_format($date,'Y'); // 「年」を抜き出す
$eMonth = date_format($date,'n'); // 「月」を抜き出す
$eDay = date_format($date,'j'); // 「日」を抜き出す
$today = date_i18n('Ymd'); // 今日の日時を取得
$preriod = strtotime($eDate) < strtotime($today); // 今日の日付を含まない明日以降の日時かどうか取得
$eToday = strtotime($eDate) <= strtotime($today); // 今日の日付を含む明日以降の日時かどうか取得
?>

get_post_meta()を使ってカスタムフィールドの値を取得する。
取得した値をdate_create()関数を使って「DateTime オブジェクト」にして?date_format()で表示方法を変更できるようにする。
※すんませんこの辺詳しくない

「$today」で今日の日付を取得して「$preriod」で今日の日付を含まない明日以降日時を含んだカスタマフィールドの投稿を取得して、「$eToday」で今日の日付を含む明日以降の投稿を取得しています。

「date_create()関数」と同じ様な使い方ができる「DateTime()クラス」というものがある。
「DateTime()クラス」の方がメジャーなのか「date_create()関数」より記事が多いいからこっちを使った方がいいのかも…あまりphpに詳しくないので下に参考URL載せときます

参考

▼【PHP入門】日付を取得・比較する方法と注意点まとめ

【PHP入門】日付を取得・比較する方法と注意点まとめ

▼【PHP入門】DateTimeを使って日付をフォーマットしてみよう!
http://programming-study.com/technology/php-datetime/

▼date_createの意味・解説
https://www.weblio.jp/content/date_create

条件分岐で当日と次の投稿を表示する

<?php if( $preriod ): ?>
<?php elseif( $todays ): ?>
// 当日中の表示(ここと)
<?php break; ?>
<?php else: ?>
// 指定した日時を過ぎたら(ここを使う)
<?php break; ?>
<?php endif; ?>

最初のif( $preriod )のところは今日という日より前の投稿が表示される箇所なので何もいれません。

elseif( $todays )に当日中に表示したい記述を書きます。

elseで今日の日付を含まない明日以降の一番近い日時の投稿を表示します。

break;で1件表示したらループを脱出しています。

当日や次の日以降の投稿を取得する記事が見つからないから四苦八苦しながらなんとかしました。
社内にも知り合いにもphp使いこなせて暇な人がいないから完全に独学なので変な説明があっても許してください。