Как изменить порядок полей в comment_form()
Я использую пользовательский фильтр для изменения полей, но не могу понять, как изменить порядок полей в форме комментариев.
Желаемый порядок:
- поле комментария (первое/верхнее)
- имя
- веб-сайт
Вот код, который я сейчас использую:
function alter_comment_form_fields($fields){
$fields['comments'] = 'Тест';
$fields['author'] = '<p class="comment-form-author">' . '<label for="author">' . __( 'Ваше имя, пожалуйста' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
'<input id="author" name="author" type="text" placeholder="Иван Петров" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>';
$fields['email'] = 'далее'; // удаляет поле email
//$fields['url'] = ''; // удаляет поле веб-сайта
return $fields;
}
add_filter('comment_form_default_fields','alter_comment_form_fields');

Это довольно просто. Вам нужно всего лишь вынести текстовое поле textarea
из стандартных полей – с помощью фильтра 'comment_form_defaults'
– и вывести его через действие 'comment_form_top'
:
<?php # -*- coding: utf-8 -*-
/**
* Название плагина: T5 Текстовое поле комментария сверху
* Описание: Делает текстовое поле первым элементом формы комментария.
* Версия: 2012.04.30
* Лицензия: MIT
* Ссылка на лицензию: http://www.opensource.org/licenses/mit-license.php
*/
// Используем одну функцию для обеих задач.
add_filter( 'comment_form_defaults', 't5_move_textarea' );
add_action( 'comment_form_top', 't5_move_textarea' );
/**
* Извлекает HTML текстового поля из стандартных полей и выводит его сверху.
*
* @param array $input Стандартные поля, если вызвано как фильтр
* @return string|void
*/
function t5_move_textarea( $input = array () )
{
static $textarea = '';
if ( 'comment_form_defaults' === current_filter() )
{
// Копируем поле во внутреннюю переменную …
$textarea = $input['comment_field'];
// … и удаляем его из массива стандартных полей.
$input['comment_field'] = '';
return $input;
}
print apply_filters( 'comment_form_field_comment', $textarea );
}

Хорошее решение, но что если нужно изменить порядок 3 или 4 полей?

@BradDalton То же самое: сначала удалите содержимое всех полей, затем выведите их в нужном порядке через хук comment_form_top
.

Не знаю, изменился ли код с тех пор, но для версии 4.0, похоже, хук comment_form_before_fields
подходит лучше, чем comment_form_top

Очевидно, существует несколько способов достичь этого. Например, чтобы переместить поле комментария вниз формы, вы можете использовать такой код:
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;
}
Если вам нужно изменить порядок всех полей:
- Удалите все поля (unset)
- Добавьте поля обратно в массив, но в том порядке, в котором они должны отображаться
Просто, не так ли? Я решил подробно расписать это для следующего новичка, который найдет эту страницу и не найдет полезных ответов.

Мне понравился ответ 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="напишите ваш комментарий здесь..." aria-required="true"></textarea></p>';
}

Точный CSS для этого будет зависеть от вашей темы, но вот один из способов:
#commentform {
display:table;
width:100%;
}
.comment-form-comment {
display: table-header-group;
}
Методы отображения таблицы позволяют изменять порядок элементов произвольной высоты.

Отличная идея, Отто. Похожий подход можно реализовать с помощью flexbox: <br>#commentform { display: flex; flex-flow: column; }
.comment-form-comment { order: -1; }
.

Поля формы комментариев находятся в массиве $fields
функции comment_form()
. Вы можете подключиться к фильтру comment_form_default_fields
и изменить порядок элементов массива.
Также вы можете использовать фильтр comment_form_defaults
для изменения значений по умолчанию; оставьте все данные в массиве и измените только поле fields
с вашими пользовательскими полями; включая HTML-разметку.
Значение по умолчанию для $fields:
$fields = array(
'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Имя' ) . '</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">' . __( 'Сайт' ) . '</label>' .
'<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
);
