2015.12.18 !!!:无意中在修改主题发现,此文章方法在 WordPress 4.4 出现错乱,我找个时间修正下。
----
今天在修改付费主题 zSnos2.5 时顺便把此主题的“主评论显示楼层号”代码优化了一下,让它支持评论顺序和倒序。
基础代码可以参考我以前写的 2 篇文章:《只在WP主评论加上楼层号的方法(支持评论分页)》,《倒序显示主评论楼层号(支持评论分页)》
很久没折腾这些了,当作是重新整理吧,以前都是折腾到什么就写什么,木有对相同功能的代码进行整合和优化,今天就先拿这个整合一下(还是折腾到啥写啥,囧)
前提条件:
1. 需要开启嵌套评论和评论分页功能(WP后台 》设置 》讨论)
2. 主题评论调用函数 wp_list_comments() (在 comments.php 文件里)使用了回调函数。具体参考:http://codex.wordpress.org/Template_Tags/wp_list_comments
3. 此文章所说主题评论是调用所有类型评论:comment、pingback、trackback,如果只是调用 comment 部分,需要对代码稍微修改
下面以官方给出的 wp_list_comments() 回调函数作为例子来说明。
1. 官方最新的 wp_list_comments() 回调函数代码:(这段代码一般放在主题文件 functions.php)
function mytheme_comment($comment, $args, $depth) { $GLOBALS['comment'] = $comment; extract($args, EXTR_SKIP); if ( 'div' == $args['style'] ) { $tag = 'div'; $add_below = 'comment'; } else { $tag = 'li'; $add_below = 'div-comment'; } ?> <<?php echo $tag ?> <?php comment_class(empty( $args['has_children'] ) ? '' : 'parent') ?> id="comment-<?php comment_ID() ?>"> <?php if ( 'div' != $args['style'] ) : ?> <div id="div-comment-<?php comment_ID() ?>" class="comment-body"> <?php endif; ?> <div class="comment-author vcard"> <?php if ($args['avatar_size'] != 0) echo get_avatar( $comment, $args['avatar_size'] ); ?> <?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?> </div> <?php if ($comment->comment_approved == '0') : ?> <em class="comment-awaiting-moderation"><?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 /* translators: 1: date, 2: time */ 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('add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth']))) ?> </div> <?php if ( 'div' != $args['style'] ) : ?> </div> <?php endif; ?> <?php }
2. 然后在 $GLOBALS['comment'] = $comment; 这句下面添加楼层号处理函数,具体看下面修改好的的代码(蓝色部分)
2015.07.12 补充:有朋友说 WordPress 4.x 倒序方式时获取的总评论数失效,已改为 #42 楼的方法解决
2016.04.21 修正:忘了是 WordPress 4.x 了,$in_comment_loop 无法获取正确的值,已改为 get_query_var('cpage') 来判断(感谢 #44 楼的朋友指出)。
<?php function mytheme_comment($comment, $args, $depth) { $GLOBALS['comment'] = $comment; //主评论计数器 by zwwooooo global $commentcount, $page, $wpdb; if ( (int) get_option('page_comments') === 1 && (int) get_option('thread_comments') === 1 ) { //开启嵌套评论和分页才启用 if(!$commentcount) { //初始化楼层计数器 $page = ( get_query_var('cpage') ) ? get_query_var('cpage') : get_page_of_comment( $comment->comment_ID, $args ); //获取当前评论列表页码 $cpp = get_option('comments_per_page'); //获取每页评论显示数量 if ( get_option('comment_order') === 'desc' ) { //倒序 $cnt = get_comments('post_id='.$post->ID.'&status=approve&count=true'); //获取主评论总数量 if (ceil($cnt / $cpp) == 1 || ($page > 1 && $page == ceil($cnt / $cpp))) { //如果评论只有1页或者是最后一页,初始值为主评论总数 $commentcount = $cnt + 1; } else { $commentcount = $cpp * $page + 1; } } else { $commentcount = $cpp * ($page - 1); } } if ( !$parent_id = $comment->comment_parent ) { $commentcountText = '<div class="floor">'; if ( get_option('comment_order') === 'desc' ) { //倒序 $commentcountText .= --$commentcount . '楼'; } else { switch ($commentcount) { case 0: $commentcountText .= '<span>沙发!</span>'; ++$commentcount; break; case 1: $commentcountText .= '<span>板凳!</span>'; ++$commentcount; break; case 2: $commentcountText .= '<span>地板!</span>'; ++$commentcount; break; default: $commentcountText .= ++$commentcount . '楼'; break; } } $commentcountText .= '</div">'; } } extract($args, EXTR_SKIP); if ( 'div' == $args['style'] ) { $tag = 'div'; $add_below = 'comment'; } else { $tag = 'li'; $add_below = 'div-comment'; } ?> <<?php echo $tag ?> <?php comment_class(empty( $args['has_children'] ) ? '' : 'parent') ?> id="comment-<?php comment_ID() ?>"> <?php if ( 'div' != $args['style'] ) : ?> <div id="div-comment-<?php comment_ID() ?>" class="comment-body"> <?php endif; ?> <div class="comment-author vcard"> <?php if ($args['avatar_size'] != 0) echo get_avatar( $comment, $args['avatar_size'] ); ?> <?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?> </div> <?php if ($comment->comment_approved == '0') : ?> <em class="comment-awaiting-moderation"><?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 /* translators: 1: date, 2: time */ 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('add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth']))) ?> </div> <?php echo $commentcountText; //主评论楼层号 - by zwwooooo ?> <?php if ( 'div' != $args['style'] ) : ?> </div> <?php endif; ?> <?php }
注:(底部显示位置可以自己根据自己所用主题选择,这里我加在回复按钮后面,另外楼层显示样式可以通过 floor 这个 class 定义)
就这样吧,现在折腾 WordPress 的朋友少了很多,新朋友参考一下吧。
- 本文标题:只在WP主评论加上楼层号的方法『支持顺序、倒序』
- 本文链接:https://zww.me/archives/25716
- 发布时间:2012年11月17日 15:38
- 版权声明:除非注明,文章均为 zwwooooo 原创,转载请以链接形式标明本文地址!
尼妹广电的宽带速度真让人蛋疼...速度占领沙发~~~ 代码抄走`~~
@zoe
蛋疼的网速抢沙发掠夺代码走人……
zsons还在修改?意料之外啊
@空空裤兜
有些客户需求,简单改改,当然是收费的。。。
@zwwooooo
我以为还在升级呢
@空空裤兜
可能会升一次,不过不会有多大变化
支持Z大
购买过的可以免费更新吗?
@Michael
我只是帮某个买的用户修改,不过也许会升级一次,但不会有多大变化,到时只要博客还在用zSnos2.5主题的的用户就可以免费更新,没有用的拿去也没用
看看第4叫什么~
@时光的线条
好冷……
很有必要这么显示。
好像弄过类似的,忘了以前是怎么整的了……
用的第三方评论系统,压力不大。
我那里正好出现一个问题,顺序和倒序问题,新评论只能在前面,旧评论沙发却到后面去了,很想调回来,但是后台设置木有用,明天准备看看修改一下代码实现,你这文章真是雪中送炭。
@郑永
试试吧
我最近模版代码已经改得很混乱了,已经担心后续的维护。。。
@茶话汇
其实可以考虑子主题模式修改
强势插入!
真霸道。。。
@毕扬
啥?
嗯,好吧,昨晚我也在写评论楼层这个问题,思路和你完全不一样,不过感觉你的要好很多,查询数据库的次数要少点。
————————
@云淡然博客
我这个只查询一次吧,如果输出每条评论都查询服务器会哭给你看的
@zwwooooo
每新增一条主评论,是不是要去查询一次,除非新增的时候不计算楼层,只在输出的时候计算。
@云淡然博客
每次页面查询一次,如果是倒序的话。
kan最近干什么去了啊
@Willin Wang
不知道啊,他对WP木有兴趣了
我的主题不能直接用,等有空的时候研究下代码
@Louis Han
得针对自己主题修改
有没有办法让 评论填写的信息域名地址 只可以是 顶级域名,否则不通过。
@郑永
应该可以,用正则检查
那是好早的一个主题了吧
@策划那些事儿
对,很老了
能够运用到多说上面去吗
@wwk
多说是第三方评论系统,你要这个功能等于要修改插件,还是别折腾。
我的显示楼层方式,似乎更简单一些了,但是你的比较多样化一些
又看到一个站的评论有了新方法,主评论上显示1、2、3等等
副评上显示1-1、1-2,2-1、2-2、2-3等等。这样应该怎么来实现?
@wmtimes
去木木那吧,他写过。
@zwwooooo
真的?我看看。