只在WP主评论加上楼层号的方法(支持评论分页)

最新代码移步到这里:只在WP主评论加上楼层号的方法『支持顺序、倒序』(2012.11.17)

很久没折腾 WordPress 相关的伪技术了,今天突然想起自从 WordPress 2.7 支持嵌套后久久没实现的评论楼层号,如果按照老式的方法给主评论和嵌套评论都加上楼层号,我个人认为是没有什么意义的,而且感觉会乱七八糟,但是只为主评论加上楼层号,那么就不同了,因为每层楼就是一个讨论组,可以当作是一个论坛贴,嵌套评论就是参加讨论的人。

我记得4月份在《凤凰不归巢》那里看到一篇文章《WP非插件显示谁坐了沙发》里面有相关主次评论判断方法,于是今早无聊就折腾了一番,没想到真给我折腾出来了。

效果看我现在用的主题 zSnos 的评论,下面是方法

前提

1. 当然是要在 WordPress 后台开启嵌套评论评论分页
2. 所用主题支持嵌套(目前的主题基本都支持吧)
3. 主题有使用 mytheme_comment 回调函数(http://codex.wordpress.org/Template_Tags/wp_list_comments

下面拿默认的评论函数来说明

1. 先看看WP官方的默认 mytheme_comment 回调函数

function mytheme_comment($comment, $args, $depth){
$GLOBALS['comment'] = $comment;

?>
<li <?php comment_class(); ?> id="li-comment-<?php comment_ID() ?>">
	<div id="comment-<?php comment_ID(); ?>">
		<div class="comment-author vcard">
		<?php echo get_avatar($comment,$size='48',$default='<path_to_url>' ); ?>
		<?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?>
	</div>
	<?php if ($comment->comment_approved == '0') : ?>
		<em><?php _e('Your comment is awaiting moderation.') ?></em>
		<br />
	<?php endif; ?>
	<div class="comment-meta commentmetadata"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"><?php printf(__('%1$s at %2$s'), get_comment_date(),  get_comment_time()) ?></a><?php edit_comment_link(__('(Edit)'),'  ','') ?></div>
		<?php comment_text() ?>
		<div class="reply">
			<?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
		</div>
	</div>
<?php }

2. 那么现在开始添加楼层计数参数 $commentcount 等代码,具体看代码中的注释

2010.10.28 Update:优化了查询数)

function mytheme_comment($comment, $args, $depth){
$GLOBALS['comment'] = $comment;

//主评论计数器初始化 begin - by zwwooooo
	global $commentcount;
	if(!$commentcount) { //初始化楼层计数器
		$page = get_query_var('cpage')-1;
		$cpp=get_option('comments_per_page');//获取每页评论数
		$commentcount = $cpp * $page;
	}
//主评论计数器初始化 end - by zwwooooo

?>
<li <?php comment_class(); ?> id="li-comment-<?php comment_ID() ?>">
	<div id="comment-<?php comment_ID(); ?>">
		<div class="comment-author vcard">
		<?php echo get_avatar($comment,$size='48',$default='<path_to_url>' ); ?>
		<?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?>
	</div>
	<?php if ($comment->comment_approved == '0') : ?>
		<em><?php _e('Your comment is awaiting moderation.') ?></em>
		<br />
	<?php endif; ?>
	<div class="comment-meta commentmetadata"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"><?php printf(__('%1$s at %2$s'), get_comment_date(),  get_comment_time()) ?></a><?php edit_comment_link(__('(Edit)'),'  ','') ?></div>
		<?php comment_text() ?>
		<div class="reply">
			<?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
		</div>
		<div class="floor"><!-- 主评论楼层号 by zwwooooo -->
			<?php if(!$parent_id = $comment->comment_parent) {printf('#%1$s', ++$commentcount);} ?><!-- 当前页每个主评论自动+1 -->
		</div>
	</div>
<?php }

3. 从上面代码可以看出我给楼层号特意加上一个 div 来显示,如果你的主题评论结构够标准,那么可以参考下面的 css

ol.commentlist li div.floor{position:absolute;top:0;right:0;}

OK,搞定,有兴趣的朋友玩玩吧,这个唯一不好的就是会增加数据库查询次数,不过这应该是微不足道。

zww
or
oooo

“只在WP主评论加上楼层号的方法(支持评论分页)”有231条评论

  1. 请教一下,我几乎是完全按你的代码copy的,但是在我那里有点问题,无分页是正常,第一楼是最旧的评论。但是如果有分页,就不正常了,第一楼不是最新评论,也不是最旧评论,评论楼层会随着评论的增加而序列变动,请帮忙看看http://www.epinv.com/post/595.html/

  2. 后台的评论那里设置的是“默认显示最后页面”,顶部显示“最新评论”其实我几种组合都试过,还是不能和你现在的评论这样显示,我就想楼层数随着评论的增加而变化,只有这样在有需要时才好告诉别人在第多少个楼层的留言内容

  3. 我现在的楼层是评论一个,楼层变化一次,都不是固定的

  4. 评论框的邻居我去看望过了,你懂的 :mrgreen:

  5. 博主知道我那啥原因引起的么??

    1. zwwooooo says:

      @亿品元素
      通常WP开启评论分页、显示最新的评论就OK的,我去你那看了,也没发现神马问题啊?

  6. 有点蓝 says:

    这么久过去了,这条折腾偶还是搞不定…… :evil:

    1. zwwooooo says:

      @有点蓝
      厄,有这么难么?很简单的

    2. 有点蓝 says:

      @zwwooooo
      真是……会者不难。找了无数个线索,从万戈的此文里找到答案了。http://wange.im/diy-wordpress-comment-style.html

    3. zwwooooo says:

      @有点蓝
      原来你不懂回调函数啊……囧

  7. 有点蓝 says:

    呵呵是啊是啊,看了好多遍你这篇文章,好不容易注意到一个“mytheme_comment 回调函数”,然后才知道问题出在哪儿。 :mrgreen:

    1. zwwooooo says:

      @有点蓝
      要仔细看文章

  8. chungee says:

    这个Ajax评论楼层能更新么

    1. zwwooooo says:

      @chungee
      不能,这不是为ajax设计的

  9. atatstone says:

    我用你的代码成功为我的博客添加了楼层显示,谢谢!

  10. 折子戏 says:

    哦呵呵,支持个,这个功能准备明天就折腾。。又多了个事做了!

  11. 折子戏 says:

    请问Z大:我的主题好像没有调用$commentcount函数,那我应该怎么做?

    1. zwwooooo says:

      @折子戏
      这个谁说是函数了?这是我加的一个变量而已。

    2. 折子戏 says:

      @zwwooooo
      恩,这个是几天前得评论了,百度一下我就明白了,解决掉了。

  12. suN says:

    看不懂 :mrgreen:

  13. kitsusia says:

    博主新年好啊! 昨天折腾了下,发现如果我10条评论每页,每个页面的评论就是从10楼开始的,好奇怪,主题是 suffusion,算是比较常见的,纠结中啊。。。

  14. kitsusia says:

    哦,没错,是我折腾的时候把$page 忘记减1了, :mrgreen:

    1. zwwooooo says:

      @kitsusia
      这些已经通过多人验证的了,自己没错的话一般木有问题

  15. kitsusia says:

    我用WP-PageNavi,不过好像只能给文章分页,没法给评论分页。问下楼主,你的这个评论分页用的什么插件啊?

    1. zwwooooo says:

      @kitsusia
      评论分页WP原生支持。

  16. shadowma says:

    試試ajax評論提交後的效果,我的新評論總是1樓

  17. airoschou says:

    为什么我是从#49开始的,不是#-1开始!

    1. zwwooooo says:

      @airoschou
      检查一下吧,注意要开启嵌套,而且这篇文章所说的方法是评论以顺序排序

  18. Goy2免费VPN says:

    请问博主,要是没有 mytheme_comment 函数该怎么办

    1. zwwooooo says:

      @Goy2免费VPN
      自己写进去

  19. 你的评论框错位啦

    1. zwwooooo says:

      @一品香茗
      请问怎样错位法呢?

  20. 萝卜居 says:

    这个方法很不错。效果也不错。俺借鉴了。谢谢大神

    1. zwwooooo says:

      @萝卜居
      慢慢折腾,互相学习

发表评论

昵称 *

网址

B em del U Link Code Quote