kn007的个人博客
♥ You are here: Home > 软件与网络 > php > 跨文章跨页面悬浮显示@评论

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

by | 67 Comments

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

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

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

a8sd723ddf642a1574do这个过滤器对于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的个人博客的《跨文章跨页面悬浮显示@评论

donate
有所帮助?

Comments

67 Comments立即评论
  1. 不错,功能很炫!

    1. MOD回复

      @草根成春: 还好啦,不是什么实用功能

  2. 回复

    略微有些复杂,先收藏再说吧。。。 :roll: :roll:

  3. 这个不错!

  4. 好复杂,使用起来方便的话还不错

    1. MOD回复

      @爆糗段子: 其实也没什么作用

  5. 回复

    卡顿了一下。

    1. MOD回复

      @神秀: 可能哪里出问题了? :???:
      我这里正常

  6. 回复

    咦,居然有友情链接认证。。。
    算了,想隐藏身份都不行了,滚回去做站了。

    1. MOD回复

      @神秀: 以前就有好吧,认link的好伐,你之前就是这个link,肯定会被标记起来的

    2. MOD回复

      @神秀: 话说,说好的ss呢 :razz:

  7. 回复

    这效果简直太酷了!!!

    1. MOD回复

      @龙笑天: 还好~

  8. 我的怎么加上没效果呢?评论回调函数也修改了... :o

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif