totsamiyshigaev (totsamiyshigaev) wrote,
totsamiyshigaev
totsamiyshigaev

Category:

WordPress 3.0: форма комментирования

На основе статьи Отто «WordPress 3.0 Theme Tip: The Comment Form».

Было дело — поставил как-то на третий Вордпресс прикольную темку «min», выполненную в соответствии с моим любимым экстраминималом. Суперминималом. Минимал в себе прям. Да в таком, что автор решил — ну их на хуй, комментарии эти, минимал, так уж минимал. Вот реально: не было в теме комментирования. Пришлось вырубать их из стандартной «twentyeleven», поставляемой вместе с дистрибом, помогло. Заодно много узнал о новшествах третьей версии любимого CMS, в части упрощения работы с формами и деревом комментирования.

 

Что имеем в виду

Вот здоровый кусок кода, извлечённый мной из файла «comments.php» текущей темы. И цель у него одна — отобразить форму для написания комментария:

<?php if ('open' == $post->comment_status) : ?>
<div id="respond">
	<h3><?php comment_form_title( 'Leave a Reply', 'Leave a Reply to %s' ); ?></h3>
		<div class="cancel-comment-reply">
			<small><?php cancel_comment_reply_link(); ?></small>
		</div>

<?php if ( get_option('comment_registration') && !$user_ID ) : ?>
	<p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>">logged in</a> to post a comment.</p>

<?php else : ?>
<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

<?php if ( $user_ID ) : ?>
	<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo wp_logout_url(get_permalink()); ?>" title="Log out of this account">Log out &raquo;</a></p>

<?php else : ?>

	<p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
	<label for="author"><small>Name <?php if ($req) echo "(required)"; ?></small></label></p>
	<p><input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
	<label for="email"><small>Mail (will not be published) <?php if ($req) echo "(required)"; ?></small></label></p>
	<p><input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
	<label for="url"><small>Website</small></label></p>

<?php endif; ?>

<!--<p><small><strong>XHTML:</strong> You can use these tags: <code><?php echo allowed_tags(); ?></code></small></p>-->

<p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p>
	<p><input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment" />
<?php comment_id_fields(); ?>
	</p>
<?php do_action('comment_form', $post->ID); ?>
</form>

<?php endif; // If registration required and not logged in ?>
</div>
<?php endif; // if you delete this the sky will fall on your head ?>

Жуть, да? И это всё беспорядок в «if/else». Они обрабатывают кучу случаев: когда пользователя залогинен или нет, комментарии открыты или закрыты, нужна ли регистрация и так далее. Эта путаница приводит к трудностям при модификации и стилизации через CSS.

Поэтому я заменил весь код этой строкой:

<?php comment_form(); ?>

Посимпатичнее, да?

Функция «comment_form» является новшеством версии «3.0». Если в общем, то она стандартизирует формы комментариев. Что делает её привлекательной для разрабов плагинов. Теперь изменить форму комментирования легче благодаря захватам (hooks). Отто, например, уже изменил свои плагины «Simple Facebook Connect» и «Simple Twitter Connect». И если вы используете их в своей теме, то вам менять ничего не понадобится.

 

Настройка

Все блогеры любят настраивать. И «comments form» этому не препятствует. Однако можно немного запутаться.

Внутри функции «comments_form» находятся кое-какие полезные нам захваты-крючки (те самые hooks). Они-то и позволят поднастроить систему комментирования.

 

Первый захват — «comment_form_default_fields». Он позволяет изменять параметры трёх основных полей: «author», «email» и «website». Это фильтр и поэтому мы можем влиять на то, что через него пройдёт. Поля сохраняются в массив, который содержит html. Это на выходе. Выглядит так:

array(
	'author' => '<p class="comment-form-author">...',
	'email'  => '<p class="comment-form-email">...',
	'url'    => '<p class="comment-form-url">...'
);

Для простоты я сократил код. Он нам говорит о том, что можно изменить поля:

function my_fields($fields) {
$fields['new'] = '<p>Some new input field here</p>';
return $fields;
}
add_filter('comment_form_default_fields','my_fields');

Это позволяет нам добавить новое поле ввода, измененить уже существующие и так далее.

Но поля — не единственное из пригодного для модификаций. Так же, существует и фильтр «comment_form_defaults». Он получает массу того, что можно назвать окружением формы комментариев. Значения по умолчанию выглядят следующим образом:

$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' ),
);

Здесь разные куски html, из которых состоит форма комментирования. Их значения можно менять по вкусу.

Но фильтры — это не единственный способ изменения. Функция «comment_form» может взять массив параметров в качестве первого параметра и они изменят форму. Так, если нам хочется баловства типа смены фразы «Leave a Reply», то можно сделать так:

<?php comment_form(array('title_reply'=>'Leave a Reply, Stupid')); ?>

Мы рассмотрели простой способ изменений без фильтров. Но есть и сложные операции, где фильтры станут очень полезными.

 

Расширение функционала

В процессе создания формы для комментариев вызывается тонна захватов, на каждой его стадии. И если есть желание вставить что-нибудь в форму непосредственно, то вот список этих захватов. Назначение большинства очевидно по названиям:

  • comment_form_before
  • comment_form_must_log_in_after
  • comment_form_top
  • comment_form_logged_in_after
  • comment_notes_before
  • comment_form_before_fields
  • comment_form_field_{$name} (фильтр в каждом поле, где {$name} — ключевое имя поля в массиве)
  • comment_form_after_fields
  • comment_form_field_comment (фильтр в настройках по умолчанию «comment_field», который содержит поле «textarea» для комментария)
  • comment_form (захват действия после «textarea», главным образом для обратной совместимости)
  • comment_form_after
  • comment_form_comments_closed

CSS и прочие возможности

Не забудем про стиль. У каждой части формы комментариев есть классы и идентификаторы. Взгляните на результирующий код HTML: там можно найти их все. Кроме того, не забыта и семантика, проставлены тэги «label», тэги для совместимости со стандартами ARIA и так далее. К тому же, текст доступен для перевода системой «core translation».

Так что у авторов тем есть масса причин начать пользоваться этим вместо громоздких форм. Ваши пользователи и авторы плагинов будут вам благодарны. И в самом деле — пришло время сделать WordPress заботящимся более о дизайне, нежели о своей конструкции.

Tags: wordpress, интерфейс, код
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments