Этот пост я начал писать еще в конце прошлого года, вскоре после выхода Вордпресс 2.7. Тема оказалась сложнее, чем я думал, поэтому, в запланированное время я не успел с ней разобраться, забросил, и вернулся к ней только сейчас.
Пост основан на документе Migrating Plugins and Themes to 2.7/Enhanced Comment Display.
Наверняка, вы уже читали в половине блогов из своего RSS ридера о выходе новой версии Вордпресс 2.7. Поэтому, я не буду повторяться и перечислять новые возможности этой версии (если кто не читал, то вот ссылка на обзор). Я просто расскажу об одной из них — древовидных комментариях. Эта возможность давно напрашивалась и, вот теперь, в Вордпрессе можно использовать древовидные комментарии без установки дополнительных плагинов.
К сожалению, для того, чтобы включить эту возможность, необходимо внести исправления в файлы используемой темы оформления. Безусловно, новые темы будут делаться уже с учетом этой возможности, но если вы не хотите ждать появления подходящей темы с поддержкой древовидных комментариев, то можете модифицировать используемую вами тему. О том, как это сделать, я и расскажу.
Совместимость с предыдущими версиями
Первое, что вам надо решить — нужна ли вам совместимость с предыдущими версиями Вордпресса? Если вы разрабатываете тему оформления для паблика, то ответ будет — “Безусловно да!”. Если вы хотите просто поправить тему оформления на своем блоге, чтобы отображались древовидные комментарии, то на совместимость можно забить. На всякий случай, просто сделайте копию старого файла comments.php (именно его мы будем менять).
Итак, если вы решили обеспечить совместимость с предыдущими версиями Вордпресса, то придется использовать старый и новый код для отображения комментариев. Проверку на версию (точнее говоря, на поддержку древовидных комментариев в данной версии) можно сделать так:
1 2 3 4 |
if ( function_exists('wp_list_comments') ) : // новый код comments.php else : // старый comments.php endif; |
Поместить весь код в comments.php — не лучшая идея. Вместо этого, лучше сделать два файла — с новым и старым кодом. Например, можно переименовать имеющийся файл comments.php в legacy.comments.php, а в comments.php поместить новый код.
Чтобы обеспечить использование comments.php или legacy.comments.php в зависимости от версии, в документации по Вордпрессу предлагается довольно хитрый способ — поместить следующий код в файл functions.php:
1 2 3 4 5 6 7 8 |
<?php add_filter( 'comments_template', 'legacy_comments' ); function legacy_comments( $file ) { if ( !function_exists('wp_list_comments') ) $file = TEMPLATEPATH . '/legacy.comments.php'; return $file; } ?> |
Я не сторонник создания лишних фильтров и предлагаю использовать другой вариант — новый код поместить в файл new.comments.php (старый в legacy.comments.php). А в файле comments.php написать такую очевидную конструкцию:
1 2 3 4 |
if ( function_exists('wp_list_comments') ) : require_once('new.comments.php'); else : require_once('legacy.comments.php'); endif; |
Проверка пароля
Поместите в начало нового comments.php этот код:
1 2 |
if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME'])) die ('Не загружайте эту страницу напрямую!'); if ( post_password_required() ) { echo '<p class="nocomments">Этот пост защищен паролем. Введите пароль, для просмотра комментариев.<p>'; return; } |
Эта проверка не сильно отличается от предыдущей версии — основное отличие в использовании функции post_password_required() вместо явной проверки куки.
Вывод комментариев
Вот мы и добрались до главного — кода, который будет выводить комментарии в новом, древовидном формате. Чтобы было понятнее, рассмотрим старый код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if ($comments) : <?php $comment_count = get_comment_count($post->ID); echo $comment_count['approved']; ?> Comments <ul class="commentlist"> <?php foreach( $comments as $comment ) : // Вывод комментариев в теге LI endforeach; ?> </ul> <?php else : if ('open' == $post->comment_status) : // Комментирование разрешено, но комментариев еще нет else : // Комментарии запрещены endif; endif; |
и заменяющий его новый:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 ('open' == $post->comment_status) : // Комментирование разрешено, но комментариев еще нет else : // Комментарии запрещены endif; endif; |
В вашей теме код может немного отличаться. Поэтому, новый код надо не копировать, а внедрить с учетом отличий вашей темы от стандартной.
Основные отличия:
- Вместо глобальной переменной $comments используется функция have_comments().
- Собственно вывод комментариев обеспечивает функция wp_list_comments(). Она же реализует древовидность.
- Код для навигации, обеспечивающий постраничное разбиение комментариев
Как видите, код получился проще и логичнее — с точки зрения кода вывод комментариев стал похож на вывод постов.
Постраничная разбивка комментариев
Количество комментариев к некоторым постам может достигать несколько сотен, поэтому, разделение комментариев на несколько страниц может оказаться хорошей идеей. Проще всего для этой цели использовать функцию paginate_comments_links.
Включать/выключать разбивку на страницы и задавать количество комментариев на странице можно в админ панели Вордпресса.
Поддержка JavaScript
Для поддержки древовидных комментариев необходимо подключить JavaScript в файле header.php, непосредственно перед вызовом wp_head():
1 |
if ( is_singular() ) wp_enqueue_script( 'comment-reply' ); |
В форме комментирования (между тегами <form> и </form>) необходимо вставить строку
1 |
<?php comment_id_fields(); ?> |
которая вставит два скрытых (hidden) поля: comment_post_ID и comment_parent. Если в вашем шаблоне уже есть поле comment_post_ID, то его надо удалить. Поле для ввода комментария (textarea) должно иметь id=”comment”.
Для корректной работы ссылок на комментарии к посту (например, с главной страницы) и JavaScript, форма должна быть окружена <div id=”respond”></div>.
Вместо текста “Оставьте комментарий” лучше вставить что-то типа:
1 |
<?php comment_form_title( 'Оставьте комментарий', 'Оставьте комментарий для %s' ); ?> |
Вместо параметра %s будет подставлен ник комментатора, на комментарий которого вы отвечаете.
Наконец, после того, как вы кликнете на кнопку “Ответить” возле комментария и появится поле для комментирования, вы можете передумать. Чтобы отменить комментарий, вставьте такой код:
1 |
<div id="cancel-comment-reply"> <small><?php cancel_comment_reply_link() ?></small> </div> |
Произвольный формат комментариев
Если вы проделали все перечисленные действия, то получили шаблон, поддерживающий древовидные комментарии. Но если хочется их кастомизировать, то в вызове wp_list_comments()
можно указать callback функцию, которая будет обеспечивать формат каждого комментария.
Если вы решите переделать свою тему, но у вас возникнут сложности, постараюсь помочь в комментариях, но учтите, что минимальное понимание html и php все же понадобится.