web-dev-qa-db-ja.com

カスタムメタボックスの日付をYYYY/MM/DDから読みやすい形式にフォーマットする

質問

これは、以前にここでMiloによって親切に答えられた以前の質問に続いています - カスタムメタ値(日付)でCPTをソートし、月ごとに投稿を返す方法

つまり、カスタムメタボックスの日付をいくつかの領域で正しくフォーマットすることに問題があります。つまり、カスタム列のバックエンドで、次にアーカイブテンプレートのフロントエンドで問題があります。

たとえば、私のアーカイブテンプレートでは、投稿が属する現在の日付を下に貼り付けたコードで返すようにしていますが、投稿のない月にアクセスすると、テンプレートは代わりに "January 1970"という日付を返します。

<?php $calendar_month = get_post_meta($post->ID, 'epr_startdate', TRUE);?>
<?php $this_month = strtotime($calendar_month); ?>
<span id="current_month"><?php echo date( 'F Y', $this_month ); ?></span>

さらに、バックエンドでは、「開始日」だけが作成された場合にその情報のみを出力するようにし、ユーザーが「開始日」と「終了日」の両方を入力した場合は、両方の日付を再調整しますが、開始日の下のコード例を使用すると、代わりに次のように重複して返されます。2013年3月3日〜2013年3月3日。

case "eventdate":
                $eventstart = get_post_meta($post->ID, 'epr_startdate', true);
                $eventstart_col = strtotime($eventstart);

                $eventend = get_post_meta($post->ID, 'epr_enddate', true);
                $eventend_col = strtotime($eventend);

                if ( get_post_meta($post->ID, 'epr_startdate', true) && ! get_post_meta($post->ID, 'epr_enddate', true) )
                    echo date( 'M n, Y', $eventstart_col );
                elseif ( get_post_meta($post->ID, 'epr_enddate', true) )
                    echo date( 'M n, Y', $eventstart_col ) . ' &mdash; ' . date( 'M n, Y', $eventend_col );
                else
                    echo 'NA';
                break;

ご清聴ありがとうございました。
ベスト


最終的解決

s_ha_dum に感謝します。彼の忍耐とサポートのために!
以下は、私の質問に対する最終的な解決策です。

現在照会されている月に投稿が存在しない場合の日付を正しく出力する:

<?php $this_month = strtotime($calendar_month);
if (false === $this_month) {
$this_month = strtotime(get_query_var( 'calendar_year' ) . get_query_var( 'calendar_month' ) .'01');
} ?>
<span id="current_month"><?php echo date( 'F Y', $this_month ); ?></span><?php
?>

カスタム列:

case "eventdate":
                $start_date = get_post_meta($post->ID, 'epr_startdate', true);
                $start_date_col = strtotime($start_date);           
                $end_date = get_post_meta($post->ID, 'epr_enddate', true);
                $end_date_col = strtotime($end_date);

                if ( $start_date_col && !$end_date_col ) 
                    echo date( 'M d, Y', $start_date_col );
                elseif ( $start_date_col && $end_date_col )
                    echo date( 'M d, Y', $start_date_col ) . ' &mdash; ' . date( 'M d, Y', $end_date_col );  
                else
                    echo 'NA';
                break;

リダイレクト/カレンダー - > /カレンダー/ yyyy/mm:

function redirect_empty_archive() {
$m = get_query_var('calendar_month');
$y = get_query_var('calendar_year');
    if (
        is_post_type_archive('calendar') &&
        ( empty($m) || empty($y) )
    ) {
        wp_safe_redirect( '/calendar' . date('/Y/m') );
    }
}
add_action('template_redirect','redirect_empty_archive');
2
Mr.Brown

しかし、私が投稿のない月を訪問すると、私のテンプレートは代わりに "January 1970"という日付を返します。

はい。それが起こるでしょう。 UNIXTIMEは1970年1月1日に始まりました。それは "0000/00/00"ですが、負の数は1901年のいつかまで遡ります。strtotimeは、存在しない日付を含め、その範囲外のものに対してはfalseを返します。 dateは、悪い日付が与えられると "day zero"と見なします。そのため、存在しない日付や欠陥のある日付については1970年1月1日になります。私の記憶が正しければ、64ビットマシンではより広い範囲を処理できます。いずれにせよ存在しない日付はあなたに1970年を与えるでしょう。

$calendar_month = "1901/01/01";
$this_month = strtotime($calendar_month);
var_dump($this_month);
echo '<br />';
echo date('Y',$this_month);
echo '<br />';

あなたはそれを表示する前にあなたが良い日付を持っていることを確認したいです。

<?php $this_month = strtotime($calendar_month); 
if (false !== $this_month) { ?>
  <span id="current_month"><?php echo date( 'F Y', $this_month ); ?></span><?php
}

あなたの他のコードは少し大きいですが、あなたの日付フォーマットが間違っていることを除いてそれは動作するはずです。私が望むと思うようにあなたは「月日、年」を取得していませんが、「月名月番号、年」は、2つの日付が同じ月/年にある場合は重複しているように見えます。 日付フォーマット演算子 をよく見てください。

$eventstart = get_post_meta($post->ID, 'epr_startdate', true);
$eventstart_col = strtotime($eventstart);

$eventend = get_post_meta($post->ID, 'epr_enddate', true);
$eventend_col = strtotime($eventend);

if ( $eventstart_col && !$eventend_col ) {
    // only the start date
    echo date( 'M d, Y', $eventstart_col );
} elseif ( $eventstart_col && $eventend_col ) {
    // both start and end date
    echo date( 'M d, Y', $eventstart_col ) . ' &mdash; ' . date( 'M d, Y', $eventend_col );  
} else {
    echo 'NA';
}

正しくまとめたと思います。

2
s_ha_dum