WordPress 嵌套回复

Jul 18th, 2009 Add Comment

WordPress 2.7 开始引入了原生的嵌套回复功能. 这是一个有争议的功能, 也是制作主题中一个难度较高的模块, 所以大家对它一直讨论不断.

WordPress 嵌套回复

要不要使用嵌套回复? (优缺点对照)

一部分人对这个功能垂涎已久, 在 WordPress 原生支持嵌套回复之前就尝试使用一些插件来支持该功能. 嵌套回复有很多优点:

1. 它可以提高用户体验, 调动访客回复的积极性, 从而增加评论的数量, 能让博客变得像社区一样活跃.

2. 博客的回复邮件通知功能越来越被重视, 因为它可以为你挽留一些游客. 另外评论者发表评论后也不用经常回来查看是否被答复, 可以在一定程度上提高互动性. 嵌套回复可以有针对性的对评论进行答复, 评论者只要收到邮件便可知其所答.

另一部分人不使用嵌套回复, 我就是其中之一. 为什么呢? 且听我慢慢道来. 任何事物都有其利弊, 嵌套回复也存在一些缺点:

1. 嵌套回复是一种依赖程序的显示结构, 也就是说, 只要你使用了一次, 以后必须使用, 否则评论的顺序就乱了. 假设现在有 A, B, C 三人, 他们都进行了一次评论, 操作如下:
A 添加了一条评论.
B 也添加了一条评论.
C 回复了 A 的评论.

如果主题支持嵌套回复, 会得到以下的显示结构:

A

C

B

但如果主题不支持嵌套, 则会显示如下:

A

B

C

也就是说, 页面结构将变得无比的混乱, 你不得不让当前主题支持嵌套回复, 或者使用插件对其进行支持. 这就是对程序的依赖, 除非精通其制作原理, 否则它会限制你对主题和插件的选择.

2. 嵌套回复有针对性的回复功能 (针对某条评论进行回复) 是它的优势, 同时也是他的劣势. 如果有 100 个人在你的一篇文章中发表了评论, 并且你习惯对大部分评论都进行回复, 那是不是你也需要回复差不多 100 次? 如果这样的话, @ 回复比嵌套回复更适合你.

3. 嵌套回复依赖浏览器对 JavaScript 的支持.

我不使用嵌套回复也是因为前两个原因, 我不敢确定自己以后会一直使用嵌套回复, 并且在我的回复者中, 经常出现几个人提问同一个问题. 使用 @reply 是一个折中的选择, 我可以在一个回复中回答网友的评论, 并且我无需对相同的提问进行多次回答; 另外, 通过一些插件, 我同样可以实现回复邮件通知的功能, 仅是邮件内容稍为复杂罢了.

怎样将嵌套回复功能集成到主题中?

在主题中实现嵌套回复的方法有二, 包括 WordPress 提供的默认方法和自定义的回调方法. 下面我会讲解一下如何实现起嵌套结构, CSS 部分请自行研究.

默认方法:
WordPress 提供的基本的嵌套风格, default 主题用的就是这种模式.
优点: 方便使用, 减少代码量.
缺点: 代码结构不好, 不可能适合所有的主题.
实现步骤如下:

1. 在 header.php 的 <?php wp_head(); ?> 前方添加以下代码.

<?php if(is_singular()) wp_enqueue_script( 'comment-reply' ); ?>

其作用是加载嵌套回复所需的 JavaScript 代码. (也就是说, 如果浏览器不支持 JavaScript, 嵌套回复就没法实现)

2. 在 comments.php 文件的顶部添加以下代码.

<?php
	if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME'])) {
		die (__('Please do not load this page directly. Thanks!'));
	}
?>

3. 在 comments.php 文件的评论列表元素中添加以下代码调用所有相关评论.

<?php wp_list_comments(); ?>

4. 在 comments.php 的 id="commentform" 元素内部添加以下代码.

<?php comment_id_fields(); ?>

和表单的适当取消回复按钮, 代码如下.

<?php cancel_comment_reply_link() ?>

5. 将所有调用评论部分的代码由

<?php comments_template(); ?>

修改为一下代码

<?php comments_template('', true); ?>

回调方法:
在基本嵌套的基础上, 定义 callback 方法以重新定义评论的内容和布局.
优点: 灵活多变
缺点: 增加大量代码

关于自定义嵌套回复, 我在之前的文章 "更新至 WordPress 2.7 正式版" 中误报了一个 bug. 在此, 我向所有读过此文的读者道歉.

1. 在默认方法的基础上, 添加一个回调函数, 以取代 WordPress 默认的评论布局. 我在 function.php 中添加了一个名为 custom_comments 的方法. 这里需要注意, 请不要加上结束的 </li> 标签, 我会在后续文章中说明具体为何不能加上.

2. 在 comments.php 中将

<?php wp_list_comments(); ?>

修改为以下代码以调用自定义的 custom_comments 方法

<?php wp_list_comments('callback=custom_comments'); ?>

详细代码可以参考本人制作的 Blocks 主题.

什么主题适合添加嵌套回复?

在主题中添加嵌套回复是个麻烦事, 它很折腾人, 而且会打乱整个主题结构, 直到现在我还在怀疑官方是否应该原生地支持嵌套回复. 但既然支持了很应该尝试一下, 那是不是所有的主题都适合添加嵌套回复功能? 我觉得不是.

对于一些图片较多的, 或者评论页面结构复杂的主题, 显然是不适合的, 这就是为什么我一直不在 iNove 添加嵌套回复功能的原因. 但是对于一些不依赖图片的主题, 如 Blocks 就很适合添加.

另外, 还需要根据你的需求判断是否支持嵌套回复, 支持多少层的回复? 最深层次是 10, 但我们可以只支持到第二或者第三层, 以降低开发成本.

后记

不知为何, 没有使用嵌套回复的我被多次问及相关的问题. 因为嵌套回复实现复杂, 难以维护, 和其他一些原因, 很多主题没有支持嵌套回复, 但很多人却是对它情有独钟, 我觉得可以将我的理解和大家分享一下.

接下来, 我还会另起文章讲解一下 "嵌套回复的工作原理" 和 "如何在兼容多个 WordPress 版本的前提下实现嵌套回复", 如果你有更好的建议或者任何意见, 请在此留言.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 嵌套回复

  1. http://0.gravatar.com/avatar/60abbec3b6708ab3295ce2a24100a958?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    好东西,收藏了

  2. http://0.gravatar.com/avatar/22cceb9589d78686dab902cf0416d690?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    学习中,这个功能不错的。

  3. http://0.gravatar.com/avatar/6009dd94b715f7cb1d6a6f7cdd840774?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我想要嵌套回复

  4. http://0.gravatar.com/avatar/01a9047d34bae96fdb33232ad495260e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    终于搞定了,谢谢~

  5. http://0.gravatar.com/avatar/20abd77d09d91bb060b9e9ffd0cef60c?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    本来打算弄成嵌套回复的, 看了博主的文章, 放弃了..

  6. http://1.gravatar.com/avatar/f1e651d5b65bc105fc9395e457a01440?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不懂,直接插件完成

  7. http://1.gravatar.com/avatar/11621625d03eb90aa079c8df4005d9a5?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @ElvisZhu
    我是来试回复看效果的,你可以把我当成打酱油的!谢谢!

  8. http://0.gravatar.com/avatar/a1d7aeb107afa6f100b632effe7c5ff6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @ElvisZhu
    试试回复了

  9. http://0.gravatar.com/avatar/a1d7aeb107afa6f100b632effe7c5ff6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    昨夜西风 :
    你现在的这个评论模式就比较好

    我也觉得

  10. http://0.gravatar.com/avatar/867f7cf564ec2cebb327f2d4c50b3de6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    朋友你好 你能帮我看看我的网站http://www.dream58.net 为啥没有回复功能呢!跟我用同样主题的他们都有的 我的为啥没有呢 谢谢

  11. http://0.gravatar.com/avatar/4ba2c8abc679960f3a1d21f4c5f0ea48?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    你现在的这个评论模式就比较好

  12. http://1.gravatar.com/avatar/9d2b4d63d962a9af3900b0bb94a05883?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    請問怎麽判斷嵌套是否到達上限?比如我在後台設定只能嵌套2層,當到第3層的時候便不能再嵌套了,WP是如何得知呢?如果我要人手判斷,應如何做?

  13. http://0.gravatar.com/avatar/28dc98a17be349e3141f27bed4a9a7aa?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  14. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @yimu
    代码, ... 我发布的主题里面有代码, 你下载一个来分析吧.

    @Dim
    不是不想, 制作不成插件.

    @星点
    私人主题, 不提供分享.

    @AnQ
    可以请人的, 呵呵~

    @wuleilei
    我写过一篇关于嵌套回复原理的文章.
    http://www.neoease.com/wordpress-walker-comments/

    @Nox
    谢谢帮忙回答这么多问题.

    @ckqee
    祝你成功.

    @junghae
    嵌套回复太多副作用, 不用~

  15. http://0.gravatar.com/avatar/20479044f88216094f34c2d3270f097e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @mg12 mg12,用嵌套吧,别犹豫了,哈哈!你现在的我看的头晕,相信其应该有其他人跟我一样感觉的吧!!!

  16. http://0.gravatar.com/avatar/eeeef451e5cfc35ce69abf30d7bbbd21?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  17. http://0.gravatar.com/avatar/eeeef451e5cfc35ce69abf30d7bbbd21?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @neo
    回复效果看看,,准备弄这个也可以 这个简单 :evil:

  18. http://0.gravatar.com/avatar/8095a0b75ae483b44f9d801175b87835?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    很好,谢谢了。 :smile:

  19. http://1.gravatar.com/avatar/b1f7df9276d46dd6db5e6e83bb8df4b3?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    可以考虑递归,我正打算把评论改成嵌套回复,折腾

  20. http://0.gravatar.com/avatar/69f25c2a0d43c0e93dccd2b75c777878?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不知道博主能不能提供非WordPress的评论嵌套制作思路呢?

  21. http://1.gravatar.com/avatar/d34d3a0e64809dc205c9cb364cd63ec9?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Nox 多谢多谢。哈,到你的站看看去。哈

  22. http://0.gravatar.com/avatar/4f4e2e8611a5f3de7a7bd5e7aaa21dbb?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  23. http://1.gravatar.com/avatar/d34d3a0e64809dc205c9cb364cd63ec9?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Nox 教程是哪篇呀。发我下。哈。多谢

  24. http://0.gravatar.com/avatar/4f4e2e8611a5f3de7a7bd5e7aaa21dbb?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @锋
    一般提供下载的主题没有这个功能,但是mg12已经提供了修改教程,可以自己DIY。

  25. http://1.gravatar.com/avatar/d34d3a0e64809dc205c9cb364cd63ec9?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Nox 难怪这么强。原来是高人呀。哎。初来乍道,失敬失敬。不知道下载的有没有加那个日志收起展开功能。

  26. http://0.gravatar.com/avatar/4f4e2e8611a5f3de7a7bd5e7aaa21dbb?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @锋
    你问的实在是太经典了。。。 mg12制作的iNove主题,在wp官方下载排行榜首居第一。你认为这个主题是他下载的,还是自己制作的? :cool:

  27. http://1.gravatar.com/avatar/d34d3a0e64809dc205c9cb364cd63ec9?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    你的主题是下的还是自己做的呀,真不错

  28. http://0.gravatar.com/avatar/0184be6025088ca575f080f23ad6b544?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    留爪,备用,晚上回去白老鼠

  29. http://1.gravatar.com/avatar/f150a877b40e827c8526f8534ca92e20?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    评论的嵌套,这个好难啊,对于我这样的菜鸟,无法实现这样的修改,叹

  30. http://0.gravatar.com/avatar/03487f19b54904dbf98f5ba4f10b04bb?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这今天正在搞这个,太折腾了算了我还是用插件吧

  31. http://0.gravatar.com/avatar/8f2e713e8af78b41918e0fc3f0e13eb2?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵,很喜欢你现在用的主题,能分享吗?哈哈

  32. http://1.gravatar.com/avatar/57b1402b68cfd12bc33783bd2fdd36b8?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    能下载源码不

  33. http://1.gravatar.com/avatar/57b1402b68cfd12bc33783bd2fdd36b8?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    太有用了

  34. http://1.gravatar.com/avatar/1b75c9e90665140e7d3b2398089171fa?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    thanks admin
    Are you really cool

  35. http://1.gravatar.com/avatar/9f9f37535a2b7deb538ab1856302ced3?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    非常喜欢您这个回复评论模式,
    是否能制作以插件形式提供呢?

  36. http://0.gravatar.com/avatar/2aab720191504362650d8c197a84933d?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    想问一下,@reply是如何实现的,代码或是插件
    还有quote是如何实现的呢

  37. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @闻人卯
    我修改了 comment vote 这个插件.

    @houkai
    这个不是 bug, 是 JavaScript 被重载了, 暂时我还不想处理, 正在考虑替代方法.

  38. http://0.gravatar.com/avatar/4dfbd693401458acb2f672f2c811fbc3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    报告bug 这篇日志打开默认评论是第二页 如果翻到第一页 回复的显示层就不会出现了

  39. http://0.gravatar.com/avatar/205f851d56c90edea12eb2aa4c15b9ea?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    请教博主,你的评论回复怎么弄的,能否写个菜鸟教程!

  40. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @LAONB
    哈哈, 我喜欢用隐喻, 职业病.

    @neo
    WOW, how many languages you can read?

  41. http://1.gravatar.com/avatar/5359b0f88df7a5f897c54bf612b21e37?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    Great tutorial.

    Will test it if got free time.

    I will consider also your pros & cons.

    Thanks.

Comment pages
  1. Loading...