我不知道为什么会发生这种情况。
我有一个为自定义帖子类型设置的“event\\u end\\u date”自定义元数据库。如果我将此字段留空,它总是显示帖子本身的发布日期?
我使用Custom-Metaboxes-and-Fields-for-WordPress 像这样的库…
$meta_boxes[] = array(
\'id\' => \'event_info_optional\',
\'title\' => \'Optional\',
\'pages\' => array( \'wr_event\'),
\'context\' => \'normal\',
\'show_names\' => true,
\'priority\' => \'core\',
\'fields\' => array(
array(
\'name\' => \'End time of event\',
\'id\' => $prefix . \'event_end_time\',
\'type\' => \'text_time\',
)
),
);
我这样保存值…
$wr_event_end_date = isset($_POST[\'wr_event_end_date\']) ? $_POST[\'wr_event_end_date\'] : \'\';
$event_end_date = new DateTime($wr_event_end_date);
update_post_meta($post->ID, "event_end_date", $event_end_date->getTimestamp());
我像这样查询值…
function get_event_end_date($post) {
$date = get_post_meta($post->ID, \'event_end_date\');
if ( !empty( $date[0] ) ) {
//only if a value is saved I return the value
return $date[0];
}
}
这适用于所有其他自定义字段。就我的事件结束日期而言,它不是。如果我在后端将字段留空并保存帖子,帖子本身总是将帖子的发布日期显示为事件结束日期。
为什么会这样get_event_end_date()
如果我将帖子留空,函数将返回帖子的发布日期。如果我为字段设置了一个值,它就可以正常工作,但如果我将其保留为空,我不希望函数返回任何内容。
UPDATE
// End-event-date
/*$wr_event_end_date = isset($_POST[\'wr_event_end_date\']) ? $_POST[\'wr_event_end_date\'] : \'\';
$event_end_date = new DateTime($wr_event_end_date);
update_post_meta($post->ID, "event_end_date", $event_end_date->getTimestamp());*/
if ( isset($_POST[\'wr_event_end_date\']) ) {
die(\'this is getting called even though the field is submitted blank\');
$event_end_date = new DateTime($_POST[\'wr_event_end_date\']);
update_post_meta($post->ID, "event_end_date", $event_end_date->getTimestamp());
} else {
update_post_meta($post->ID, "event_end_date", "");
}
最合适的回答,由SO网友:Adam 整理而成
我在这里半睡半醒,如果我错了,请纠正我,但在我看来,每次保存帖子时,你都在保存帖子的发布日期,
$wr_event_end_date = isset($_POST[\'wr_event_end_date\']) ? $_POST[\'wr_event_end_date\'] : \'\';
$event_end_date = new DateTime($wr_event_end_date);
update_post_meta($post->ID, "event_end_date", $event_end_date->getTimestamp());
这个
-> $event_end_date->getTimestamp()
是罪魁祸首。
所以不管你的变量是什么$wr_event_end_date
无论是否设置值,您的元值将通过getTimestamp()
因为首先没有条件语句检查,
$_POST[\'wr_event_end_date\']
如果
FALSE
将改为还原为
\'\'
(无值),然后传递给
new DateTime($wr_event_end_date);
其次,因为
new DateTime( //is now empty here );
您的
getTimestamp()
返回帖子的当前时间戳。
更新您仍应使用text_date
自定义字段,示例:
array(
\'name\' => \'Test Date Picker\',
\'desc\' => \'field description (optional)\',
\'id\' => $prefix . \'test_textdate\',
\'type\' => \'text_date\',
),
。。。不要使用时间戳,尤其是如果你没有理由使用时间戳而不是将其转换回常规日期格式,因为WordPress具有处理日期和时间格式的内置函数。
这里有一个例子;
global $post;
$text = get_post_meta( $post->ID, \'_cmb_test_textdate\', true );
$text = date(\'d F Y\', $text);
echo $text;
//prints 25 September 2012 for example
我已确保测试此库,以确保它实际上正确输出结果,而且确实如此。