如何重新排列comment_form()中的字段


22

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

所需订单:

  • 评论栏(第一/顶部)
  • 名称
  • 电子邮件
  • 网站

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

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');

Answers:


14

那很简单。您只需要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个字段的顺序怎么办?
布拉德·道尔顿2014年

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

不知道是不是因为那么代码已经改变,但对于4.0好像comment_form_before_fields是很好的钩,然后comment_form_top
马克·卡普伦

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

4

我喜欢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>';
}

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

4

显然,有许多方法可以完成此任务。例如,要将注释字段移到表单底部,您将使用如下代码:

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;
}

如果要重新排列所有字段,请取消设置所有字段。按照您希望它们显示的顺序将它们放回阵列中。简单吧?

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


2

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

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

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

表格显示方法使您可以重新排列任意高度的对象。

更多信息:http : //tanalin.com/cn/articles/css-block-order/


1
好主意奥托。一个类似的方法点击:可以用Flexbox的完成#commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }
布赖恩·威利斯

1

注释形式的字段$fields在函数数组中comment_form()。您可以将过滤器内钩comment_form_default_fields重新排列数组。

您也可以在filter内挂钩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>',
      );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.