WordPress函数:comment_form( )个性化评论表单多种方法

本文中,使用twentysixteen 这个官方主题作为演示我们首先看看默认的评论表单:

评论表单

一、调用comment_form()函数

我们在文章页单篇文章single.php或页面page.php通过 comments_template() 函数加载我们的加载评论模板,那么comment_form()在什么地方调用呢?如何调用呢?当然是默认的comments.php评论模板文件,或者你自定义的评论模板文件,建议你阅读 WordPress函数:comments_template(加载评论模板)
comment_form()通过模板输出完整的评论窗体。它有二个参数,形式如下:

  1. <?php comment_form($args, $post_id) ?>

$args:comment_form()的输出配置参数,为一个关联数组,配置项非常丰富,将再下一步说明。
$post_id:文章id,默认为空,即当前id 。

二、$args数组默认参数详解

我们来看下官方默认代码

  1. $args = array(
  2.   'id_form'           => 'commentform',
  3.   'class_form'        => 'comment-form',
  4.   'id_submit'         => 'submit',
  5.   'class_submit'      => 'submit',
  6.   'name_submit'       => 'submit',
  7.   'title_reply'       => __( 'Leave a Reply' ),
  8.   'title_reply_to'    => __( 'Leave a Reply to %s' ),
  9.   'cancel_reply_link' => __( 'Cancel Reply' ),
  10.   'label_submit'      => __( 'Post Comment' ),
  11.   'format'            => 'xhtml',
  12.  
  13.   'comment_field' =>  '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) .
  14.     '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true">' .
  15.     '</textarea></p>',
  16.  
  17.   'must_log_in' => '<p class="must-log-in">' .
  18.     sprintf(
  19.       __( 'You must be <a href="%s">logged in</a> to post a comment.' ),
  20.       wp_login_url( apply_filters( 'the_permalink', get_permalink() ) )
  21.     ) . '</p>',
  22.  
  23.   'logged_in_as' => '<p class="logged-in-as">' .
  24.     sprintf(
  25.     __( 'Logged in as <a href="%1$s">%2$s</a>. <a href="%3$s" title="Log out of this account">Log out?</a>' ),
  26.       admin_url( 'profile.php' ),
  27.       $user_identity,
  28.       wp_logout_url( apply_filters( 'the_permalink', get_permalink( ) ) )
  29.     ) . '</p>',
  30.  
  31.   'comment_notes_before' => '<p class="comment-notes">' .
  32.     __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) .
  33.     '</p>',
  34.  
  35.   'comment_notes_after' => '<p class="form-allowed-tags">' .
  36.     sprintf(
  37.       __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ),
  38.       ' <code>' . allowed_tags() . '</code>'
  39.     ) . '</p>',
  40.  
  41.   'fields' => apply_filters( 'comment_form_default_fields', $fields ),
  42. );

常用参数:
fields(array) (可选) 除了评论输入框之外的输入框, 比如 author, email, url.
默认值: apply_filters( ‘comment_form_default_fields’, $fields )
comment_field(string) (可选) 评论框的textarea 和 label.默认值:无
must_log_in(string) (optional)默认值:无
logged_in_as(string) (可选) 默认值:无
comment_notes_before(string) (可选) 评论框前的html标签,默认值:无
comment_notes_after(string) (可选) 评论框后面的html 标签,默认值:无
id_form(string) (可选) 输入form的id属性,默认值: ‘commentform’
id_submit(string) (可选) submit按钮的id属性值.默认值: ‘submit’
title_reply(string) (可选) 评论form的标题.默认值: __( ‘Leave a Reply’ )
title_reply_to(string) (可选) 默认值: __( ‘Leave a Reply to %s’ )
cancel_reply_link(string) (可选 取消回复的链接文字.默认值: __( ‘Cancel reply’ )
label_submit(string) (可选)提交按钮的名字.默认值: __( ‘Post Comment’ )
$fields :缺省的输入项。注意这个和前面的第一个fields数组的区别,看下面的注释

三、$fields数组默认参数详解

  1. $fields =  array(
  2.  // 作者名称字段
  3.   'author' =>
  4.     '<p class="comment-form-author"><label for="author">' . __( 'Name', 'domainreference' ) . '</label> ' .
  5.     ( $req ? '<span class="required">*</span>' : '' ) .
  6.     '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) .
  7.     '" size="30"' . $aria_req . ' /></p>',
  8.   // 电子邮件字段   
  9.   'email' =>
  10.     '<p class="comment-form-email"><label for="email">' . __( 'Email', 'domainreference' ) . '</label> ' .
  11.     ( $req ? '<span class="required">*</span>' : '' ) .
  12.     '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) .
  13.     '" size="30"' . $aria_req . ' /></p>',
  14.  // 网站地址字段 
  15.   'url' =>
  16.     '<p class="comment-form-url"><label for="url">' . __( 'Website', 'domainreference' ) . '</label>' .
  17.     '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) .
  18.     '" size="30" /></p>',
  19. );

四、个性化之删除字段方法之一

如果我们想去掉「网址」文本框,我们把上面 ‘url’ 的键删掉即可.
我们使用下面语句来替换 twentysixteen 主题中 comments.php 调用表单的函数 comment_form :

  1. $commenter = wp_get_current_commenter();
  2. $req = get_option( 'require_name_email' );
  3. $aria_req = ( $req ? " aria-required='true'" : '' );
  4. $fields =  array(
  5.     'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
  6.         '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
  7.     'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
  8.         '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
  9. );
  10.  
  11. $comments_args = array(
  12.     'fields' =>  $fields
  13. );
  14.  
  15. comment_form($comments_args);

先使用 wp_get_current_commenter 函数来获取当前的评论者的一些信息,方便下面调用。然后生成了一个 fields 变量,内容是一个包含 author、email 两个键的数组,对应的键值就是评论表单的 HTML 结构,效果如图:

评论表单

五、个性化之删除字段方法之二

在主题的functions.php文件中添加如下代码即可:

  1. /**
  2.  *删除url评论字段
  3.  *
  4.  */
  5. add_filter('comment_form_default_fields', 'unset_url_field');
  6. function unset_url_field($fields){
  7. 	if(isset($fields['url']))
  8. 	unset($fields['url']);
  9. 	return $fields;
  10. }

备注:这个方法使用的前提是你使用了wordpress默认的评论表单,如果是主题使用了自己开发的wordpress评论表单,你只需要去掉主题评论表单的站点字段即可。
注意:由于 email,author 文本框是必填的,当你删除了在提交评论时,是会出错滴。

五、改变评论表单标题和发表按钮文字

  1. $commenter = wp_get_current_commenter();
  2. $req = get_option( 'require_name_email' );
  3. $aria_req = ( $req ? " aria-required='true'" : '' );
  4. $fields =  array(
  5.     'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
  6.         '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
  7.     'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
  8.         '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
  9. );
  10.  
  11. $comments_args = array(
  12.     'fields' =>  $fields,
  13.     'title_reply'=>'评论',
  14.     'label_submit' => '发表评论!'
  15. );
  16.  
  17. comment_form($comments_args);

六、个性化之增加自定义字段

建议你阅读 WordPress函数:comment_form() 让你的 WordPress 评论表单随心所愿
想要用户在发表评论的时候填写更多的表单信息,比如地址,电话,微信等等,我们仍然使用 fields 这个参数来传递。如果想要增加一个新的文本框让评论者填写自己所在的地区,我们使用下面这段代码:

  1. $commenter = wp_get_current_commenter();
  2. $req = get_option( 'require_name_email' );
  3. $aria_req = ( $req ? " aria-required='true'" : '' );
  4. $fields =  array(
  5.     'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
  6.         '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
  7.     'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
  8.         '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
  9.     'position' => '<p class="comment-form-position"><label for="position">' . __( '地区' ) . '</label>' .
  10.         '<input id="position" name="position" type="text" size="30" /></p>'
  11. );
  12.  
  13. $comments_args = array(
  14.     'fields' =>  $fields,
  15.     'title_reply'=>'评论一下',
  16.     'label_submit' => '提交评论'
  17. );
  18.  
  19. comment_form($comments_args);

虽然我们可以在这个文本框中填写信息,但是你点击发送之后,不会有任何变化,因为还没有具体的功能代码接受你这个新建表单的内容。实现这个功能需要用到 comment_post 这个 hook 钩子。先给出具体代码:

  1. function add_comment_meta_values($comment_id) {
  2.  
  3.     if(isset($_POST['position'])) {
  4.         $position = wp_filter_nohtml_kses($_POST['position']);
  5.         add_comment_meta($comment_id, 'position', $position, false);
  6.     }
  7.  
  8. }
  9. add_action ('comment_post', 'add_comment_meta_values', 1);

将上面代码复制到 functions.php 文件中即可。上面代码大体功能就是:在评论内容被提交的时候会触发 comment_post 这个 hook ,使用 add_action 函数为 comment_post 这个 hook 绑定一个函数,函数的内容就是接收表单中 position 这个文本框的内容,然后过滤掉 html 标籤,再使用 add_comment_meta 这个函数将内容插入到数据库中。具体插入到 wp_commentmeta 这个表中,你提交了信息之后,会在这个表中发现对应内容。
仅仅存到了数据库中当然不行了,我们还要取出来在评论内容中显示。使用下面代码可以调用出来对应的内容:

  1. <?php echo "TA 现在在: ".get_comment_meta( $comment->comment_ID, 'position', true ); ?>

我们可以通过wp_list_comments()函数调用自定义的评论显示列表里添加以上代码,把我们自定义添加的字段信息打印出来。建议你阅读:wp_list_comments()使用回调函数自定义评论展示方式

六、 comment_form 函数总结说明

1、comment_form 是可以传递一些参数,我们可以通过编写对应的参数实现表单自定义。你可以打开官方文档看一下:http://codex.wordpress.org/Function_Reference/comment_form
2、要使用在自定义回调函数中的上述代码中的变量,必须首先将这些变量设置在回调函数中:

  1. $commenter = wp_get_current_commenter();
  2. $req = get_option( 'require_name_email' );
  3. $aria_req = ( $req ? " aria-required='true'" : '' );

否则wordpress会报错!


发布日期:

所属分类: Wordpress, WordPress 函数 标签: