目录
[隐藏]

comment_form()是wordpress3.0出现的新的实用方法,作用是快速生成评论表单。comment_form大大简化了评论表单构建过程,从此以后你无须书写一堆html代码产生评论表格,只要一行:

  1. <?php comment_form(); ?>

就搞定问题了!

但是也正是因为这样,就出现问题了。很多修改样式啊什么的就麻烦了,有些东西得找到comment-template.php这个文件修改才行哦。。。比如你想在评论框里加些什么东西的,就得自己找位置加了。

comment_form()未出现前

你可以打开你主题的comments.php ,你会看到类似如下的表单代码:

  1. <?php if ( comments_open() ) : ?>
  2. <div id="respond">
  3. <div>
  4. <div><span></span>有话要说?请在此留下阁下高见</div>
  5. </div>
  6. <div id="cancel-comment-reply">
  7. <small><?php cancel_comment_reply_link() ?></small>
  8. </div>
  9. <?php if ( get_option('comment_registration') && !is_user_logged_in() ) : ?>
  10. <p><?php printf(__('请先<a href="%s">登录</a>,然后再发表评论', 'kubrick'), wp_login_url( get_permalink() )); ?></p>
  11. <?php else : ?>
  12. <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">
  13. <table width="100%" border="0" cellspacing="0" cellpadding="0">
  14. <?php if ( is_user_logged_in() ) : ?>
  15. <p><?php printf(__('你的用户名是<a href="%1$s">%2$s</a>', 'kubrick'), get_option('siteurl') . '/wp-admin/profile.php', $user_identity); ?> ,<a href="<?php echo wp_logout_url(get_permalink()); ?>" title="<?php _e('Log out of this account', 'kubrick'); ?>"><?php _e('注销;', 'kubrick'); ?></a></p>
  16. <?php else : ?>
  17. <tr>
  18. <td><label for="author"><?php _e('用户名', 'kubrick'); ?> <?php if ($req) _e("(必须)", "kubrick"); ?></label></td>
  19. <td><label for="email"><?php _e('邮箱 (不会公开', 'kubrick'); ?> <?php if ($req) _e(",必须)", "kubrick"); ?></label></td>
  20. <td><label for="url"><?php _e('站点URL', 'kubrick'); ?></label></td>
  21. </tr>
  22. <tr>
  23. <td><input type="text" name="author" id="author" value="<?php echo esc_attr($comment_author); ?>" size="25" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> /></td>
  24. <td><input type="text" name="email" id="email" value="<?php echo esc_attr($comment_author_email); ?>" size="25" tabindex="2" <?php if ($req) echo "aria-required='true'"; ?> /></td>
  25. <td><input type="text" name="url" id="url" value="<?php echo  esc_attr($comment_author_url); ?>" size="25" tabindex="3" />
  26. </td>
  27. </tr>
  28. <?php endif; ?>
  29. <tr>
  30. <td colspan="3">你的评论</td>
  31. </tr>
  32. <tr>
  33. <td colspan="3"><textarea name="comment" id="comment" cols="58" rows="10" tabindex="4" class="comment-input" ></textarea></td>
  34. </tr>
  35. <tr>
  36. <td><input name="submit" type="submit" id="submit" tabindex="5" value="<?php _e('提交评论', 'kubrick'); ?>" /><?php comment_id_fields(); ?></td>
  37. <td>&nbsp;</td>
  38. <td></td>
  39. </tr>
  40. </table>
  41. <?php do_action('comment_form', $post->ID); ?>
  42. </form>
  43. <?php endif; // If registration required and not logged in ?>

以上代码来自明河自制的RIA之家主题,大部分的评论的表单都与之类似,是不是觉得有些头晕?

comment_form()出现之后

  1. <?php comment_form(); ?>

一行搞定!这里明河说明下,wordpress3.0的默认模板依旧采用旧的表单生成形式,而wordpress3.0新加入的twentyten已经使用comment_form()来生成评论表单了。
实际上还需要做一些处理,比如评论中按钮和lable是英文,设置中文,还需要comment_form的参数帮忙

comment_form()参数说明

comment_form()有二个参数

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

comment_form()的$args参数详解

$args的默认配置项如下:

  1. $defaults = array(
  2. 'fields'               => apply_filters( 'comment_form_default_fields', $fields ),
  3. 'comment_field'        => '<p><label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
  4. 'must_log_in'          => '<p>' .  sprintf( __( 'You must be <a href="%s">logged in</a> to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
  5. 'logged_in_as'         => '<p>' . sprintf( __( 'Logged in as <a href="%1$s">%2$s</a>. <a href="%3$s" title="Log out of this account">Log out?</a>' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
  6. 'comment_notes_before' => '<p>' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '</p>',
  7. 'comment_notes_after'  => '<p>' . sprintf( __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ), ' <code>' . allowed_tags() . '</code>' ) . '</p>',
  8. 'id_form'              => 'commentform',
  9. 'id_submit'            => 'submit',
  10. 'title_reply'          => __( 'Leave a Reply' ),
  11. 'title_reply_to'       => __( 'Leave a Reply to %s' ),
  12. 'cancel_reply_link'    => __( 'Cancel reply' ),
  13. 'label_submit'         => __( 'Post Comment' ),
  14. );

配置项很多,以评论表单中的英文改中文为例:

  1. $comment_form_args = array('must_log_in'          => '<p>' .  sprintf( __( '你必须先 <a href="%s">登录</a>才能发表评论。' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
  2. 'logged_in_as'         => '<p>' . sprintf( __( '<a href="%1$s">%2$s</a>已经登录,要 <a href="%3$s" title="注销用户">注销</a>此用户吗?' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
  3. 'comment_notes_before' => '<p>' . __( '你的email不会被公开。' ) . ( $req ? $required_text : '' ) . '</p>',
  4. 'comment_notes_after'  => '<p>' . sprintf( __( '你只能使用以下 <abbr title="HyperText Markup Language">HTML</abbr> 标签和属性: %s' ), ' <code>' . allowed_tags() . '</code>' ) . '</p>',
  5. 'title_reply'          => __( '留下一个回复' ),
  6. 'title_reply_to'       => __( '给%s的回复' ),
  7. 'cancel_reply_link'    => __( '取消回复' ),
  8. 'label_submit'         => __( '提交评论' ));
  9. comment_form($comment_form_args);


可以看到表单已经全部汉化了。但是这样只适用于一个主题,如果我希望所有的主题(有应用该函数)都是汉化的,如何处理呢。请看下一步解说

修改comment_form()的$args默认参数

1、请打开“wp-includes”,再打开“comment-template.php”。
2、找到comment_form函数。
3、找到“$defaults”变量,将其覆盖成:

  1. $defaults = array(
  2. 'fields'               => apply_filters( 'comment_form_default_fields', $fields ),
  3. 'comment_field'        => '<p><label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
  4. 'must_log_in'          => '<p>' .  sprintf( __( '你必须先 <a href="%s">登录</a>才能发表评论。' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
  5. 'logged_in_as'         => '<p>' . sprintf( __( '<a href="%1$s">%2$s</a>已经登录,要 <a href="%3$s" title="注销用户">注销</a>此用户吗?' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
  6. 'comment_notes_before' => '<p>' . __( '你的email不会被公开。' ) . ( $req ? $required_text : '' ) . '</p>',
  7. 'comment_notes_after'  => '<p>' . sprintf( __( '你只能使用以下 <abbr title="HyperText Markup Language">HTML</abbr> 标签和属性: %s' ), ' <code>' . allowed_tags() . '</code>' ) . '</p>',
  8. 'id_form'              => 'commentform',
  9. 'id_submit'            => 'submit',
  10. 'title_reply'          => __( '留下一个回复' ),
  11. 'title_reply_to'       => __( '给%s的回复' ),
  12. 'cancel_reply_link'    => __( '取消回复' ),
  13. 'label_submit'         => __( '提交评论' ),
  14. );

还有一个地方要修改的,查找“$required_text”,修改此变量如下:

  1. $required_text = sprintf( ' ' . __('带%s号为必填选项'), '<span>*</span>' );

保存,完毕!

过滤评论表单的字段

举个例子,默认的评论表单包含名称、email、url、评论内容,现在明河觉得url是多余的,想把url这个字段去掉,如何控制呢?
1、请打开你当前主题的Functions.php页面
2、加入如下代码:

  1. add_filter('comment_form_default_fields', 'mytheme_remove_url');
  2. function mytheme_remove_url($arg) {
  3. $arg['url'] = '';
  4. return $arg;
  5. }

保存后刷新页面,你就会看到“url”输入框已经不复存在。

添加新的表单字段

继续在Functions.php操作,现在加入“QQ”字段。
加入如下代码:

  1. function my_fields($fields) {
  2. $fields['qq'] = '<p>' . '<label for="qq">QQ</label> ' .
  3. '<input id="qq" name="qq" type="text" value="' . esc_attr( $commenter['comment_qq'] ) . '" size="30" /></p>';
  4. return $fields;
  5. }
  6. 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):

  1. function comment_form_before_test(){
  2. echo "<p>明河的测试</p>";
  3. }
  4. add_action( 'comment_form_before', 'comment_form_before_test' );

comment_form()其他钩子的使用与之类似。

改变comment_form()的布局和样式

在上一篇教程中,guny曾问明河,“如何处理皮肤(skin or 表单布局)”,接下来演示如何自定义出任何想要的布局和样式。
一般主题的表单如下图:

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

来看代码(先把之前的测试代码去掉):

  1. function ria_fields($fields) {
  2. $fields =  array(
  3. 'author' => '<p>' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span>*</span>' : '' ) .
  4. '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="13"' . $aria_req . ' /></p>',
  5. 'email'  => '<p><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span>*</span>' : '' ) .
  6. '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="13"' . $aria_req . ' /></p>',
  7. 'url'    => '<p><label for="url">' . __( 'Website' ) . '</label>' .
  8. '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="13" /></p>',
  9. );
  10. return $fields;
  11. }
  12. add_filter('comment_form_default_fields','ria_fields');

我们主要是让author、email、url排成三列,需要将默认的字段使用自定义的结构覆盖掉,如上代码,给每个”p”加上个新的”comment-form-field”。
接下来就是在style.css对这个样式进行操作,代码如下:

  1. #commentform {
  2. display:block;
  3. height:1%;
  4. content:".";
  5. }
  6. #commentform .comment-form-field{
  7. width:33%;float:left;
  8. }
  9. #commentform .comment-form-field input{
  10. width:190px;
  11. }
  12. #commentform .comment-form-comment{
  13. float:left;width:100%;
  14. }
  15. #commentform .comment-form-comment textarea{
  16. width:614px;
  17. }

OK!完毕!

via : http://www.36ria.com/3007