改善你的 WordPress 文章、评论时间显示

评论(12)

很多博客都喜欢用 评论发表于 “XXX 分钟 之前”、文章发表于 “XXX 分钟 之前”来显示文章评论的时间,改善的时间显示方式不仅能很直观的告诉读者这篇文章或评论发表距今已有多长时间,更能增强评论回复的时间感,哥很喜欢,因为前一阵子压在手里的东西太多了,工作日白天又苦于不能上网,所以主题的样式及功能部分一点一点的写拖了好长时间,最近这阵子刚好轮到折腾评论了,所以就逐步参照网上流行的样式一点一点的修改起来自己的评论样式和功能。

So…..
Go…..
交道麻袋…..评论日期和文章日期调用函数不同,下面以评论日期为例,文章日期请自行调整。

改善的时间显示方式的原理

很简单,就是通过 WordPress 的一个内置的函数处理现在的时间和文章、评论发表的时间差,显示距今有X分钟、X小时、X天。
这个函数就是 human_time_diff ()

用法:

<?php human_time_diff( $from, $to ) ;?>


说明:
判断两个时间标记的差异。
以人类可阅读的格式,如“1小时”、“5分钟”、“两天”,返回$from和$to 两个时间变量的时间差。

从英文上也很好理解:from 到 to 嘛。(这句是很废吧,哈哈。)

幼儿版改善实现

//将你的评论时间显示的函数改成如下就可以了
<?php echo human_time_diff( get_comment_time('U') , current_time('timestamp')) ;?>


所有的日期都计算时间差,很暴力吧?

少儿版的实现办法

简单的加一个判断,如果评论时间没有超过一天则显示XX小时之前,如果超过一天则显示原始日期。
这样比较人性化吧?总不能让读者总掰着指头算38天之前是什么日子吧?哈哈!
代码:

<?php 
//计算是否超过一天 注:86400是一天的总共的秒数 60秒X60分X24小时=86400秒
//如果觉得一天不够的话,请自行计算填上。
if (current_time('timestamp') - get_comment_time('U') < 86400 )
//一天之内显示的东西
{$cmt_time = human_time_diff( get_comment_time('U') , current_time('timestamp') ) . '-ago';}
//超过一天这么显示
else{$cmt_time = get_comment_date( 'Y/n/j' ).' - '.get_comment_time('','',false);};
 ;?>


//将你的评论时间显示的函数改成如下就可以了
<?php echo $cmt_time ;?>

少儿奥数版

那么我们能不能再增强一下呢?
为什么增强?
好吧,因为我这个人比较较真,觉得中文显示日期不好看,影响到我的排版,喜欢英文显示日期,而中文版的 WordPress 汉化的真的是没有死角(汉化的真仔细),如果我们直接用 human_time_diff 函数输出的话,中文版的 WordPress 会将结果全部汉化显示XX小时XX天之前,这样很有可能会影响我们的排版,而且这个 human_time_diff 函数里既没有留钩子,也没有预留一个不汉化的参数,所以我们想要显示英文的话,只有两个办法:

  1. 直接修改 human_time_diff 函数,让汉化失效,这样做太暴力,而且以后升级了还要再进去改,伦家不喜欢。
  2. 重写一个自己的 human_time_diff 函数,绕过汉化。(搞个小老婆,哈哈,偶稀罕)

function.php 里面强力插入如下代码:

//原函数的 day hour min 都是小写的,
//我把这三个词的首写字母改成大写的,即Day Hour Min 就可以避开汉化了,你懂?
if ( ! function_exists( 'xz_time_diff' ) ) :
function xz_time_diff( $from, $to = '' ) {
	if ( empty($to) )
		$to = time();
	$diff = (int) abs($to - $from);
	if ($diff <= 3600) {
		$mins = round($diff / 60);
		if ($mins <= 1) {
			$mins = 1;
		}
		/* translators: min=minute */
		$since = sprintf(_n('%s Min', '%s Mins', $mins), $mins);
	} else if (($diff <= 86400) && ($diff > 3600)) {
		$hours = round($diff / 3600);
		if ($hours <= 1) {
			$hours = 1;
		}
		$since = sprintf(_n('%s Hour', '%s Hours', $hours), $hours);
	} elseif ($diff >= 86400) {
		$days = round($diff / 86400);
		if ($days <= 1) {
			$days = 1;
		}
		$since = sprintf(_n('%s Day', '%s Days', $days), $days);
	}
	return $since;
}endif;


时间判断代码改为如下:

<?php 
//只是把计算日期差异的函数名变了而已,其他同上。
if (current_time('timestamp') - get_comment_time('U') < 86400 )
{$cmt_time = xz_time_diff( get_comment_time('U') , current_time('timestamp') ) . '-ago';}
else{$cmt_time = get_comment_date( 'Y/n/j' ).' - '.get_comment_time('','',false);};
 ;?>


//将你的评论时间显示的函数改成如下就可以了
<?php echo $cmt_time ;?>


效果请直接参照我博客就知道了。

大学版

不知道有没有类似的插件,
也不知道需要的人多不多,
如果需要的人多的话可以考虑写一个插件玩玩。
现在嘛,就让它未待完续吧。
==============================================================
通用函数版地址:《WordPress 显示评论、文章相对时间》





  1. 不错的功能,谢谢分享了~

  2. 我来看看效果

  3. 做站!

  4. 准备去试一下,现在作战真不容易呀!

  5. @本小明
    还有个改进版,跟插件很像了,建议用那个,
    还有你主题不错哦。

  6. 少儿奥数版抱走

  7. Pingback: WordPress 显示评论、文章相对时间 | 主题 - WordPress

  8. 这些的很全面,有空我弄个幼儿版本的试试看。

  9. @无冷
    也可以,不过感觉会多加载js代码,
    而且还有一块空档时间,
    不过可以加一个悬浮的特效,
    就是显示ago的时候鼠标hover的时候弄一个浮动层出来,显示原始日期,
    原始日期的时候显示ago,cool吧?
    我的创意哦!

  10. 我用js来写写看,也是一样的系写法

  11. @wind
    刚刚把我的改了,
    看到网上能搜到的都不是很全面,
    就把我的代码搬上来了。

  12. xiang兄真是及时雨啊,正有打算弄弄这块呢。