Очередной блог фрилансера

коротко и полезно о веб-разработке

Menu Close

WordPress. Система комментариев версии 2.7

Какую бы тему вы не использовали в своем блоге, вряд ли вы каждый раз принимаетесь обновлять ее до текущей версии WordPress. Обновления WordPress, появляются постоянно, и если используемая тема продолжает нормально работать, нам, скорее всего, и в голову не придет что-то в ней изменить. А между тем, было бы не плохо знать, какие возможности становятся нам доступны, с новыми версиями движка.

И одной из таких возможностей, является новая, усовершенствованная система комментариев, которая доступна нам уже в версии 2.7. Поэтому, если вы используете тему, созданную для более ранних версий, читайте далее, как обновить ее систему комментариев до версии 2.7.

Вступление

Начиная с версии 2.7, WordPress имеет встроенную поддержку и древовидных комментариев и постраничную разбивку. Хотя для работы с WordPress 2.7, вашей теме не требовались никакие изменения, для того чтобы воспользоваться новыми возможностями комментариев, вам придется обновить свой шаблон. Далее в статье, вы узнаете, как это можно сделать.

comment

Изменение кода в файле comments.php

Прежде всего, следует убедиться, что ваша тема включает файл comments.php.

Определение версии WordPress 2.7

Если вы хотите обеспечивать своей теме обратную совместимость с предыдущими версиями, то это сделать довольно просто. Нужно всего лишь изменить вызов функции wp_list_comments(), следующим образом:

if ( function_exists('wp_list_comments') ) :
// new comments.php stuff
else :
// old comments.php stuff
endif;

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

Одним из многих, интересных способов использования, это наличие отдельного php-файла, со «старыми» комментариями, который, в дальнейшем будет включен. Это обеспечит обратную совместимость вашей темы, наиболее простым способом. Далее простой пример кода, для этого подхода:

<?php
add_filter( 'comments_template', 'legacy_comments' );
function legacy_comments( $file ) {
	if ( !function_exists('wp_list_comments') )
		$file = TEMPLATEPATH . '/legacy.comments.php';
	return $file;
}
?>

После добавления этого кода в functions.php, ваша тема сможет использовать файл шаблона «legacy.comments.php», для более старых версий WordPress (ниже 2.7). Таким образом, вы можете просто переименовать ваш старый файл comments.php в legacy.comments.php, а в comments.php добавить новую функциональность.

Проверка защиты паролем

Расположите этот код в верхней части файла comments.php. Это позволит реализовать функциональность записей, защищенных паролем.

Обратите внимание, что этот код очень похож на предыдущий способ (непосредственной проверкой cookie), но теперь у WordPress есть специальная функция для этого. Вам следует использовать эту функцию, для будущих функциональных изменений, ваш код будет обратно совместим:

if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME']))
	die ('Please do not load this page directly. Thanks!');
if ( post_password_required() ) {
	echo '<p class="nocomments">This post is password protected. Enter the password to view comments.</p>';
	return;
}

Цикл комментариев

Цикл, ранее использовавшийся для вывода комментариев, выглядит вот так (значительно упрощен в сравнении с настоящим – до версии 2.7):

if ($comments) :
<?php $comment_count = get_comment_count($post->ID); echo $comment_count['approved']; ?> Comments
<ul class="commentlist">
<?php foreach( $comments as $comment ) :
// stuff to display the comment in an LI here
endforeach;
?></ul>
<?php else :
if ('open' == $post->comment_status) :
	// If comments are open, but there are no comments.
else :
	// comments are closed
endif;
endif;

Если говорить по существу, цикл комментариев просматривает каждый комментарий вручную, после чего выводит все необходимые части. Просто, но очень неэффективно. Этот код, также довольно трудно редактировать вашим редактором тем, особенно тяжело его настраивать.

Новый цикл комментариев, выглядит намного проще, и больше похож на нормальный Цикл вывода записей:

if ( have_comments() ) : ?>
<h4 id="comments"><?php comments_number('No Comments', 'One Comment', '% Comments' );?></h4>
<ul class="commentlist">
	<?php wp_list_comments(); ?></ul>
<div class="navigation">
<div class="alignleft"><?php previous_comments_link() ?></div>
<div class="alignright"><?php next_comments_link() ?></div>
</div>
<?php else : // this is displayed if there are no comments so far ?>
	<?php if ( comments_open() ) :
		// If comments are open, but there are no comments.
	else : // comments are closed
	endif;
endif;

Это новый, фактически полный цикл комментариев. Без каких-либо упрощений. Разве что, вы захотите отобразить что-нибудь в секции «нет комментариев» или «комментарии закрыты».

Следует отметить три важных изменения в коде:

  • Функция have_comments() заменяет проверку глобальной переменной $comments
  • Функция wp_list_comments() теперь выводит все комментарии. Она разбивает комментарии на ветки и классифицирует.
  • Добавлена секция навигации при разбивке комментариев по страницам

Разбивка комментариев по страницам

Также в систему комментариев версии 2.7, добавлена возможность легко разбивать комментарии на страницы, так что вам больше нет необходимости ждать, пока загрузится одна страница с тысячами комментариев.

Для того чтобы реализовать постраничную разбивку комментариев с навигаций, вам понадобится сделать две вещи. Во-первых, указать в настройках WordPress, «Параметры» — «Обсуждение» — «Разбивать комментарии на странице».

comments2

А во-вторых, для вывода удобной навигации, можно воспользоваться функцией paginate_comments_links(), которая выводит ссылки на предыдущую и следующую страницы, а также выводит номера страниц с комментариями в виде ссылок.

paginate_comments_links($args);

Более подробную информацию об этой функции можно прочитать в кодексе.

JavaScript-функциональность в комментариях

Чтобы включить полную поддержку JavaScript в комментариях, в WordPress 2.7, следующие изменения должны быть произведены с Файлами Шаблона WordPress.

Для поддержки новой JavaScript-функциональности с деревом комментариев, нужно добавить следующую строку в файл header.php, непосредственно перед вызовом wp_head():

if ( is_singular() ) wp_enqueue_script( 'comment-reply' );

Этот код добавляет возможность ответа на любой комментарий. Он открывает форму отправки комментария ниже того комментария, на который вы хотите ответить, кликнув по ссылке «ответить». WordPress специально не делает этого сам, поскольку использование этого скрипта требует обязательно добавления определенных обозначений и параметров в форме комментирования.

В форму комментирования нужно добавить следующую новую функцию:

<?php comment_id_fields(); ?>

Функция добавляет немного кода к форме комментариев, для отображения скрытых полей: comment_post_ID и comment_parent. Если в вашей форме комментирования уже присутствует поле comment_post_ID, вы должны удалить его. Поле comment_parent используется для определения, какому комментарию принадлежит опубликованный ответ, вследствие чего древовидные комментарии работают должным образом.

Элемент textarea, в форме комментариев обязательно должен иметь id=”comment”. JavaScript использует его для ввода текста. Обратите внимание на то, что никакой другой элемент на странице не должен иметь ID равным «comment».

Для того чтобы связать комментирование с остальным кодом, и обеспечить корректную работу JavaScript, форма комментирования должна быть заключена в DIV с id=”respond”. В некоторых предыдущих темах (включая и дефолтные), вместо div-а, был расположен якорь, похожий на этот:

<a id="respond"></a>

Благодаря этому, со ссылки с главной страницы можно было сразу переходить к разделу комментирования, когда комментариев еще нет. Все это есть и сейчас, но теперь преследуется двойная цель. JavaScript передвигает форму комментирования к месту расположения ссылки, следовательно вместо якоря вам необходимо заключить форму комментирования в DIV.

Удалите этот якорь и создайте DIV с id=”respond”, вокруг формы комментирования. Ссылка с главной страницы будет продолжать работать должным образом во всех современных браузерах, и JavaScript теперь сможет передвигать форму комментирования хоть по всей странице, если это необходимо.

Теперь замените простой текст «Оставьте комментарий», чем-то вроде этого:

<h3><?php comment_form_title(); ?></h3>

Это позволит изменить название формы комментирования «Оставьте комментарий» на что-то вроде «Оставьте комментарий пользователю Васе», когда публикуется ответ непосредственно другому человеку, если выключен JavaScript. Вы можете настроить функцию по вашему усмотрению, с двумя параметрами:

<?php comment_form_title( 'Leave a Reply', 'Leave a Reply to %s' ); ?>

%s будет заменен на имя пользователя, если JavaScript отключен.

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

<div id="cancel-comment-reply">
	<small><?php cancel_comment_reply_link() ?></small></div>

CSS-стилизация

С новым кодом для комментариев, вы сможете намного лучше настроить внешний вид комментариев.

Новый цикл вывода комментариев автоматически заключает каждый комментарий в тэги <li>, и строит дерево из них, с помощью встраиваемых <ul> и <li> тэгов. Он также добавляет классы всем элементам <li>, окружающим каждый комментарий, приводя к следующему виду:

  • классы comment, trackback и pingback добавляются в зависимости от типа комментария.
  • класс byuser добавляется, если комментарий оставил зарегистрированный пользователь сайта
  • класс comment-author-authorname (имя автора) добавляет имя конкретного зарегистрированного пользователя.
  • класс bypostauthor добавляется, если комментарий оставил автор текущей записи.
  • классы odd и even добавляются для нечетных и четных комментариев.
  • класс alt добавляется к любому другому комментарию
  • классы thread-odd, thread-even, и thread-alt предназначены для того же, что и классы odd/even/alt, за исключением того, что они применяются только к верхнему уровню каждого набора комментариев.
  • класс depth-1 добавляется к комментариям верхнего уровня, depth-2 к следующему уровню и так далее.

Благодаря всем этим классам, стилизация комментариев, становится до смешного простой. Выбирайте интересующий вас тип комментария и назначайте ему соответствующий стиль в CSS-файле. Подсветка авторских комментариев, полосатая раскраска, отделение трэкбэков от обычных комментариев — все это теперь доступно вам, без использования JavaScript.

Перевод статьи кодекса «Migrating Plugins and Themes to 2.7/Enhanced Comment Display«

Рассказать друзьям

Понравилась статья? Лучший способ сказать спасибо - поделиться ссылкой в социальных сетях: