Как изменить порядок полей в comment_form()

29 апр. 2012 г., 22:33:15
Просмотры: 30.3K
Голосов: 24

Я использую пользовательский фильтр для изменения полей, но не могу понять, как изменить порядок полей в форме комментариев.

Желаемый порядок:

  • поле комментария (первое/верхнее)
  • имя
  • email
  • веб-сайт

Вот код, который я сейчас использую:

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');
0
Все ответы на вопрос 5
4
15

Это довольно просто. Вам нужно всего лишь вынести текстовое поле 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 );
}
30 апр. 2012 г. 01:32:24
Комментарии

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

Brad Dalton Brad Dalton
27 июл. 2014 г. 07:13:51

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

fuxia fuxia
27 июл. 2014 г. 10:12:32

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

Mark Kaplun Mark Kaplun
26 сент. 2014 г. 17:53:43

@MarkKaplun В наше время я бы передавал желаемую позицию в качестве аргумента класса. :)

fuxia fuxia
26 сент. 2014 г. 17:59:25
0

Очевидно, существует несколько способов достичь этого. Например, чтобы переместить поле комментария вниз формы, вы можете использовать такой код:

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

Если вам нужно изменить порядок всех полей:

  1. Удалите все поля (unset)
  2. Добавьте поля обратно в массив, но в том порядке, в котором они должны отображаться

Просто, не так ли? Я решил подробно расписать это для следующего новичка, который найдет эту страницу и не найдет полезных ответов.

20 февр. 2016 г. 19:11:36
1

Мне понравился ответ 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>';  
}  
23 окт. 2012 г. 17:38:20
Комментарии

Обратите внимание, что многие антиспамные плагины также изменяют текстовое поле textarea. Это необходимо тщательно протестировать – у меня были серьезные проблемы с подобным подходом.

fuxia fuxia
23 окт. 2012 г. 18:29:52
1

Точный CSS для этого будет зависеть от вашей темы, но вот один из способов:

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

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

Методы отображения таблицы позволяют изменять порядок элементов произвольной высоты.

Подробнее: http://tanalin.com/en/articles/css-block-order/

30 апр. 2012 г. 02:40:37
Комментарии

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

Bryan Willis Bryan Willis
3 дек. 2015 г. 14:28:53
0

Поля формы комментариев находятся в массиве $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>',
      );
30 апр. 2012 г. 01:29:23