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

Несколько примеров использования аргументов функции comment_form, с помощью которой можно вывести форму комментирования в WordPress 3+.

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

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

</pre>
<p>Как видите, у функции есть аргументы. их можно перечислять в виде массива. По умолчанию аргументы таковы:</p>
<pre>
$args = array(
	'fields' => apply_filters( 'comment_form_default_fields', $fields )
	,'comment_field' => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8"></textarea></p>'
	,'must_log_in' => '<p class="must-log-in">' .  sprintf( __( 'You must be logged in to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>'
	,'logged_in_as' => '<p class="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 ) ) ) ) . '</p>'
	,'comment_notes_before' => '<p class="comment-notes">' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '</p>'
	,'comment_notes_after' => '<p class="form-allowed-tags">' . sprintf( __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ), ' <code>' . 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' => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8"></textarea></p>'
	,'must_log_in' => '<p class="must-log-in">' .  sprintf( __( 'You must be logged in to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>'
	,'logged_in_as' => '<p class="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 ) ) ) ) . '</p>'
	,'comment_notes_before' => '<p class="comment-notes">' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '</p>'
	,'comment_notes_after' => '<p class="form-allowed-tags">' . sprintf( __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ), ' <code>' . 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'] = '<p>тут будет новое поле</p>';
return $fields;
}
add_filter('comment_form_default_fields',additional_fields');

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

$defaults = array(
	'fields'               => apply_filters( 'comment_form_default_fields', $fields ),
	'comment_field'        => '<p class="comment-form-comment">...',
	'must_log_in'          => '<p class="must-log-in">...',
	'logged_in_as'         => '<p class="logged-in-as">...',
	'comment_notes_before' => '<p class="comment-notes">...',
	'comment_notes_after'  => '<dl class="form-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' ),
);

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

'<p class="comment-form-comment"><label for="comment">Комментарий</label><textarea id="comment" name="comment" cols="45" rows="8"></textarea>' )); ?>

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

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. topol

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

    Ответить
    1. tiaurus автор

      Откройте comments.php, и вместо

      <?php comment_form( ); ?>

      вставьте:

      <?php
      $args = array(
           'fields' => apply_filters( 'comment_form_default_fields', $fields )
           ,'comment_field' => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>'
           ,'must_log_in' => '<p class="must-log-in">' .  sprintf( __( 'You must be logged in to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>'
           ,'logged_in_as' => '<p class="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 ) ) ) ) . '</p>'
           ,'comment_notes_before' => '<p class="comment-notes">' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '</p>'
           ,'comment_notes_after' => '<p class="form-allowed-tags">' . sprintf( __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ), ' <pre>' . 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. topol

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

    Ответить
  3. Diki

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

    Ответить
    1. tiaurus автор

      Какую тему вы используете?

      Ответить
    2. Seed

      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. Diki

    свою тему. интересует можно ли это сделать через comment_form?

    Ответить
    1. tiaurus автор

      Легче всего вместо вызова функции comment_form(); использовать HTML-форму:

      Leave a comment

      Ответить
  5. Makway

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

    Ответить