wordpress3.0之comment_form()实战(下)

发布于,归属于wordpress13个座位已被强势霸占! 共有1,191人围观    

上一篇教程《wordpress3.0之comment_form()实战(上)》主要讲解了wordpress3.0中comment_form()函数的基础用法,今天这篇教程,明河将讲述comment_form()的高级技巧。

过滤评论表单的字段

举个例子,默认的评论表单包含名称、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 class="comment-form-qq">' . '<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.     $fieldsarray(
  3.         'author' => '<p class="comment-form-field comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
  4.                     '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="13"' . $aria_req . ' /></p>',
  5.         'email'  => '<p class="comment-form-field comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
  6.                     '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="13"' . $aria_req . ' /></p>',
  7.         'url'    => '<p class="comment-form-field comment-form-url"><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!完毕!

作者结语

wordpress的强大和优良的扩展性的确让人叹为观止,有太多的使用技巧等待挖掘,欢迎各路朋友与明河一起探讨,谢谢!

(如果您喜欢这篇教程,可以通过支付宝打赏我们1元哦,拜谢!)

跟作者说两句

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-? :) :( :!: 8-O 8)

13个座位已被强势霸占!

  1. guny

    首先,承认comment_form()的强大及易用性,但个人觉得还是差了那么一点点。

    comment_form()里如果再给一个变量传递就好了,比如$skin。

    这样的话view和控制器完全分离了。
    用户制作的皮肤(HTML,css)文件夹来管理,那样的话直接调用comment_form(,,,,皮肤名称)就一步实现啦。

    明河共影回复于 2010年09月01日 2:19

    呵呵,没有直接的方法,却有变通的法子。比如$skin,设置为函数,function skin1(){} function skin2(){} ,然后设置add_filter(‘comment_form_default_fields’,'skin1′);通过改变其函数,来设置不一样的模板。

  2. CH5iRe

    每个博客评论有时比博文更重要,做好评论确实要注意。

  3. 岁月无痕副作用

    沙发!拜读!千年难遇!

  4. iceorr

    非常好的教程

  5. 大刘

    首先感谢!另外,有个问题:“现在加入“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’ );
    }

  6. 微魔部落

    怎么利用这个在输入框前面加入评论表情呢? :?:

    明河回复于 2011年07月29日 3:55

    需要引入哥表情插件,叫Custom Smilies。

  7. peak

    :-| 受用了。正需要学习这个呢!

  8. 沫夏

    我特别不解的是我的comments.php里只有一句[?php comment_form(array('title_reply' => '')); ?],评论框上面的姓名、电子邮件、网站这些个中文信息是在哪里定义的?寻遍了整个主题都没找到这些个中文字。。。希望明河可以解惑。

    明河回复于 2011年11月07日 9:33

    是在wp的wp-include内comment-template.php中

  9. icebone

    想入群,但是群满了,额滴天啊

    明河回复于 2011年12月29日 4:52

    …群不维护,加进去没什么用的。