Настройка формы комментирования, созданной функцией comment_form

В WordPress 3+ появилась функция comment_form, которая автоматически формирует форму комментирования – три поля ввода данных комментатора и поле для ввода текста комментария. Разработчики тем активно взяли ее на вооружение. По-моему мнению, пользоваться этой функцией не очень удобно, особенно если нужно создать индивидуальную форму со своим дизайном. Самой частой проблемой, возникающей перед начинающим вебмастером, является редактирование полей ввода информации о комментаторе. Функция не содержит возможностей прямого редактирования этих полей без вмешательства в системные файлы, предлагая взамен этого использовать специальные аргументы.

Вместо того, чтобы создавать свою форму комментирования, разработчики WordPress предлагают просто вставить в шаблон функцию, имеющую вид


Как видите, у функции есть аргументы. их можно перечислять в виде массива. По умолчанию аргументы таковы:

$args = array(
	'fields' => apply_filters( 'comment_form_default_fields', $fields )
	,'comment_field' => '

' ,'must_log_in' => '' ,'logged_in_as' => '

' . sprintf( __( 'Logged in as %2$s. Log out?' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '

' ,'comment_notes_before' => '

' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '

' ,'comment_notes_after' => '

' . sprintf( __( 'You may use these HTML tags and attributes: %s' ), ' ' . allowed_tags() . '

' ) . '

'
,'id_form' => 'commentform'
,'id_submit' => 'submit'
,'title_reply' => __( 'Leave a Reply' )
,'title_reply_to' => __( 'Leave a Reply to %s' )
,'cancel_reply_link' => __( 'Cancel reply' )
,'label_submit' => __( 'Post Comment' )
);

Аргументами являются все поля формы комментирования. Чтобы использовать эти поля со своими значениями, нужно вставить в шаблон вызов функции с этими аргументами. Например, использовать в файле comments.php:

 apply_filters( 'comment_form_default_fields', $fields )
	,'comment_field' => '

' ,'must_log_in' => '
' ,'logged_in_as' => '

' . sprintf( __( 'Logged in as %2$s. Log out?' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '

' ,'comment_notes_before' => '

' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '

' ,'comment_notes_after' => '

' . sprintf( __( 'You may use these HTML tags and attributes: %s' ), ' ' . allowed_tags() . '

' ) . '

'
,'id_form' => 'commentform'
,'id_submit' => 'submit'
,'title_reply' => __( 'Leave a Reply' )
,'title_reply_to' => __( 'Leave a Reply to %s' )
,'cancel_reply_link' => __( 'Cancel reply' )
,'label_submit' => __( 'Post Comment' )
);
comment_form( $args );
?>

Если у вас тема, в которой используется функция comment_form, и в которой можно использовать файлы перевода на другой язык, то можете изменить в файле перевода соответствующие поля, например, найти "'Leave a Reply" и перевести его как "Оставьте ответ" - это можно сделать программой POedit. Если же вы хотите сделать прямой перевод темы, в том числе и формы комментирования, то просто отредактируйте аргументы функции, переведя английские заголовки на русские.

Можно настроить агрументы и с помощью специальных фильтров. Например, скрыть из формы комментирования, созданной функцией comment_form, поле ввода сайта, добавив в functions.php:

add_filter('comment_form_default_fields', 'remove_url_from_commentform');
function remove_url_from_commentform($arg) {
    $arg['url'] = '';
    return $arg;
}

С помощью фильтров можно добавить в форму комментирования дополнительные поля, изначально в ней не присутствующие, добавив в functions.php:

function additional_fields($fields) {
$fields['new'] = '

тут будет новое поле

'; return $fields; } add_filter('comment_form_default_fields',additional_fields');

В этом случае аргументы функции будет выглядеть так:

$defaults = array(
	'fields'               => apply_filters( 'comment_form_default_fields', $fields ),
	'comment_field'        => '

...', 'must_log_in' => '

...', 'comment_notes_before' => '

...', 'comment_notes_after' => '

...', 'id_form' => 'commentform', 'id_submit' => 'submit', 'title_reply' => __( 'Leave a Reply' ), 'title_reply_to' => __( 'Leave a Reply to %s' ), 'cancel_reply_link' => __( 'Cancel reply' ), 'label_submit' => __( 'Post Comment' ), );

Можно обойтись и без определения агрументов и создания фильтров (хотя с ними удобнее), напрямую указав в качестве параметров поля формы комментирования:

'

' )); ?>

Ну а как будут выглядеть поля формы комментирования, созданные с помощью функции comment_form, зависит от настроек CSS, указанных в файле style.css - все агрументы помечены разметкой HTML, для них можно задать любой внешний вид.

Автор tiaurus 2182 Articles
Являюсь создателем n-wp.ru — блога о WordPress для новичков. Мне интересно многое, поэтому еще я сделал 123-box.ru — блог о программах для Windows, и tiaurus.info — блог о красоте.

9 Комментарии

  1. Большое спасибо за старания и статью, но я вебмастер а не программист, и если честно я окончательно запутался…

    • Откройте comments.php, и вместо [cc lang=”php” inline=”yes”]< ?php comment_form( ); ?> вставьте:

      < ?php
      $args = array(
           'fields' => apply_filters( 'comment_form_default_fields', $fields )
           ,'comment_field' => '

      ' ,'must_log_in' => '' ,'logged_in_as' => '

      ' . sprintf( __( 'Logged in as %2$s. Log out?' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '

      ' ,'comment_notes_before' => '

      ' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '

      ' ,'comment_notes_after' => '

      ' . sprintf( __( 'You may use these HTML tags and attributes: %s' ), '

      ' . allowed_tags() . '

      ' ) . '

      '
      ,'id_form' => 'commentform'
      ,'id_submit' => 'submit'
      ,'title_reply' => __( 'Leave a Reply' )
      ,'title_reply_to' => __( 'Leave a Reply to %s' )
      ,'cancel_reply_link' => __( 'Cancel reply' )
      ,'label_submit' => __( 'Post Comment' )
      );
      comment_form( $args );
      ?>

  2. сделал так как вы написали, теперь отображается только форма ввода комментариев, поля для ввода имя и почты исчезли

  3. Подскажите пожалуйста! как мне поле ввода комментария сделать выше полей ввода имени и мейла

    • add_filter(‘comment_form_fields’, ‘kama_reorder_comment_fields’ );
      function kama_reorder_comment_fields( $fields ){
      // die(print_r( $fields )); // посмотрим какие поля есть

      $new_fields = array(); // сюда соберем поля в новом порядке

      $myorder = array(‘author’,’email’,’url’,’comment’); // нужный порядок

      foreach( $myorder as $key ){
      $new_fields[ $key ] = $fields[ $key ];
      unset( $fields[ $key ] );
      }

      // если остались еще какие-то поля добавим их в конец
      if( $fields )
      foreach( $fields as $key => $val )
      $new_fields[ $key ] = $val;

      return $new_fields;
      }

  4. В теме форма комментариев выводится через comment_form. По умолчанию поле “сайт” не обязательно для заполнения. Не подскажете как сделать его обязательным точно так, как “имя” и “e-mail”.

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*