Как переставить поля в 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');
jrutter
источник

Ответы:

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 полей?
Брэд Далтон
1
@BradDalton То же самое: сначала удалите все содержимое поля, затем напечатайте их в нужном порядке в comment_form_top.
fuxia
Не знаю, изменился ли код с тех пор, но для 4.0 это кажется comment_form_before_fieldsлучше, чем ловушкаcomment_form_top
Марк Каплун
@MarkKaplun В настоящее время я передаю желаемую позицию в качестве аргумента классу. :)
fuxia
4

Мне понравился тошо ответ. Однако я хотел использовать пользовательскую текстовую область, поэтому она не работала в этом случае. Я использовал те же хуки, но с отдельными функциями:

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>';
}
mantish
источник
Обратите внимание, что многие плагины для защиты от спама тоже изменяют текстовую область. Это должно быть проверено очень хорошо - у меня были серьезные проблемы с подобным подходом.
fuxia
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/en/articles/css-block-order/

эфирное масло
источник
1
Отличная идея Отто. Аналогичный подход может быть достигнуто с помощью Flexbox: <br> #commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }.
Брайан Уиллис
1

поля формы комментария находятся в массиве $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>',
      );
bueltge
источник