在wp_INSERT_POST()之后,DATE_I18N()和DATE()输出将调整为GMT

时间:2013-01-11 作者:pistolshrimp

我在客户服务器(vps)上遇到了一个非常奇怪的问题。下面的代码在我的服务器上运行良好。基本上,特定的unix时间戳格式正确,只要调用wp\\u insert\\u post(),日期就会调整为GMT。例如:

echo "date_i18n of 1366495200: " . date_i18n(\'Y-m-d H:i\', 1366495200 ). \'<br />\';
echo "date of 1366495200: " . date(\'Y-m-d H:i\', 1366495200 ). \'<br />\';
// Both output >>> 2013-04-21 00:00 , correct based on server settings

 $_post = array(
            \'post_type\' => \'my_cpt\',
            \'post_title\' => \'my title\',
            \'post_content\' => \'\',
            \'post_status\' => \'publish\'
        );

$new_post_ID = wp_insert_post( $_post );

echo "date_i18n of 1366495200: " . date_i18n(\'Y-m-d H:i\', 1366495200 ). \'<br />\';
echo "date of 1366495200: " . date(\'Y-m-d H:i\', 1366495200 ). \'<br />\';
// new output >>> 2013-04-20 22:00 <<<
有人有什么见解吗?

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

如果您没有将日期传递给wp_insert_post(), get_gmt_from_date() 被调用。看看这个函数的内容:

function get_gmt_from_date($string, $format = \'Y-m-d H:i:s\') {
    preg_match(\'#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#\', $string, $matches);
    if ( ! $matches )
        return date( $format, 0 );

    $tz = get_option(\'timezone_string\');
    if ( $tz ) {
        date_default_timezone_set( $tz );
        $datetime = date_create( $string );
        if ( ! $datetime )
            return date( $format, 0 );

        $datetime->setTimezone( new DateTimeZone(\'UTC\') );
        $offset = $datetime->getOffset();
        $datetime->modify( \'+\' . $offset / HOUR_IN_SECONDS . \' hours\');
        $string_gmt = gmdate($format, $datetime->format(\'U\'));

        date_default_timezone_set(\'UTC\');
    } else {
        $string_time = gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
        $string_gmt = gmdate($format, $string_time - get_option(\'gmt_offset\') * HOUR_IN_SECONDS);
    }
    return $string_gmt;
}
它根据选项中的设置更改时区timezone_string. 所以请转到wp-admin/options-general.php 并设置适当的时区。或为每个参数传递有效日期post_date.

结束

相关推荐

Hook into WordPress update?

我想知道是否有任何方法可以连接到WordPress更新过程并发送$_POST 要更新服务器的变量?我正在从私有服务器上提供插件/主题更新,并将其与以下内容挂钩:add_filter(\'pre_set_site_transient_update_themes\', \'check_for_update\');这很好用。新版本的主题/插件显示在“Dashboard”>“update”下,我可以更新。但问题是,我希望用户只有在提供了正确的登录/密码(首先通过add_option()). 理想情况下,除非