上一篇教程《wordpress3.0之comment_form()实战(上)》主要讲解了wordpress3.0中comment_form()函数的基础用法,今天这篇教程,明河将讲述comment_form()的高级技巧。
过滤评论表单的字段
举个例子,默认的评论表单包含名称、email、url、评论内容,现在明河觉得url是多余的,想把url这个字段去掉,如何控制呢?
1、请打开你当前主题的Functions.php页面
2、加入如下代码:
- add_filter('comment_form_default_fields', 'mytheme_remove_url');
- function mytheme_remove_url($arg) {
- $arg['url'] = '';
- return $arg;
- }
保存后刷新页面,你就会看到“url”输入框已经不复存在。
添加新的表单字段
继续在Functions.php操作,现在加入“QQ”字段。
加入如下代码:
- function my_fields($fields) {
- $fields['qq'] = '<p class="comment-form-qq">' . '<label for="qq">QQ</label> ' .
- '<input id="qq" name="qq" type="text" value="' . esc_attr( $commenter['comment_qq'] ) . '" size="30" /></p>';
- return $fields;
- }
- add_filter('comment_form_default_fields','my_fields');
保存后,刷新页面就会看到“QQ”了。
如果你设置$fields['author'],与默认字段(author、email、url)相同,就会覆盖默认字段。
comment_form()的钩子(Hooks)
comment_form()全部钩子
• comment_form_before
• comment_form_must_log_in_after
• comment_form_top
• comment_form_logged_in_after
• comment_notes_before
• comment_form_before_fields
• comment_form_field_{$name}
• comment_form_after_fields
• comment_form_field_comment
• comment_form
• comment_form_after
• comment_form_comments_closed
钩子的使用
明河举个例子,我希望在表单前面加上一句话,看代码(还是操作Functions.php):
- function comment_form_before_test(){
- echo "<p>明河的测试</p>";
- }
- add_action( 'comment_form_before', 'comment_form_before_test' );
comment_form()其他钩子的使用与之类似。
改变comment_form()的布局和样式
在上一篇教程中,guny曾问明河,“如何处理皮肤(skin or 表单布局)”,接下来明河演示如何自定义出任何想要的布局和样式。
一般主题的表单如下图:

我们希望表单的结构类似于RIA之家的评论表单,如下图:

来看代码(先把之前的测试代码去掉):
- function ria_fields($fields) {
- $fields = array(
- 'author' => '<p class="comment-form-field comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
- '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="13"' . $aria_req . ' /></p>',
- 'email' => '<p class="comment-form-field comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
- '<input id="email" name="email" type="text" value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="13"' . $aria_req . ' /></p>',
- 'url' => '<p class="comment-form-field comment-form-url"><label for="url">' . __( 'Website' ) . '</label>' .
- '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="13" /></p>',
- );
- return $fields;
- }
- add_filter('comment_form_default_fields','ria_fields');
我们主要是让author、email、url排成三列,需要将默认的字段使用自定义的结构覆盖掉,如上代码,给每个”p”加上个新的”comment-form-field”。
接下来就是在style.css对这个样式进行操作,代码如下:
- #commentform {
- display:block;
- height:1%;
- content:".";
- }
- #commentform .comment-form-field{
- width:33%;float:left;
- }
- #commentform .comment-form-field input{
- width:190px;
- }
- #commentform .comment-form-comment{
- float:left;width:100%;
- }
- #commentform .comment-form-comment textarea{
- width:614px;
- }
OK!完毕!
作者结语
wordpress的强大和优良的扩展性的确让人叹为观止,有太多的使用技巧等待挖掘,欢迎各路朋友与明河一起探讨,谢谢!

首先,承认comment_form()的强大及易用性,但个人觉得还是差了那么一点点。
comment_form()里如果再给一个变量传递就好了,比如$skin。
这样的话view和控制器完全分离了。
用户制作的皮肤(HTML,css)文件夹来管理,那样的话直接调用comment_form(,,,,皮肤名称)就一步实现啦。
呵呵,没有直接的方法,却有变通的法子。比如$skin,设置为函数,function skin1(){} function skin2(){} ,然后设置add_filter(‘comment_form_default_fields’,'skin1′);通过改变其函数,来设置不一样的模板。
每个博客评论有时比博文更重要,做好评论确实要注意。
沙发!拜读!千年难遇!
非常好的教程
首先感谢!另外,有个问题:“现在加入“QQ”字段。”这个步骤,确实将这个字段加进来了,但我反复查找了一番,这个字段仅仅是显示出来了,并没有在前台或者后台显示出来。如果我想实现一个电话字段,仅仅供管理员在后台查看,该怎么hook呢?谢谢。
下面的代码能把后台评论的邮件地址改为777,我反复试了很多次,但苦于找不到资料。在google找到一个老伙计的写得,结果还是商业插件。
function remove_at($email) {
//$email = mb_substr(strip_tags($email), 0, mb_strlen($email) – 19);
//return ‘phone:’ . $email;
return ’777′;
}
// Email admin display
foreach ( array( ‘comment_author_email’, ‘user_email’, ‘comment_email’ ) as $filter ) {
//if ( is_admin() )
add_filter( $filter, ‘remove_at’ );
}
怎么利用这个在输入框前面加入评论表情呢?
需要引入哥表情插件,叫Custom Smilies。
我特别不解的是我的comments.php里只有一句[?php comment_form(array('title_reply' => '')); ?],评论框上面的姓名、电子邮件、网站这些个中文信息是在哪里定义的?寻遍了整个主题都没找到这些个中文字。。。希望明河可以解惑。
是在wp的wp-include内comment-template.php中
想入群,但是群满了,额滴天啊
…群不维护,加进去没什么用的。