只在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. xianzi says:

    :grin: 用上了,谢谢谢谢谢谢谢

    1. zwwooooo says:

      @xianzi 荒淫使用

    2. dh says:

      @zwwooooo
      没有第三层吗?

    3. zwwooooo says:

      @dh
      木有的。第三层及后面的都会自动跟到第二层。

  2. dengm says:

    感觉有点太复杂了

    1. zwwooooo says:

      @dengm 觉得复杂就直接照着修改用 :smile:

  3. andy says:

    我的博客也已经按照你说的折腾好了,不过最后的CSS好像不起作用。。加上后,会不显示楼层的。。
    :razz:

    1. zwwooooo says:

      @andy 最后的css只能参考,自己根据自己的主题修改。

  4. says:

    @zwwooooo 我想把reply移动评论下面来,但是我那主题的reply主评论副评论样式是一样的,我看到你副评论有个atclass样式,问下你评论代码里的判断怎么写,如果是主评论就用reply样式如果是副评论就用atclass样式,谢谢

    1. zwwooooo says:

      @洁 你如果研究过评论的结构你就知道怎样去定义主评论和子评论的样式了,atclass是给jQ用的,不是用来定义样式的。
      评论结构: http://zww.me/archives/25155

  5. zoo 怎样才能倒序数楼层啊……

    1. zwwooooo says:

      @似飘若舞 我试过比较难,暂时放弃,看哪天再研究下

  6. 无念 says:

    这个好 :mrgreen:

    1. zwwooooo says:

      @无念 荒淫折腾加上

    2. timsoon says:

      @无念

      无念: 这个好

      不知道能不能在某个楼里面也显示楼号

  7. 浩子 says:

    分页这个就有点困难了
    呵呵
    但是那个楼层显示的应该比较容易

    1. zwwooooo says:

      @浩子 一起解决了

  8. winy says:

    没看明白具体改了哪里 :?:
    用的方法学你的,能说下减少查询数目的关键地方吗?
    我查询数目也很高,因为不但有主楼层,还有子楼层,每层也有沙发什么的,还有缩进。。。

    1. zwwooooo says:

      @winy
      放在if(!$commentcount)里面就执行一次,如果放在外面那么每一个评论都执行一次

  9. seri says:

    看的头有点晕,代码神马的还是看的发秫 - -

    1. zwwooooo says:

      @seri
      呃,折腾一下就不会了

  10. 砼砼 says:

    不错啊,过几天我过来抄代码了,哈哈哈

    1. zwwooooo says:

      @砼砼
      囧~你还有玩博么?

    2. 砼砼 says:

      @zwwooooo
      打死你

    3. zwwooooo says:

      @砼砼
      打死不怕,最重要你复活了

    4. @砼砼
      ……你还玩博客?我被震精了……

  11. wpbus says:

    真的很不错的文章

  12. muki says:

    請問一下,如果要實現這個功能,是直接拿你的代碼複製貼上嗎?
    因為我照著貼上之後,樓層整個變成負的,而且是倒序,沒辦法跟你的留言一樣效果
    這是我的blog顯示頁面
    http://blog.mukispace.com/do-not-come-alone/

    1. muki says:

      @muki
      抱歉,剛嘗試了一下,發現是我沒開評論分頁。開了之後就會正了,但是另外一個問題出現了
      就是我的留言還是沒有依序出現
      不是1、2、3...這樣的次序,而是1、3、....

    2. zwwooooo says:

      @muki
      貌似是你没有开启嵌套,你只是定义了回复样式(你的回复也是主评论,而你定义的主评论没有显示楼层号吧)

    3. muki says:

      @zwwooooo
      先謝謝你的回覆~
      我在後台有開啟嵌套回覆(預設兩層),可以看到我一樓下面有一個"muki reply"的地方,那個就是用嵌套回覆的留言,只是我把一些資訊隱藏起來~~~

    4. muki says:

      @zwwooooo
      看到你的測試了
      我終於知道問題出在哪兒了...
      你說的沒錯,之前那句話非嵌套回覆,我剛剛啟用之後,忘了那句不是嵌套所留的留言。
      真的很抱歉造成你的困擾~~~
      也謝謝你願意幫我測試!!

    5. zwwooooo says:

      @muki
      看来是你的评论结构样式问题,我回复后的样式和主评论一样。另外博主的回复会变成子评论的样式,而评论又属于主评论,加上你隐藏了floor这个div,所以第2个楼层号没显示出来。
      看来是你的评论结构搞乱了。

    6. muki says:

      @zwwooooo
      是阿...因為我本來是打算用template tag的login函式,判斷只有管理者登入才會出現reply的字樣。
      結果沒想到他的判斷方法不是管理者登入,而是只要有登入wordpress就會出現reply可以點選...:(

    7. zwwooooo says:

      @muki
      判断管理者?很简单吧

  13. 不羡鱼 says:

    各种高级呀,非得在后台启用分页才能正常利用。 :evil:

    1. zwwooooo says:

      @不羡鱼
      因为用了分页参数

  14. 踏浪者 says:

    我是搜索来的,感谢了
    诚祝来年快乐、家庭幸福!
    平安,如意!

  15. 是否把那些代码加入到function.php中?不过我把它们加入到function.php中后,评论出问题了

    1. zwwooooo says:

      @亿品元素
      说明你没加好。

  16. Junan says:

    求救!!~发现我的主题中的functions.php 没有~mytheme_comment 回调函数~~ :grin: 要怎样才能显示 楼层~~ :sad:

    1. zwwooooo says:

      @Junan
      没有自己写个评论结构进去

    2. Junan says:

      @zwwooooo
      :oops: 太复杂了~

    3. zwwooooo says:

      @Junan
      不懂的话就复杂点,不过可以考虑copy

    4. Junan says:

      @zwwooooo 很多主题的参数不同~~我换了主题默认就有了~哈哈~

    5. zwwooooo says:

      @Junan
      你用的是mg12的主题了?哈,不过那楼层号是直接计数得出的,子评论也计数,如果我本来是3,如果我在3前面插入个子评论,那么我就又变成4了。也就是说你所用主题自带的计数器是针对老评论结构(非嵌套),我记得mg12说过他不喜欢嵌套,所以他的主题都没加支持。

    6. Junan says:

      @zwwooooo
      高手果然是高手~确实MG12的主题连ADMIN评论也记上了~~那我想请教一下~此文的数据支持MG12的主题么? :grin:

    7. zwwooooo says:

      @Junan
      需要修改,稍微麻烦点吧,具体没修改过。

    8. Junan says:

      @zwwooooo
      :cry: 那算了~~博客刚刚稳定下来~~就不折腾了~迟点再折腾~到时可能要请教您了~ :mrgreen:

    9. zwwooooo says:

      @Junan
      慢慢折腾

    10. Junan says:

      @zwwooooo
      HELP~~发现我的主题中的functions.php没有mytheme_comment函数~~怎么办~~

    11. zwwooooo says:

      @Junan
      1. 自己加
      2. 换主题
      3. 花钱请别人帮你加

    12. Junan says:

      @zwwooooo
      :grin: 那就不折腾了~折腾另一个算了~ :mrgreen:

    13. zwwooooo says:

      @Junan
      你用的不是mg12的嘛,有这个函数,只是函数名不同吧,具体看comments.php的回调函数名

    14. Junan says:

      @zwwooooo
      是呀~好的~谢谢提醒了~改天再折腾了~ :mrgreen:

  17. gry says:

    你这个有问题的,如果评论不分页,就会出现负数
    应该把

    $page = get_query_var('cpage')-1;
    

    改成

    $page = get_query_var('cpage')-1;
    if ($page<0) $page = 0;
    1. zwwooooo says:

      @gry
      但我这不会出现这个情况,按道理$page不会小于0

    2. gry says:

      @zwwooooo
      不分页时page应该等于0吧,而你又在后面减了1

    3. zwwooooo says:

      @gry
      只有一页时get_query_var('cpage')的值是1,所以要减 1 处理,然后计数器得到0值,没有错。。

    4. gry says:

      @zwwooooo
      如果没开启评论分页get_query_var('cpage')的值是0

    5. zwwooooo says:

      @gry
      呵呵,这里的代码针对开启嵌套

    6. Laycher says:

      @gry
      我也发现这个问题了,如果没有开启分页显示评论的话,会出错的。不过不知道为什么,我这里的page永远是-1,奇怪了。

    7. Laycher says:

      @gry
      我再次验证了一下,我发现,如果没有开启分页显示评论的话,get_query_var()返回的是null。

    8. zwwooooo says:

      @Laycher
      分页也要开启,代码木有做判断。看来要抽时间完善下

  18. 艺创网 says:

    可不可不以帮我看下怎么回事,楼层的位置css里不会改,能帮下忙吗,谢谢了。
    http://yc4u.com/archives/492.html :mrgreen:

    1. zwwooooo says:

      @艺创网
      你好像没加楼层代码

  19. Allan says:

    求解为Ajax comments评论增加楼层的方法。

    1. zwwooooo says:

      @Allan
      我这个不就是ajax评论提交么?

  20. 扣剑 says:

    一定要开启评论分页才行的吗?不开启的话,为什么是从高到低,比如我的是分页15楼。然后第一层就是14楼了,何解。。

    1. zwwooooo says:

      @扣剑
      一定要分页,不分页需要改改代码

    2. zwwooooo says:

      @扣剑
      不分页只要加个计数器就行了,简单的很。

发表评论

昵称 *

网址

B em del U Link Code Quote