WordPress 嵌套回复

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(); ?> 前方添加以下代码.

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

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

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

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

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

1
<?php wp_list_comments(); ?>

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

1
<?php comment_id_fields(); ?>

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

1
<?php cancel_comment_reply_link() ?>

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

1
<?php comments_template(); ?>

修改为一下代码

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

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

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

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

2. 在 comments.php 中将

1
<?php wp_list_comments(); ?>

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

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

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

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

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

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

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

后记

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

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

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 嵌套回复
  1. neo | #51
    2009-08-02 00:34

    Great tutorial.

    Will test it if got free time.

    I will consider also your pros & cons.

    Thanks.

  2. mg12 | #52
    2009-08-02 01:54

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

    @neo
    WOW, how many languages you can read?

  3. 闻人卯 | #53
    2009-08-06 12:43

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

  4. houkai | #54
    2009-08-20 21:31

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

  5. mg12 | #55
    2009-09-08 18:19

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

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

  6. yimu | #56
    2009-09-11 14:57

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

  7. Dim | #57
    2009-11-11 14:49

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

  8. tarsus | #58
    2009-11-27 01:43

    thanks admin
    Are you really cool

  9. 土得掉渣 | #59
    2009-11-29 15:25

    太有用了

  10. 土得掉渣 | #60
    2009-11-29 15:25

    能下载源码不

  11. 星点 | #61
    2009-11-29 15:57

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

  12. 枯藤昏鸦 | #62
    2009-12-11 13:11

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

  13. AnQ | #63
    2009-12-20 16:27

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

  14. 江流 | #64
    2009-12-29 12:56

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

  15. | #65
    2010-01-26 14:51

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

  16. Nox | #66
    2010-01-26 16:16

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

  17. | #67
    2010-01-26 16:20

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

  18. Nox | #68
    2010-01-26 17:27

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

  19. | #69
    2010-01-26 17:28

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

  20. Nox | #70
    2010-01-26 17:33

    @锋
    mg12的找不到了,我发木木的教程给你吧
    http://immmmm.com/sharing-articles-telescopic-effect-code.html

  21. | #71
    2010-01-26 17:36

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

  22. wuleilei | #72
    2010-04-18 13:49

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

  23. ckqee | #73
    2010-06-01 14:26

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

  24. fly3q | #74
    2010-06-30 22:55

    很好,谢谢了。 :smile:

  25. bujin | #75
    2010-07-19 22:04

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

  26. bujin | #76
    2010-07-19 22:06

    @园子
    这个呢... ;-)

Comment pages
1 2 876
  1. 利用JQuery为WordPress的嵌套回复添加@reply功能 | Jinwen Say
    2009-07-19 05:40
  2. WordPress 嵌套回复构成原理
    2009-07-21 21:41
  3. 如何让WP主题同时支持嵌套评论与邮件回复 - 活着
    2010-04-09 15:35
  4. Log4D改版完成 – Log4D
    2010-04-14 19:20

Twitter Email feed
RSS feed