Какую бы тему вы не использовали в своем блоге, вряд ли вы каждый раз принимаетесь обновлять ее до текущей версии WordPress. Обновления WordPress, появляются постоянно, и если используемая тема продолжает нормально работать, нам, скорее всего, и в голову не придет что-то в ней изменить. А между тем, было бы не плохо знать, какие возможности становятся нам доступны, с новыми версиями движка.
И одной из таких возможностей, является новая, усовершенствованная система комментариев, которая доступна нам уже в версии 2.7. Поэтому, если вы используете тему, созданную для более ранних версий, читайте далее, как обновить ее систему комментариев до версии 2.7.
Вступление
Начиная с версии 2.7, WordPress имеет встроенную поддержку и древовидных комментариев и постраничную разбивку. Хотя для работы с WordPress 2.7, вашей теме не требовались никакие изменения, для того чтобы воспользоваться новыми возможностями комментариев, вам придется обновить свой шаблон. Далее в статье, вы узнаете, как это можно сделать.
Изменение кода в файле 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, «Параметры» — «Обсуждение» — «Разбивать комментарии на странице».
А во-вторых, для вывода удобной навигации, можно воспользоваться функцией 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«
Я пока заюзал дефолтные стили с кубрика, во всех браузерах все класно, кроме, конечно же, всенародно любимого 6 эксплорера..
Аватар и дата комментария сьежают. Знаю что проблема из-за position:absolute, но как пофиксить — не знаю… :(
Пример: babay.com.ua/?p=6#comments
Норм
Спасибо за статью. Интересно, какая максимальная вложенность? Последнюю систему комментариев, которая понравилась — видел на bclog.ru. Самое интересное это как там реализована Каптча — новая разновидность onlymousemovecaptcha.
Хорошо расписал, а если изменения по сравнению с версией 2.8.4 ?
Пока не знаю, но то что описано в статье, в 2.8.4 гарантированно будет работать
Спасибо! С помощью вашей статьи и еще двух очень на вашу похожих :) таки разобрался, как эти древовидные комменты сделать. Только вот у вас кнопочки в форме «отменить ответ» не хватает, а то неудобно, приходится страницу перегружать.
Да вот же, сапожник без сапог, постараюсь найти время, чтобы исправить)
А как себя будет чувствовать это в более новой версии?
Хорошо чувствует себя. Проверил уже. На версии 2.9
не подскажете как сделать что бы комментарии и само комментирование было не только в новости полной, но и краткой на главной странице?
А не подскажите ли, а портал ползуется спросом? Недавно здесь — вот хотел уточнить. Чрезмерно буду благодарен за ответы.
А как вывести количество комментариев просто числом, а не ссылкой?
Please let me know if you’re looking for a author for your site.
You have some really great articles and I believe I would be
a good asset. If you ever want to take some of
the load off, I’d absolutely love to write some content
for your blog in exchange for a link back to mine. Please
blast me an e-mail if interested. Cheers!
Хорошая статья! Спасибо