我正在使用自定义过滤器来更改字段,但无法弄清楚如何在注释表单中更改字段的顺序。

所需顺序:


注释字段(第一个/顶部)
名称
电子邮件
网站

这是我当前正在使用的代码:

function alter_comment_form_fields($fields){
    $fields['comments'] = 'Test';
    $fields['author'] = '<p class="comment-form-author">' . '<label for="author">' . __( 'Your name, please' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                    '<input id="author" name="author" type="text" placeholder="John Smith" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>';
    $fields['email'] = 'next';  //removes email field
    //$fields['url'] = '';  //removes website field

    return $fields;
}

add_filter('comment_form_default_fields','alter_comment_form_fields');


#1 楼

那很简单。您只需要从默认字段中取出textarea –过滤器'comment_form_defaults' –并在操作'comment_form_top'上进行打印:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: T5 Comment Textarea On Top
 * Description: Makes the textarea the first field of the comment form.
 * Version:     2012.04.30
 * License:     MIT
 * License URI: http://www.opensource.org/licenses/mit-license.php
 */

// We use just one function for both jobs.
add_filter( 'comment_form_defaults', 't5_move_textarea' );
add_action( 'comment_form_top', 't5_move_textarea' );

/**
 * Take the textarea code out of the default fields and print it on top.
 *
 * @param  array $input Default fields if called as filter
 * @return string|void
 */
function t5_move_textarea( $input = array () )
{
    static $textarea = '';

    if ( 'comment_form_defaults' === current_filter() )
    {
        // Copy the field to our internal variable …
        $textarea = $input['comment_field'];
        // … and remove it from the defaults array.
        $input['comment_field'] = '';
        return $input;
    }

    print apply_filters( 'comment_form_field_comment', $textarea );
}


评论


好的解决方案,但是如果您想更改3或4个字段的顺序怎么办?

–布拉德·道尔顿(Brad Dalton)
2014年7月27日在4:13

@BradDalton相同:首先删除所有字段内容,然后按所需顺序在comment_form_top中打印它们。

– fuxia♦
2014年7月27日在7:12

不知道自那时以来代码是否发生了变化,但对于4.0而言,似乎comment_form_before_fields比钩住comment_form_top更好。

–马克·卡普伦
2014-09-26 14:53

@MarkKaplun现在,我将所需的位置作为参数传递给类。 :)

– fuxia♦
2014-09-26 14:59

#2 楼

显然,有许多方法可以实现这一目标。例如,要将注释字段移到表单的底部,您将使用如下代码:
add_filter( 'comment_form_fields', 'move_comment_field' );
function move_comment_field( $fields ) {
    $comment_field = $fields['comment'];
    unset( $fields['comment'] );
    $fields['comment'] = $comment_field;
    return $fields;
}

如果要重新排列所有字段:

取消所有字段
将字段放回数组中,但是要按照您希望它们显示的顺序


简单吧?我想我会为下一个像我这样的下一个noobie明确地拼写出来,以找到此页面而不找到有用的答案。

#3 楼

我喜欢toscho的答案。
但是我想使用自定义文本区域,因此在那种情况下不起作用。
我使用了相同的钩子,但是具有单独的功能:

add_filter( 'comment_form_defaults', 'remove_textarea' );
add_action( 'comment_form_top', 'add_textarea' );

function remove_textarea($defaults)
{
    $defaults['comment_field'] = '';
    return $defaults;
}

function add_textarea()
{
    echo '<p class="comment-form-comment"><textarea id="comment" name="comment" cols="60" rows="6" placeholder="write your comment here..." aria-required="true"></textarea></p>';
}


评论


请注意,许多反垃圾邮件插件也正在更改文本区域。必须对此进行很好的测试-我在使用类似方法时遇到了严重问题。

– fuxia♦
2012年10月23日15:29

#4 楼

确切的CSS取决于您的主题,但是,这是一种方法:

#commentform {
display:table;
width:100%;   
}

.comment-form-comment {
display: table-header-group; 
}


表显示方法可让您重新排列任意高度的东西。 >
更多信息:http://tanalin.com/zh-CN/articles/css-block-order/

评论


好主意奥托。使用flexbox可以实现类似的方法:
#commentform {display:flex; flex-flow:列; } .comment-form-comment {命令:-1; }。

–布莱恩·威利斯(Bryan Willis)
2015年12月3日,12:28



#5 楼

注释表单的字段位于函数$fields中的数组comment_form()中。您可以挂钩到过滤器comment_form_default_fields并重新排列数组。

还可以挂钩到过滤器comment_form_defaults并更改默认值;将所有数据保留在数组中,并使用您的自定义字段仅更改数组的field;包括html。

$ fields的默认值:

      $fields =  array(
          'author' => '<p class="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="30"' . $aria_req . ' /></p>',
          'email'  => '<p class="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="30"' . $aria_req . ' /></p>',
          'url'    => '<p class="comment-form-url"><label for="url">' . __( 'Website' ) . '</label>' .
                      '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
      );