跨文章跨页面悬浮显示@评论

提醒:本文最后更新于 3500 天前,文中所描述的信息可能已发生改变,请仔细核实。

上一个帖子的评论中,提到了跨文章跨页面悬浮显示 @ 评论支持(悬浮本文字可见效果)和新的自动@函数(修改了过滤器对象)。

先来说自动@函数,大发采用的还是前人写的通过comment_text过滤器校验。

a8sd723ddf642a1574doa8sd723ddf642a1574do这个过滤器对于sidebar(边栏)的最近评论,还有常用的wp_mail_notify(邮件提醒)都没有效果,因为这两样通常采用get_comment的方式,而且comment_text最终也是需要走get_comment的,所以把过滤对象换为get_comment。

具体函数,丢到functions.php替代老的@函数即可。

add_filter('get_comment', 'get_comment_add_at_parent');
function get_comment_add_at_parent($comment){
 global $wpdb;
 if ($comment->comment_parent) {
  $parent_comment = get_comment($comment->comment_parent);
  $comment->comment_content  = preg_replace('/<a href="#comment-([0-9]+)?".*?>(.*?)<\/a>:/i','',$comment->comment_content);//去除存在数据库里的@回复
  $comment->comment_content   = '<a href="#comment-' . $comment->comment_parent . '" class="atreply" rel="nofollow">@' . $parent_comment->comment_author . '</a>: ' . $comment->comment_content;
 }
 return $comment;
}

说实在的,我不大喜欢这个函数,因为我觉得这个不大好,需要进行preg_replace替换数据库存有的@内容,浪费性能,虽说性能不值几个钱。

或许有人会说,自己本身数据库是没有@的。但是从你使用该函数后,如果你在后台编辑评论的话,编辑框是会有@的,当你编辑成功时,数据库就附带at了,如果这时不preg_replace就会有双at了。所以到头来,因为各种可能,preg_replace是必须的。

虽然我现在也启用了,但后续的,我可能还是用回传统的js添加法,评论时难看就难看吧。好歹搬家也能有个底。

说这么多,对于跨文章跨页面悬浮显示 @ 评论,一开始我对老杨说的思路就错了,想复杂了。在搞上面的过滤器时,想起直接用get_comment配合ajax就可以直接获取了。

首先在functions.php中添加如下代码,请根据需要修改。

add_action('init', 'load_comment_ajax');
function load_comment_ajax(){
    if( isset($_GET['action']) && $_GET['action'] == 'ajax_load_comment' && isset($_GET['cmid']) ){
        nocache_headers();
        $comment = get_comment($_GET['cmid']);
        if(!$comment) die();
        lopercomment($comment, null,null);//评论钩子方法自己改成自己主题的
        die();
    }
}

js方面,为了使兼容性更好,方便各位复制后可直接使用,我采用了读取评论时,自动对@评论不存在的请求出来(隐藏在评论列表末尾)。这样的话,不用改变现有显示@的函数,就可以实现跨页面悬浮显示 @ 评论了。

js片段如下,加在适当的位置,确保读取分页评论也能得到重建。

  $('.atreply').each(function(f){
   var __atreplyid = $(this).attr('href');
   if(!$(__atreplyid).is('.comment')) {
    var cmid = __atreplyid.slice(9);
    $.ajax({
     url: home_url + "?action=ajax_load_comment&cmid=" + cmid,
     type: 'GET',
     dataType: 'html',
     success: function(data) {
      var AtCommentLoad = $(data + '</li>');
      AtCommentLoad.hide().appendTo($('#thecomments'));
     }
    });
   }
  });

特别提示,因为我定义了$即为jQuery,如果你不是采用相同方法,请将$替换为jQuery。

另外这种JQ请求方式,支持JQ大多数版本,兼容低版本JQ。

改进地方也有,就是鼠标悬停再ajax请求,这样可以节省请求。不过目前这样,体验比较好。

还有就是因为自己现有主题的js比较乱,所以文章正文暂显示不出来at的内容,如果你的原始显示at内容的js处理的比较好,以上代码,就可显示出来了。

文章正文的引用已经可以显示出来了,详细将鼠标悬停于此见效果。

好了,说到这里就不啰嗦太多了,工作上还比较忙。以上内容不提供各种帮助或解答,请自行参考学习,谢谢。(这些功能可能随时被取消)

另外,文章同步微博因CVE-2015-4024而导致的方法失效,已经更新为新方法(换了个接口而已,再次偷懒没使用multipart请求)。貌似已经正常工作了。还有拖了1年多的loper评论嵌套错位问题也解决了,貌似还有点小bug,回头再看看了。

转载请注明转自:kn007的个人博客的《跨文章跨页面悬浮显示@评论