2010年05月25日 231条评论

只在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. 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
      判断管理者?很简单吧

  2. [...] 這是我參考的文章:只在WP主評論加上樓層號的方法(支持評論分頁),不過要使用這個方法的話,請先開啟評論分頁(後台→設定→討論)。如果你跟我一樣不想使用評論分頁的話,可以使用他提供的語法再做一點小修改,將$commentcount = $cpp * $page; 改成  $commentcount = 0; 即可。這邊要謝謝風痕影的幫忙:)。 [...]

  3. [...] http://zww.me/archives/25161 alimama_pid="mm_10147772_223266_1873839"; alimama_titlecolor="0000FF"; alimama_descolor [...]

  4. 不羡鱼 says:

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

    1. zwwooooo says:

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

  5. 踏浪者 says:

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

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

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

    1. zwwooooo says:

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

  8. 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:

  9. 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
      分页也要开启,代码木有做判断。看来要抽时间完善下

  10. 艺创网 says:

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

    1. zwwooooo says:

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

  11. Allan says:

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

    1. zwwooooo says:

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

  12. 扣剑 says:

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

    1. zwwooooo says:

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

    2. zwwooooo says:

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

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

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

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

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

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

    1. zwwooooo says:

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

  18. 有点蓝 says:

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

    1. zwwooooo says:

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

    2. 有点蓝 says:

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

    3. zwwooooo says:

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

  19. 有点蓝 says:

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

    1. zwwooooo says:

      @有点蓝
      要仔细看文章

  20. chungee says:

    这个Ajax评论楼层能更新么

    1. zwwooooo says:

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

发表评论

昵称 *

网址

B em del U Link Code Quote