Wordpressにカスタムフィールドテンプレートを設置し、テキストボックスに入力した日付(年月日)をバラして取得したいと考えています。
なお、テキストボックスには「●●●●年●●月●●日」と記入される場合と、「●●●●年●●月」(年月のみ)の場合があります。
カスタムフィールドの日付の取得方法は、以下のページを参考にしています。
参考サイト:http://unot13.hatenablog.com/entry/2014/03/05/093459
まずfunctions.phpに以下を記入しました。
<?php
function normalizeTime($date_str) {
// 年月日の各パーツを分割する
preg_match( "/([0-9]*)年([0-9]*)月([0-9]*)日/", $date_str, $data );
if ( Count( $data ) != 4 ) {
return $str;
}
// 先頭0埋めでYYYYMMDD形式の日付文字列に変換する
$outStr = sprintf( "%04.4d/%02.2d/%02.2d", $data[1], $data[2], $data[3] );
return strtotime($outStr);
}
?>
htmlには、以下のように記入しています。
<p class="year">
<?php
// カスタムフィールドを取得する
$event_date1 = post_custom('event_date1');
// 日付の文字列を変換
$event_date1_time = date_i18n('Y', normalizeTime($event_date1)); ?>
<?php echo $event_date1_time ?>
年</p>
<p class="month">
<?php
// カスタムフィールドを取得する
$event_date1 = post_custom('event_date1');
// 日付の文字列を変換
$event_date1_time = date_i18n('m', normalizeTime($event_date1)); ?>
<?php echo $event_date1_time ?>
月</p>
<p class="date">
<?php
// カスタムフィールドを取得する
$event_date1 = post_custom('event_date1');
// 日付の文字列を変換
$event_date1_time = date_i18n('d', normalizeTime($event_date1)); ?>
<?php echo $event_date1_time ?>
日</p>
これで、カスタムフィールドテンプレートのテキストボックスに「●●●●年●●月●●日」と入力した場合に年月日の数値をバラして取得することはできました。
しかし、テキストボックスに「●●●●年●●月」(年月のみ)で入力した場合、「1970年01月01日」と表示されてしまいます。
年月日、年月のどちらにも対応して、日付をバラして取得する方法を教えていただきたいです。
どうぞよろしくお願いいたします。
【追記】
無事解決しましたので、最終コードを記載させていただきます。
ご回答いただき、ありがとうございました。
functions.phpに以下を記入しました。
<?php
//カスタムフィールドの日付のフォーマット変更
function normalizeTime($date_str) {
// 年月日の各パーツを分割する
preg_match( "/([0-9]*)年([0-9]*)月([0-9]*)日/", $date_str, $data );
if( empty($data) ) {
preg_match( "/([0-9]*)年([0-9]*)月/", $date_str, $data );
}
if( Count( $data ) == 4 ) {
// 先頭0埋めでYYYYMMDD形式の日付文字列に変換する
$outStr = sprintf( "%04.4d/%02.2d/%02.2d", $data[1], $data[2], $data[3] );
}
else if( Count( $data ) == 3 ) {
// 先頭0埋めでYYYYMM形式の日付文字列に変換する
$outStr = sprintf( "%04.4d/%02.2d/01", $data[1], $data[2] );
}
else {
$outStr = '';
}
return strtotime($outStr);
}
?>
htmlには、以下のように記入しています。
※曜日の取得も追加しています。
<?php $event_date1 = post_custom('event_date1');
$normalize_time = normalizeTime($event_date1);
if( $normalize_time != false ) : ?>
<p class="year"><?php echo date_i18n('Y', $normalize_time); ?>年</p>
<p class="month"><?php echo date_i18n('m', $normalize_time); ?>月</p>
<?php //テキストに日を含む場合
if(strpos($event_date1,'日') !== false) : ?>
<p class="date"><?php echo date_i18n('d', $normalize_time); ?>日</p>
<p class="week">(
<?php $date = date_i18n('Y/m/d', $normalize_time);
$week = array("日", "月", "火", "水", "木", "金", "土");
$time = strtotime($date);
$w = date("w", $time);
echo $week[$w]; ?>
)</p>
<?php else : ?><?php endif; ?>
<?php else : ?>
<p>日付の形式が無効です</p>
<?php endif; ?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
動作確認していないので、エラーがあるかもしれませんが。
<?php
function normalizeTime($date_str) {
// 年月日の各パーツを分割する
preg_match( "/([0-9]*)年([0-9]*)月([0-9]*)日/", $date_str, $data );
if( empty($data) ) {
preg_match( "/([0-9]*)年([0-9]*)月/", $date_str, $data );
}
if( Count( $data ) == 4 ) {
// 先頭0埋めでYYYYMMDD形式の日付文字列に変換する
$outStr = sprintf( "%04.4d/%02.2d/%02.2d", $data[1], $data[2], $data[3] );
}
else if( Count( $data ) == 3 ) {
// 先頭0埋めでYYYYMM形式の日付文字列に変換する
$outStr = sprintf( "%04.4d/%02.2d/01", $data[1], $data[2] );
}
else {
$outStr = '';
}
return strtotime($outStr);
}
?>
<?php
$event_date1 = post_custom('event_date1');
$normalize_time = normalizeTime($event_date1);
if( $normalize_time != false ) : ?>
<p class="year">
<?php echo date_i18n('Y', $normalize_time); ?>
年
</p>
<p class="month">
<?php echo date_i18n('m', $normalize_time); ?>
月
</p>
<?php // $event_date1に'日'という文字が含まれているか ?>
<?php if(strpos($event_date1,'日') !== false) : ?>
<p class="date">
<?php echo date_i18n('d', $normalize_time); ?>
日
</p>
<?php endif; ?>
<?php else : ?>
<p>日付の形式が無効です</p>
<?php endif; ?>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
「●●●●年●●月」(年月のみ)で入力した場合、どう表現されるのが正解なのでしょうか?
print normalizeTime("2017年2月16日")."<br>";
print normalizeTime("2017年2月")."<br>";
function normalizeTime($date_str) {
$pattern="/(\d{4})年(\d{1,2})月(\d{1,2}(?=日))?/";
if(preg_match($pattern,$date_str,$match)){
return date("Y/m/d",mktime(0,0,0,$match[2],isset($match[3])?$match[3]:1,$match[1]));
}else{
return "不明";
}
}
追記
例えばこうすると年月だけ拾えます
print normalizeTime("2017年2月16日")."<br>";// y/m/d
print normalizeTime("2017年2月")."<br>";// y/m
print normalizeTime("2017年2月99日")."<br>";// ありえない日付なので不明
print normalizeTime("2017年2月160日")."<br>"; // 日付が3桁なので日付を無視して y/m
function normalizeTime($date_str) {
$pattern="/(\d{4})年(\d{1,2})月(?:(\d{1,2})(?=日))?/";
if(preg_match($pattern,$date_str,$match) and checkdate($match[2],isset($match[3])?$match[3]:1,$match[1])){
return date(isset($match[3])?"Y/m/d":"Y/m",mktime(0,0,0,$match[2],isset($match[3])?$match[3]:1,$match[1]));
}else{
return "不明";
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-2
ちょうどよい質問がありました。
ユーザーの入力した文字列が日付として有効かどうかをチェックする方法
そちらのフォーマットを変更したものを作成してみました。
<?php
$dates = [
'2017年02月8日',
'2017年02月',
'2017年2月08日',
'2017年2月',
'17年2月08日',
'17年2月',
'2017年02月30日',
'2017年20月',
'2017-02-28',
'2017/02/28',
'20170228',
'2016-02-29',
'1800-02-28',
'2017-02-31',
'17-02-29',
'hogehoge',
];
function chk_date($date) {
$formats = [
'Y年m月d日',
'Y年m月',
'Y年n月d日',
'Y年n月',
'y年m月d日',
'y年m月',
'y年n月d日',
'y年n月',
];
foreach ( $formats as $format ) {
DateTime::createFromFormat ( $format, $date );
$date_parse = date_parse_from_format ( $format ,$date );
$result = DateTime::getLastErrors ();
if (! $result ['warning_count'] && ! $result ['error_count']) {
var_dump($date_parse);
// echo '年:' . $date_parse['year'] . '<br>';
// echo '月:' . $date_parse['month'] . '<br>';
// echo ($date_parse['day'])?'日:' .$date_parse['day'] . '<br>' :'';
// echo ' => ';
return TRUE;
}
}
return FALSE;
}
foreach ( $dates as $date ) {
echo $date . ' => <br>';
echo chk_date ( $date ) ? 'OK' : 'NG';
echo '<br><br>';
}
日付の正当性確認は最初のリンクを見て下さい。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
kei344
2017/02/16 17:10
「カスタムフィールドテンプレート」というプラグインがあります。それを使用しているということでしょうか。
jester
2017/02/16 17:22
説明不足で申し訳ございません。「カスタムフィールドテンプレート」のプラグインを使用しております。