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

很多博客都喜欢用 评论发表于 “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
时间: 2016-01-10

解决WordPress使用CDN后博文无法评论的错误

comments-ajax.js在cdn缓存后,很多人遇到无法(使用ajax)回复的问题.对此,我之前的做法只是禁止cdn缓存此文件,便不作他想. 其原始解决办法是,在comments-ajax.js中的后面: var i = 0, got = -1, len = document.getElementsByTagName('script').length; while ( i <= len && got == -1){ var js_url = document.getElemen

详解WordPress中调用评论模板和循环输出评论的PHP函数

comments_template comments_template 函数是一个调用评论模板的函数,使用起来很简单,与get_header()等函数一样,是一个include文件类函数,今天来讲一下他的使用. 描述 上面已经讲过了,就是调用评论模板的一个函数. 使用 <?php comments_template( $file, $separate_comments ); ?> 其中 $file 需要调用的文件名 默认值: /comments.php $separate_comments 是

WordPress JQuery处理沙发头像

我想这对沙发同学不太公平吧.昨天在看yinheli同学的<鼠标悬浮实现显示留言内容>一文(建议看看,好文章),就想到我何不把沙发的头像copy出来然后放在显眼的位置上呢,如下截图效果.做法首先是你的网站加载了JQuery,然后在你需要放置沙发头像的地方添加一个<div>,内容为空即可: 复制代码 代码如下: <div id="shafa"></div> 然后要做的就是利用js复制沙发的头像,并把复制的内容填入上面设定的<div>

WordPress中利用AJAX异步获取评论用户头像的方法

在评论者输入邮箱后,异步获得评论者的头像并显示出来,个人感觉这个功能虽不能给用户体验带来多大的提升,也不算是一个实用的功能,但至少很炫,看到有的网站有添加这个功能,我也不甘寂寞所以也写了个脚本,没有时间做封装,所以直接上原理和代码. 异步动态调用头像原理 获得用户输入 过滤用户输入 传递变量到后台 后台处理数据,并返回头像的HTML代码 获得后台返回数据,将HTML代码加载到当前页面 貌似很多步骤,其实很简单,我们只要将自己的主题稍作修改就可以到达效果. 简单功能截图: 实现 功能代码:Java

WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现

根据鼠标悬停显示.隐藏,回复和引用按钮 思路及原理 原理嘛很简单,如果你阅读过一页或者两页甚至更多页 Jquery 手册的话, 那么下面的原理解释你肯定能看懂,否则请跳至代码实现区域阅读. 思路很简单, 将回复.引用按钮放置在你想要的地方,CSS 样式设置 display:none; 绑定Jquery中的hover动作到你想要鼠标悬停后显示按钮的区域 是不是很简单?要是我以前写博客肯定会就此结束, 好吧,既然授人鱼那么继续--. 特效的代码实现部分 回复.引用的HTML代码 复制代码 代码如下:

利用jQuery实现WordPress中@的ID悬浮显示评论内容

比如: A 留言了, B 用 @ 回复了 A, 所以 B 的回复可能是这样的: @A How much money do you have? 就是说, 当鼠标悬停在 @A 上面的时候, 就会将 A 的评论内容显示在一个悬浮区域中. 实现步骤 在这里我们将以iNove主题为例进行讲解. 1. 将以下代码保存为commenttips.js: jQuery(document).ready( function(){ var id=/^#comment-/; var at=/^@/; jQuery('#t

在WordPress中实现评论头像的自定义默认和延迟加载

自定义 WordPress 默认评论头像 对于没有设置Gravatra头像的评论者来说,WordPress会显示一个你在后台设置的默认头像,可以是神秘人.空白.默认的Gravatar 标志等等.但是这些头像有一个共同的不足之处,就是不怎么美观,可看性不强!打个比方,如果你去一个博客阅读文章,但当你放心评论文章的读者头像都是小怪物.复古等一系列WordPress自动生成的"不堪入目"的头像时,你还有很浓的兴趣去阅读这个博客的文章吗?我想答案是肯定的!那么,你有没有想过,自己设计或找一个属

使用jQuery实现WordPress中的Ctrl+Enter和@评论回复

添加 Ctrl+Enter 快捷回复 这里送上两种方法,首先是 jQuery 方法,前段时间一直在研究 jQuery ,因此对 jQuery 方法比较熟悉,如果你的主题本来已经加载 jQuery 库,建议你使用下面的方法. 把这段代码加入 js 文件中,如果你已经加载 jQuery ,现在就可以使用 Ctrl+Enter 进行快捷回复. jQuery(document).ready(function($){ //Ctrl+Enter回复 jQuery(document).keypress(fun

WordPress中限制非管理员用户在文章后只能评论一次

之前有网友提出,在WordPress中有没有办法实现每篇文章只允许用户评论一次? 暂不说这个需求有没有用,毕竟WordPress就是给有各种需求的人用的.这个功能实现起来也比较简单,只需每次用户发表的评论进数据库之前,从当前文章的所有评论中查找是否有相同的用户名或邮箱已经发表过评论,如果有就跳到错误页面即可. 实现代码,放到当前主题的functions.php中即可(这里还增加了对IP的判断,更保险): // 获取评论用户的ip,参考wp-includes/comment.php functio

编写PHP脚本来实现WordPress中评论分页的功能

方法说明 首先来看看可能被用到的方法. 打开文件 wp-includes/link-template.php 你会发现 WordPress 2.7 多了 4 个针对评论分页的方法: get_comments_pagenum_link $pagenum: 页码 $max_page: 最大页数 返回链接地址. 在本次应用中不会被用到, 但大家应该知道有这个方法, 将方便你制作插件. next_comments_link $label: 显示的字样, 默认是 » Newer Comments. 但我一

使用CDN和AJAX加速WordPress中jQuery的加载

确定要放在Head部分 ? 事实上最好的情况是,js文件都不要在<head>部分进行加载,否则会影响到head部分的载入速度,直接导致网站的内容(body)载入延迟.如果你确定你不需要在head部分载入jQuery,请将载入代码移动到</body>前,准确的说是第一个会用到jQuery函数的javascript代码前. 当然,如果你需要head部分加载jquery,也请确保所有的js文件,包括jquery,都要放在调用CSS文件的代码之后,来实现同步下载.这也是Google官方给出

IE8中jQuery.load()加载页面不显示的原因

一.jQuery.load() jQuery.load(url,[data],[callback])通过Ajax异步请求加载服务器中的数据,并把数据放到指定元素中. •url :请求服务器的地址 •data :可选项,请求时发送的数据 •callback :可选项,请求成功后的回调函数 例: $(".content").load(" https://www.imooc.com/data/fruit_part.html ") 二.IE8中使用jQuery.load()

MVC Ajax Helper或Jquery异步加载部分视图

废话不多说了,直接给大家贴代码了. Model: namespace MvcApplication1.Models { public class Team { public string Preletter { get; set; } public string Name { get; set; } } } 通过jQuery异步加载部分视图 Home/Index.cshtml视图中: @{ ViewBag.Title = "Index"; Layout = "~/Views/

用jQuery的AJax实现异步访问、异步加载

本篇文章实现了用jQuery的AJax实现异步访问和异步加载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. [异步访问] 用一个例子用以说明:点击按钮,将input内用户输入的数据发送给服务端,并将结果返回给页面. 首先是html承载内容: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>AJax异步访问<

DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)

Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 主要功能 分页,即时搜索和排序 几乎支持任何数据源:DOM, javascript, Ajax 和 服务器处理 支持不同主题 DataTables, jQuery UI, Bootstrap, Foundation 各式各样的扩展: Editor, TableTools, FixedColumns -- 丰富多样的option和强大的API 支持国际化 超过2900+个单元测试 免

JQuery异步加载PartialView的方法

本文实例讲述了JQuery异步加载PartialView的方法.分享给大家供大家参考,具体如下: 需求:页面上有dropdown之类的控件,当选择里面不同值的时候,下面关联的内容跟着改变. 思路:把与 dropdown关联的会改变的内容放到PartialView(ascx)里,用JQuery绑定dropdown的change事件,当选择值改变时,用JQuery ajax请求与PartialView相关的Action,得到数据后讲取到的内容覆盖原来的内容. 实现: Model 类: public

jQuery动态加载css文件实现方法

有时我们可能会需要使用 jQuery 来加载一个外部的 css 文件,如在切换页面布局时.思路是创建一个 link 元素,并将它添加到 标记中即可,下边首先看看怎么使用 jQuery 来实现. 下边是我喜欢的写法: $("<link>") .attr({ rel: "stylesheet", type: "text/css", href: "site.css" }) .appendTo("head&quo

javaScript和jQuery自动加载简单代码实现方法

在此之前我们给大家整理过用javaScript和jQuery自动加载的几种方法,大家可以参考一下:javaScript 页面自动加载事件详解 一.JavaScript自动加载 ①在文本中用onload: 当页面中所有内容(包括图片)加载完后再执行onload,如下: <body onload="alert(1)"></body> <!-- 当有一个onload --> <body onload="alert(2);alert(3);a

jQuery滚动加载图片实现原理

本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出 一.什么是图片滚动加载? 通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来.这就是图片懒加载. 二.为什要使用这个技术? 比如一个页面中有很多图片,如淘宝.京东首页等等,如果一上来就发送这么多请求,页面加载就会很漫长,如果js文件都放在了文档的底部,恰巧页面的

ThinkPHP+jquery实现“加载更多”功能代码

ThinkPHP+jQuery实现"加载更多" 在很多web端界面中都会用到点击按钮加载最新几条数据的demo,下例为使用thinkphp+jquery实现实例: 要实现的结果大致如下 第一步 模板文件 <!--软件--> <div class="lists switcher-panel switcher-panel-cur"> <ul class="xinhao"> {volist name="ap