Форматирование настраиваемого мета-поля даты с ГГГГ/ММ/ДД на более читаемую альтернативу


ВОПРОС

Это следует за предыдущим вопросом, на который Мило любезно ответил ранее здесь - Как сортировать CPT по пользовательскому мета-значению (дате) и возвращать сообщения месяц за месяцем

Короче говоря, у меня возникли некоторые проблемы с правильным форматированием даты моего пользовательского мета-поля в нескольких областях... А именно, в фоновом режиме в моих пользовательских столбцах, а затем в интерфейсе в моем шаблоне архива.

Например, в моем шаблоне архива я пытаюсь верните текущую дату, к которой относятся сообщения, с помощью кода, вставленного ниже, но когда я посещаю месяц без сообщений, мой шаблон вместо этого возвращает дату "Январь 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>
                

Кроме того, в серверной части я пытаюсь сделать так, чтобы, если создается только "дата начала", выводилась ТОЛЬКО эта информация, тогда как, если пользователь вводит как "дату начала", так и "дату окончания", затем перенастраиваю обе даты, но когда я использую пример кода ниже, мои даты начала возвращаются в двух экземплярах, как это вместо этого: 3 марта 2013 года - 3 марта 2013 года.

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;

Перенаправление /календарь -> /календарь/гггг/мм:

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');
Author: Community, 2013-03-13

1 answers

Но когда я посещаю месяц без сообщений, мой шаблон возвращает дату Вместо этого "Январь 1970".

Да. Это произойдет. UNIXTIME начался 1 января 1970 года. Это "0000/00/00", но отрицательные числа работают до 1901 года. strtotime вернет false для всего, что выходит за пределы этого диапазона, включая ваши несуществующие даты. date будет принимать "нулевой день", если указана плохая дата, следовательно, вы получите 1 января 1970 года для несуществующих или иным образом ошибочных дат. 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
}

Ваш другой код немного громоздкий, но, похоже, он должен работать, за исключением того, что ваш формат даты неверен. Вы получаете не "День месяца, год", как я подозреваю, вы хотите, а "Название месяца, Номер месяца, год", который будет выглядеть как дубликат, если две даты относятся к одному и тому же месяцу/году. Внимательно посмотрите на операторы форматирования даты.

$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
Author: s_ha_dum, 2013-03-16 21:11:38