WP站长应该大部分都遇到过WP用户注册时数据库记录的用户注册时间跟实际时间不一致一般要相差8个小时,这个问题一直都没有什么修正的插件或者代码,或许这是WP程序在国内运行的一个BUG,为什么这么说呢,请看我们下面的解析最后会附上处理方法和所需代码。

wordpress时区问题代码片段
wordpress时区问题代码片段

问题解析

要分析这个问题当然要开始分析WP程序的源代码,我们找到用户注册时负责写入数据库的函数wp_insert_user()在这个函数中生成用户注册时间字段是用的gmdate( ‘Y-m-d H:i:s’ )函数(代码片段见上方截图),并不是我们熟知的date函数,这两个函数的区别就是gmdate函数是直接调用的UTC国际时区进行时间生成,date是根据环境时区进行时间生成,现在明白问题在哪里了吧,就是因为gmdate调用的是UTC时区,该时区跟国内的时间相差8个小时左右,所以国内的所有WordPress网站记录的用户注册时间都会差上8个小时,而国外的用户则基本不会收到影响。所以上面我才说这可能是国内的一个bug,那么这个时间错误有什么影响呢?

错误的影响

第一,无法准确记录用户的注册时间,如果您的网站没有前端用户页面并且没有进入数据库查看的话或许没有什么影响,但是如果前端页面有显示用户的注册时间,那么就会发现这个时间不准确对用户的误导还是很大的,特别是新注册的用户。

第二,无法进行精准统计,如果您想统计每天网站的注册人数,那么要令您失望了,因为记录的源信息错误您无法实现精准的日注册人数的统计分析,您一直用的都是错误的数据。

问题修复代码

对于WP程序修改程序源代码肯定是非常不明智的,官方提供了大量的过滤器方便我们对程序进行修改,下面我们就使用wp_pre_insert_user_data这个过滤器对这个问题进行修复,下面是修复代码,大家可以复制之后放置到主题的functions.php文件中。

/** 修复注册时区问题  */
add_filter('wp_pre_insert_user_data', 'xhtheme_registeredDate', 10,2); 
public function xhtheme_registeredDate($data,$update){
   if( !$update ){
        $data['user_registered'] = date('Y-m-d H:i:s');
   }
   return $data;
}

上面的代码我们使用date函数重写了user_registered字段,那么数据库保存的时候就是正确的时间,到此这个问题我们已经完美修复了这个问题!

Meteor主题高级版已内置该修复项,无需再次添加该代码,查看Meteor主题

-- END --