Як переставити поля в 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');

Відповіді:


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.
фуксія

Не знаю, чи змінився код відтоді, але для 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>';
}

Зауважте, що багато плагінів проти спаму також змінюють текстові області. Це потрібно перевірити дуже добре - у мене були серйозні проблеми з подібним підходом.
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 =  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>',
      );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.