WordPress评论表单默认只接受昵称、电子邮箱、网址和评论内容这四个字段,如果你想让用户输入一些额外的信息,就得想办法拓展评论表单的功能。用户评论存储在wp_comments表中,每个默认字段也是这个表的一个字段,添加额外字段肯定不能通过修改这个数据表实现。

wp_commentmeta

wp_comments也有一个与之对应的meta表,叫做wp_commentmeta。posts可以用post meta存储一些额外信息,comment也可以用comment meta存储信息。因此,我们可以用wp_commentmeta表存储要添加到评论表单中的内容。

举个实际的例子,向评论表单添加新浪微博ID字段(用ID而不是昵称,是因为Sola还没研究过新浪API),用户输入新浪微博ID以后,就可以在评论中显示“加关注”按钮,人们点击这个按钮就可以关注评论者了,这样也许能鼓励评论者发布一些有用吸引人的评论。

数据将会以如下形式存储在wp_commentmeta表单中

wp_commentmeta-table

如何向评论表单添加自定义字段

这个是老生常谈了,可以使用filter comment_form_default_fields或者comment_form_defaults

如果你坚持要知道为什么可以用这两个,推荐去读一下源代码

wp-includes/comment-template.php 1535行(apply_filters( 'comment_form_default_fields', $fields ))和1549行($args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) );)

添加微博字段的代码如下,写到主题的functions.php中,再次膜拜强大的functions.php

add_filter('comment_form_default_fields','comment_form_add_weibo');
function comment_form_add_weibo($fields) {
  $label = __( 'Weibo ID' );  
  $value = isset($_POST['weibo']) ? $_POST['weibo'] : false;
 
  $fields['weibo'] =<<<HTML
<p class="comment-form-weibo">
<label for="weibo">{$label}</label>
<input id="weibo" name="weibo" type="text" value="{$value}" size="30" />
</p>
HTML;
  return $fields;
}

存储数据

通过action wp_insert_comment实现,代码如下,同样放到functions.php中

add_action('wp_insert_comment','wp_insert_weibo',10,2);
function wp_insert_weibo($comment_ID,$commmentdata) {
  $weibo = isset($_POST['weibo']) ? $_POST['weibo'] : false;
  update_comment_meta($comment_ID,'_weibo',$weibo);
}

添加上面两段代码以后,就可以查看效果了,以twentyeleven主题为测试对象(wp > 3.0)

添加微博字段

当然Sola小偷懒了一下,第一段代码中的

<p class="comment-form-weibo">&nbsp;</p>

被换成了

<p class="comment-form-url">&nbsp;</p>

不然是无法实现与其它字段相同的效果的,除非去改一下CSS,不过懒人嘛

填好表单提交以后微博ID就会被保存到wp_commentmeta表单中,如本文第一张图片所示。

如何调用comment meta信息

调用代码如下

$weibo_id = get_comment_meta($comment_ID,'_weibo',true);

为了能看到效果,修改一下twentyeleven的functions.php中wp_list_comments()函数的回调函数twentyeleven_comment(),在这个函数中输出新浪微博“加关注”按钮。需要添加的代码如下

<div class="weibo">
    <?php $weibo_id = get_comment_meta($comment->comment_ID,'_weibo',true);
    if( !empty($weibo_id) ):?>
    <iframe allowtransparency="true" border="0" frameborder="0" height="24" marginheight="0" marginwidth="0" scrolling="no" src="http://widget.weibo.com/relationship/followbutton.php?language=zh_cn&amp;width=63&amp;height=24&amp;uid=<?php echo $weibo_id; ?>&amp;style=1&amp;btn=red&amp;dpc=1" width="63"></iframe>
    <?php endif; ?>
</div>

效果如下图所示

加关注按钮

但在把微博ID换成微博昵称之前,这段代码没有实际用途,对用户很不友好,要换成用户昵称也是可以的,需要获得新浪API使用权,通过API调用将用户的昵称转换成ID,再用这段代码输出。

资源链接

获取新浪微博加关注按钮代码

通过新浪微博API获取用户ID(Users/show)

如何通过钩子函数向WordPress评论表单中添加任意内容

39条留言

  1. 感谢博主的讲解。我有些疑问就是,我单独处理update_comment_meta和get_comment_meta函数为什么不成功。我想通过异步方式添加评论点赞功能。但是这两个函数就是不成功

  2. 我的评论分页显示,每页20个评论,我想在每页的第3个评论下面添加广告代码,请教一下该如何实现呢?

  3. 这种方式添加的字段,在后台查看评论时怎么不显示呢?
    如何在后台显示呢?
    谢谢!

    1. 因为后台和前台是两套不同的程序,这里的方法只是更改前台,对后台没有影响的。后台怎么显示我还没研究过,等我看过后告诉你。

  4. 请问 ,如何在模板中调用 围脖的 输入文本域? 我在function,php中添加函数后- -并没有出现新增的表单。

    1. 这个字段只会在没登陆的时候出现,登陆就没了。
      另外,最好使用默认主题测试。

  5. 如果能够在后台增加新域的列更好

    1. 这是一个很有趣的问题,多谢告之。在后台增加新域就是在comment列表和编辑页面增加吧,Ludou有这方面的文章吗?

        1. 看了下,有点头绪,谢谢你,-)我回头仔细研究一下

          1. 不知道 你有没有研究出来?如果能在后台编辑 就更加实用了

  6. 按照你的步骤做了,twentyeleven模版,新建字段插入不进数据,value获取不到值

  7. 经过这么几天的浏览,对这个主题风格深深怀疑,总觉得这个风格不适合长时间阅读学习,有点花眼。Sola,你要找个简洁类的风格更适合这个技术博客。底色可以再淡点,文字可以再深点,一条条的底纹还是去掉吧。

    1. 哈哈,多谢建议,你看了很长时间真让我感动。因为一开始做博客没打算做技术博客的,就是平时遇到的问题写一写,所以找了个自己喜欢的动画做背景,弄了个notepad主题,因为我就是要一个网络记事本嘛。目前也没确定就是技术博客哦,如果是的话以后考虑换一个。

      不过被你一说,我发现我写猪的博客挑了一个简洁的news主题,写工作笔记的博客反而弄了个个性化的囧

  8. WP有没有PM给管理员的插件?

    1. 你说的PM给管理员是指用户可以向管理员发送内部邮件吗?类似论坛用户互相发送私信那样?

        1. 这个我就知道buddypress自带这个功能,也有用户之间互相pm的插件,比如Private Messages For WordPress。只给管理员的没见过呢。
          你要做什么用途?如果只是允许用户发送仅管理员可用的信息,弄个悬浮式feedback表单也行吧

          1. 好,我去试用一下。

        2. 其实Private Messages For WordPress我也没用过,试用了评价一下哦。你做的那个书籍网站太牛了,我看了半天了,你那个主题确实清新简单,cleartype啊

          1. 是啊,这个主题还是我唯一用钱买的正版。作者也是大陆的。那个书籍网站对我这个半吊子来说,学到很多东西,WP真是强大,不过现在怀疑这种大数据库网站(小说站其实很费数据库的),WP能不能胜任?

        3. 数据库大了流量再大大点WP跑起来比较吃力的,必须得装缓存插件。不知道你的分类排名是用根据什么排。如果不涉及到读写数据库操作(像 wp postviews那样),直接静态化成html文件就行了。
          评论也可以装个第三方插件,这样开启缓存就不怕了,还能节省自己的资源。
          我对wp缓存机制不太了解呢,缓存插件用过,但不是太称心如意。

          1. 本来只有post类型时,我是用wp postviews的,现在因为有几个自定义类型,wp postviews不会自动创建view这个字段了,如果是手动加上能不能起作用,我没试。现在用了 WP Most Popular 这个,但这个也有缺点,如果查询分类排行,必须涉及三个数据表查询,肯定会影响速度。不知道那个作者会不会改进。

        4. 据我所知,wp postviews和自定义文章类型不冲突,可以一起工作的,wp postviews用custom-fields存储数据,所以注册自定义类型时support里应该有custom-fields,可能是这样,因为我用自定义类型时,可以直接通过get_post_meta函数调用wp postviews的数据,似乎没啥问题。
          你说不起作用,就是Custom Content Type Manager和wp postviews一起用不行吧,改天我也试试。

          1. 啊,你这个倒是提醒我了,以前新建 post时,view是自动出现在custom fields,我以为在添加自定义类型时应该也可以。现在想起来,在更新CCTM的自定义类型时, 只能出现它创建的custom fields,而我没把 views 这个创建起来,如果创建这个字段后, wp postviews不知道会不会去更新它?CCTM要是能管理以前 post 用的 custom fields, 那就更合理了。 我明天要试试再说。

          2. 很好,我刚才试了下,手动创建views字段,然后加入到各个类型,wp views会自动更新计数。

        5. good,又研究出一个东西来

  9. 我也mark下。考虑到技术文章比较多,建议sola搞个会员收藏文章的功能。有现成的 WP Favorite Posts 插件可用。

    1. 多谢,刚下了这个插件试用了一下,确实是个好功能,唯一的问题是如果开启非登陆用户使用的功能,登陆以后和未登录之前的记录会不一样,不过影响不大,研究研究我也装上。
      之前听说wordpress.com的喜欢按钮很成功,哈哈,我也跟风一下

      1. 这个区别 我竟然没发现。

评论功能已关闭