質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • PHP

    20343questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    7208questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • MySQL

    5854questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

カスタムフィールドに記入した日付をバラして取得したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 919

jester

score 2

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/02/16 17:10

    「カスタムフィールドテンプレート」というプラグインがあります。それを使用しているということでしょうか。

    キャンセル

  • jester

    2017/02/16 17:22

    説明不足で申し訳ございません。「カスタムフィールドテンプレート」のプラグインを使用しております。

    キャンセル

回答 3

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; ?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/16 18:38

    ご回答いただきありがとうございます。
    functions.phpに記入したところ表示が真っ白になってしまいましたので、どこかにエラーがあるのかもしれないです。。
    ただやりたいことにかなり近づきましたので、もし改善方法などございましたら教えていただければ非常にありがたいです。
    どうぞよろしくお願いいたします。

    キャンセル

  • 2017/02/16 18:45

    if文の括弧開くが多かったため、修正しました。

    キャンセル

  • 2017/02/16 19:25

    早速修正いただき、ありがとうございました。
    確認させていただいたところ、カスタムフィールドテンプレートのテキストボックスに「●●●●年●●月●●日」と入力した場合は、希望通り日付をバラして取得することができました。
    しかし「●●●●年●●月」と入力した場合、「●●●●年●●月」の形で取得したいのですが、「日付の形式が無効です」が表示されてしまいます。
    何度も大変恐縮ですが、ご教示いただけたらと思います。どうぞよろしくお願いいたします。

    キャンセル

  • 2017/02/16 20:33

    ここが原因かな?と思われるところがあったので、normalizeTime関数の方を修正しました。
    相変わらず動作チェックをしていないので上手くいくかわかりませんが、お試しください。

    キャンセル

  • 2017/02/17 08:25

    お返事遅くなり申し訳ございません。修正いただき、ありがとうございました。
    確認させていただきましたが、やはりカスタムフィールドテンプレートのテキストボックスに「●●●●年●●月」と入力した場合、「日付の形式が無効です」が表示されてしまいます。
    何度もご確認いただいたのにすみません。。

    キャンセル

  • 2017/02/17 15:41

    こちらこそ何度も間違いコードを提示してしまって申し訳ないです。
    今度こそ大丈夫なはずなのでお試しください。

    キャンセル

  • 2017/02/17 16:30

    ありがとうございます!
    確認させていただき、何とか無事どちらの場合にも日付をバラして取得することができました。
    先頭0埋めだけが何故だか機能しませんでしたが、取り急ぎ値を取得でき大変助かっております。
    何度もお返事いただき、本当にありがとうございました。

    キャンセル

+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 "不明";
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/16 17:53

    ご回答いただき、ありがとうございます。
    「●●●●年●●月」(年月のみ)で入力した場合でも、正しい年月の数値で「●●●●年●●月」と表示したいと考えています。この場合、日は表示させたくないので、if文が必要かと考えています。
    知識不足で恐縮ですが、どうぞよろしくお願いいたします。

    キャンセル

-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>';
}


日付の正当性確認は最初のリンクを見て下さい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/16 18:30

    '2017年20月' が成立する。。。誰か助けて。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20343questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    7208questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • MySQL

    5854questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。