优化WordPress中文章与评论的时间显示


Posted in PHP onJanuary 12, 2016

很多博客都喜欢用 评论发表于 “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 函数里既没有留钩子,也没有预留一个不汉化的参数,所以我们想要显示英文的话,只有两个办法:

直接修改 human_time_diff 函数,让汉化失效,这样做太暴力,而且以后升级了还要再进去改,伦家不喜欢。
重写一个自己的 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 ;?>

显示评论、文章相对时间

根据上面的版本、下面的这个应该算是增强改进版吧,因为要达到效果还是需要在主题里添加代码,所以还没到终极版,哈哈。
函数代码如下:

相对时间函数

if ( ! function_exists( 'xz_time' ) ) :
/**
 * 显示文章、评论相对时间的封装函数.
 *作者:XiangZi http://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 返回字符串(相对时间或绝对时间)
*/
function xz_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('%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);
  };
  $since .= $after ; 
  return $diff < $ago_time ? $since : $late ;
}endif;

使用方法
将上述代码插入到你主题的function.php文件中
然后在你想显示相对时间的地方调用该函数即可。
函数最少输入设定一个参数 即$type 类型字符串  ‘cmt'(评论时间)或'art'(文章时间)
示例:

//最简单的调用
echo xz_time('cmt');
//一天内的输出结果: 3 Hours-ago 
//一天后的输出结果: 2015/12/26 - 20:01
 
 
//调用时长为2天内的相对时间,之前时间显示默认时间
echo xz_time('cmt',172800);
//2天内的输出结果: 3 Hours-ago 
//2天后的输出结果: 2015/12/26 - 20:01
 
 
//调用时长为2天内的相对时间,相对时间之后显示 '之前的评论'
echo xz_time('cmt',172800,'之前的评论');
//2天内的输出结果: 3 Hours 之前的评论 
//2天后的输出结果: 2015/12/26 - 20:01
 
//调用时长为2天内的相对时间,之前时间显示为 年-月-日
echo xz_time('cmt',172800,'之前的评论',get_comment_time('Y-n-j'));
//2天内的输出结果: 3 Hours 之前的评论 
//2天后的输出结果: 2015/12/26
PHP 相关文章推荐
提问的智慧
Oct 09 PHP
PHP实现图片简单上传
Oct 09 PHP
PHP编码规范-php coding standard
Mar 16 PHP
一步一步学习PHP(2)――PHP类型
Feb 15 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
Apr 12 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 #PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 #PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 #PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 #PHP
简单了解WordPress开发中update_option()函数的用法
Jan 11 #PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 #PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 #PHP
You might like
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
js 函数调用模式小结
2011/12/26 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
EsLint入门学习教程
2017/02/17 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
Python isinstance判断对象类型
2008/09/06 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Django的Modelforms用法简介
2019/07/27 Python
python实现串口通信的示例代码
2020/02/10 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
股份转让协议书
2014/04/12 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
遗失说明具结保证书
2015/02/26 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
公司年会主持词范文!
2019/05/07 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers