优化WordPress中文章与评论的时间显示
很多博客都喜欢用评论发表于“XXX分钟之前”、文章发表于“XXX分钟之前”来显示文章评论的时间,改善的时间显示方式不仅能很直观的告诉读者这篇文章或评论发表距今已有多长时间,更能增强评论回复的时间感,哥很喜欢,因为前一阵子压在手里的东西太多了,工作日白天又苦于不能上网,所以主题的样式及功能部分一点一点的写拖了好长时间,最近这阵子刚好轮到折腾评论了,所以就逐步参照网上流行的样式一点一点的修改起来自己的评论样式和功能。
So…..
Go…..
交道麻袋…..评论日期和文章日期调用函数不同,下面以评论日期为例,文章日期请自行调整。
改善的时间显示方式的原理
很简单,就是通过WordPress的一个内置的函数处理现在的时间和文章、评论发表的时间差,显示距今有X分钟、X小时、X天。
这个函数就是human_time_diff()
用法:
<?phphuman_time_diff($from,$to);?>
说明:
判断两个时间标记的差异。
以人类可阅读的格式,如“1小时”、“5分钟”、“两天”,返回$from和$to两个时间变量的时间差。
从英文上也很好理解:from到to嘛。(这句是很废吧,哈哈。)
雏形版改善实现
//将你的评论时间显示的函数改成如下就可以了
<?phpechohuman_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);};
;?>
//将你的评论时间显示的函数改成如下就可以了
<?phpecho$cmt_time;?>
增强版
那么我们能不能再增强一下呢?
为什么增强?
好吧,因为我这个人比较较真,觉得中文显示日期不好看,影响到我的排版,喜欢英文显示日期,而中文版的WordPress汉化的真的是没有死角(汉化的真仔细),如果我们直接用human_time_diff函数输出的话,中文版的WordPress会将结果全部汉化显示XX小时XX天之前,这样很有可能会影响我们的排版,而且这个human_time_diff函数里既没有留钩子,也没有预留一个不汉化的参数,所以我们想要显示英文的话,只有两个办法:
直接修改human_time_diff函数,让汉化失效,这样做太暴力,而且以后升级了还要再进去改,伦家不喜欢。
重写一个自己的human_time_diff函数,绕过汉化。
function.php里面强力插入如下代码:
//原函数的dayhourmin都是小写的,
//我把这三个词的首写字母改成大写的,即DayHourMin就可以避开汉化了,你懂?
if(!function_exists('xz_time_diff')):
functionxz_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('%sMin','%sMins',$mins),$mins);
}elseif(($diff<=86400)&&($diff>3600)){
$hours=round($diff/3600);
if($hours<=1){
$hours=1;
}
$since=sprintf(_n('%sHour','%sHours',$hours),$hours);
}elseif($diff>=86400){
$days=round($diff/86400);
if($days<=1){
$days=1;
}
$since=sprintf(_n('%sDay','%sDays',$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);};
;?>
//将你的评论时间显示的函数改成如下就可以了
<?phpecho$cmt_time;?>
显示评论、文章相对时间
根据上面的版本、下面的这个应该算是增强改进版吧,因为要达到效果还是需要在主题里添加代码,所以还没到终极版,哈哈。
函数代码如下:
相对时间函数
if(!function_exists('xz_time')):
/**
*显示文章、评论相对时间的封装函数.
*作者:XiangZihttp://PangBu.com/
*@param$type类型字符串'cmt'或'art',用于定义显示的是评论时间还是文章时间。
*@param$ago_time数字类型用于定义显示相对时间的时间限制默认为86400秒即一天。
*@param$after字符串型显示在相对时间之后的文字,默认为'-ago'
*@param$late字符串型超过时间限制后显示的项目,默认为get_the_time('Y/n/j-H:i')或get_comment_time('Y/n/j-H:i')
*@return返回字符串(相对时间或绝对时间)
*/
functionxz_time($type='art',$ago_time=86400,$after='-ago',$late=''){
if($type==='cmt'){
$diff=(int)abs(get_comment_time('U')-current_time('timestamp'));
if((!$late)||$late==''){$late=get_comment_time('Y/n/j-H:i');};
}
if($type==='art'){
$diff=(int)abs(get_the_time('U')-current_time('timestamp'));
if((!$late)||$late==''){$late=get_the_time('Y/n/j-H:i');};
}
if($diff<=3600){
$mins=round($diff/60);
if($mins<=1){
$mins=1;
}
/*translators:min=minute*/
$since=sprintf(_n('%sMin','%sMins',$mins),$mins);
}elseif(($diff<=86400)&&($diff>3600)){
$hours=round($diff/3600);
if($hours<=1){
$hours=1;
}
$since=sprintf(_n('%sHour','%sHours',$hours),$hours);
}elseif($diff>=86400){
$days=round($diff/86400);
if($days<=1){
$days=1;
}
$since=sprintf(_n('%sDay','%sDays',$days),$days);
};
$since.=$after;
return$diff<$ago_time?$since:$late;
}endif;
使用方法
将上述代码插入到你主题的function.php文件中
然后在你想显示相对时间的地方调用该函数即可。
函数最少输入设定一个参数即$type类型字符串 ‘cmt'(评论时间)或'art'(文章时间)
示例:
//最简单的调用
echoxz_time('cmt');
//一天内的输出结果:3Hours-ago
//一天后的输出结果:2015/12/26-20:01
//调用时长为2天内的相对时间,之前时间显示默认时间
echoxz_time('cmt',172800);
//2天内的输出结果:3Hours-ago
//2天后的输出结果:2015/12/26-20:01
//调用时长为2天内的相对时间,相对时间之后显示'之前的评论'
echoxz_time('cmt',172800,'之前的评论');
//2天内的输出结果:3Hours之前的评论
//2天后的输出结果:2015/12/26-20:01
//调用时长为2天内的相对时间,之前时间显示为年-月-日
echoxz_time('cmt',172800,'之前的评论',get_comment_time('Y-n-j'));
//2天内的输出结果:3Hours之前的评论
//2天后的输出结果:2015/12/26