【wordpress】解决文章发布时间显示为8小时前

  • 故障现象

    前几日无意发现,本博客站点后台文章发布后,来到前端展示文章列表页面,文章展示的发布时间却显示为8小时前发布的!回到后台,查看发布时间是正常的刚刚发布,这是为什么呢?

解决思路

我们知道像网页显示这种动态改变的内容,都是我们调用的某个函数变量,找到调用的方法或文件,修改它;但是设计到时间的问题,而且正好是8个小时,这个和时区极度敏感的数字,很难不让我们怀疑系统或是apache和php的时间和时区问题;

  • 解决过程

①、让我们首先确认是否是系统时间或时区的问题;

[root@oxblog ~]# date -R
Mon, 12 Jun 2017 11:49:39 +0800
[root@oxblog ~]# LANG="utf-8" hwclock
Mon Jun 12 11:49:41 2017 -1.125553 seconds
[root@oxblog ~]# cat /etc/sysconfig/clock 
ZONE="Asia/Shanghai"

可以确认系统时间也是没问题的,其实想想也是,如果系统时间有问题,其在后台也不会正确;

②、依照上面的解决思路,我们先找到网页的源代码的出处;

!--通过浏览器F12工具对网页进行检查,找到其样式:entry-meta-date;于是我到主题目录下检索--!

[root@oxblog jinsomB]# grep -ri entry-meta-date ./
./template-tags.php: printf( __( '<span class="entry-meta-date"><time datetime="%1$s">%2$s</time></span>', 'framework' ),
[root@oxblog jinsomB]# vim template-tags.php
function ht_human_time_diff($from, $to){
 $to=($to==null ? time() : $to);
 $diff = $to-$from;
 if( $diff >= 0 && $diff < 10 ){
 return __('刚刚', 'framework');
 } elseif ($diff >= 10 && $diff < 30) {
 return __('小时前', 'framework');
 } else {
 return '约 '.human_time_diff($from, $to) . ' ' . __('前', 'framework');
 }
}
if ( ! function_exists( 'ht_entry_meta_date' ) ) :
function ht_entry_date() {
 $post_date = ht_human_time_diff( get_the_time('U'), current_time('timestamp')) ;
 printf( __( '<span class="entry-meta-date"><time datetime="%1$s">%2$s</time></span>', 'framework' ),
 esc_attr( get_the_date( 'c' ) ),
 esc_html( $post_date )
 );
}
endif;
注意思考

如上我找到了template-tags.php这个文件,然后锁定了下面的十几行代码,显然,这就是网页中显示发布时间效果的源码出处了;通过对比我锁定了current_time('timestamp')这个变量;为什么?通过其在标签间的位置,还有它的取值,显然它获取的是当前时间,但是和当前的系统时间又相差8个小时,这是为什么呢,当然还是时区的问题;这个时候道友该疑惑了,不是说时区没得问题吗?我们来看看下面的操作!

!--首先我通过主题目录下footer.php文件试图调用这个变量--!

[root@oxblog jinsomB]# vim footer.php
<script type="text/javascript">
alert(""+<?php echo current_time('timestamp'); ?>);
</script>

!--我在文件最后body之前加入一个srcript,如此当我们刷新页面时,就会弹出一个小窗口,里面正是这个变量的取值:1497269765--!

!--没错这段数字正是linux系统的时间戳,关于它的讲解,道友可以本站内搜索‘时间戳’得解析--!

123[root@oxblog jinsomB]# LANG="utf-8" date -d @1497269765
Mon Jun 12 20:16:05 CST 2017
[root@oxblog jinsomB]# date +%s
1497240965
[root@oxblog jinsomB]# expr 1497240965 - 1497269765
-28800
[root@oxblog jinsomB]# LANG="utf-8" date -d @1497269765
Mon Jun 12 20:16:05 CST 2017
[root@oxblog jinsomB]# LANG="utf-8" date -d @1497240965
Mon Jun 12 12:16:05 CST 2017
[root@oxblog jinsomB]# date -R
Mon, 12 Jun 2017 12:25:41 +0800
注意思考

看到上面的内容,我们需要仔细思考,首先我们获取的current_time变量时间戳1497269765;但是我们查看当前系统的时间戳为1497240965;然后通过计算,当前系统时间比此变量的时间戳少了28800;我们再对比两个时间戳转换为CST时间也正好是相差了8个小时;即当前系统时间比current_time变量获取的时间少了8个小时;如此和我们每次发布文章后,显示时间发布已经过了8小时正好吻合;因为我们发布的时间是正常时间,如今日1点发布,可获取的current_time时间却是9点,浏览器认为这个就是当前时间,所以文章会显示已经发布了8小时;

③、通过运算代码改变current_time代表的当前时间来还原正常效果;

[root@oxblog jinsomB]# vim template-tags.php
if ( ! function_exists( 'ht_entry_meta_date' ) ) :
function ht_entry_date() {
 $post_date = ht_human_time_diff( get_the_time('U'), current_time('timestamp'-28800)) ;
 printf( __( '<span class="entry-meta-date"><time datetime="%1$s">%2$s</time></span>', 'framework' ),
 esc_attr( get_the_date( 'c' ) ),
 esc_html( $post_date )
 );
}
endif;

!--如上我们只需要在此变量后面减少28800,也就是8小时即可让其变相等同于系统当前时间--!

④、修改定义current_time变量的函数来改变其变量的值;

!--我们既然知道这是个变量,那么它的值不可能平白就有的,一定有个函数或方式赋予它的值--!

!--其实这个变量是wordpress自己定义的,所以同样我们检索一下它在wp安装目录下--!

[root@oxblog htdocs]# grep -ri current_time $(find ./ -type f -name '*.php') | awk -F: '{print $2 }'| grep function
function current_time( $type, $gmt = 0 ) {
[root@oxblog htdocs]# grep -ri current_time $(find ./ -type f -name '*.php') | grep "$gmt = 0"
./wp-includes/functions.php:function current_time( $type, $gmt = 0 ) {
vim wp-includes/functions.php
function current_time( $type, $gmt = 0 ) {
switch ( $type ) {
case 'mysql':
return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) );
case 'timestamp':
return ( $gmt ) ? time() : time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
default:
return ( $gmt ) ? date( $type ) : date( $type, time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );
}
}
特别思考

如上,首先我猜疑它是个function函数开始检索,并果然检索到了wp-includes/functions.php这个文件,打开编辑它,找到下面那段代码,我们可以清晰的看到,其current_time取值原理;也会恍然大悟,原来是这样;没错,wp在定义这个变量的时候,取值是gmt的时间,gmt时区 的一种表现形式,GMT基于和平太阳点,UTC则是基于国际原子时间,其实两者都是一样的了,此外还有GST世界时间和CST美国,澳大利亚,中国,古巴四个国家的标准时间表示方法;但无论是哪种表示,我们要知道中国的标准时间常用表示CST(China Standard Time UT+8:00),也就是UTC +8 或GMT +8 ;所以我们看到上面函数取值gmt为0,而我们系统时区是CST也就是上面说的Asia/shanghai时区,这也就是为什么获取时间相差8小时的原因;由此我们便也可以通过这个地方来直接修改current_time变量的取值了;

!--直接修改current_time函数gmt参数的值为8--!

[root@oxblog htdocs]# vim wp-includes/functions.php
function current_time( $type, $gmt = 8 ) {

⑤、修改主题里面current_time取值代码参数来直接修改其变量的值;

!--通过上面我们已经知道current_time变量取值的原理,如此我们除了上面④中的方法,我们还可以直接修改主题中的那个调用文件处的参数,直接修改其变量--!

function ht_entry_date() {
$post_date = ht_human_time_diff( get_the_time('U'), current_time('timestamp',8)) ;
printf( __( '<span class="entry-meta-date"><time datetime="%1$s">%2$s</time></span>', 'framework' ),
esc_attr( get_the_date( 'c' ) ),
esc_html( $post_date )
);
}
endif;

如上,我在代码第二行最后出加上了,8;意思也就是简介修改了gmt的值,是的这就是代码的神奇;

⑥、修改系统时区及扩展

如上,知道了来龙去脉,我们是不是可以直接修改系统时区为UTC0或GMT0时区,显然是可行的;

不过这里就不演示了,但博主在解决此问题的时候,网上查到有的方法是修改php和apache或wp配置文件中配置的时区,其实也是一种方法,但显然很多都说最后这种方法是不可行的;我想看了上面的剖析,这里大家应该知道原因了,那就是出发点不对;就像①中排除系统时间和时区一样,我们已经确定系统时区和时间是没有问题的,你还要总是通过各种方法去修改,认为是有问题的地方,把时区修改成上海的时区,显然是没有效果的,但是如果如上我们把它修改成utc0的时区,或许就成功了;

不过虽然很多弯路,但这正是解决问题的过程和谨慎,在没有弄清原因的情况下,一切假设都是可能的;

总结汇报

如上我们可以知道,wordpress的8小时问题,排除不可行的,最终有效果的一共三种方法;即步骤③中通过后期运算改变最终获取的时间戳;步骤④中通过改变函数current_time中gmt参数变量时区取值直接改变time变量值;步骤⑤中通过改变主题调用文件中的变量参数来间接改变time变量值;

当然步骤⑥中通过改变系统时区或是php、apache和wp配置的时区为gmt0的方法也是可行的,但是显然是不可取的,因为我们在中国,博客是中国博客,博主是中国人,时间要用中国时间啊!

(哈哈,就这么多了,不明白记得留言哦!)

Edit@bigmouth【原创博文】®【经验汇总】


原创文章,转载请注明:转自于公牛博客

本文链接地址:【wordpress】解决文章发布时间显示为8小时前

6
祝福我们的祖国繁荣昌盛
  • 请尽情挥洒您的笔墨!

    让我找到了主题自带的一些function功能,前面全手敲,现在又得改- -。

    2021-01-26 10:57回复