Home » Движки сайтов и блогов » Древовидные комментарии в WordPress 2.7

Древовидные комментарии в WordPress 2.7

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

Пост основан на документе Migrating Plugins and Themes to 2.7/Enhanced Comment Display.

Comment Threading Наверняка, вы уже читали в половине блогов из своего RSS ридера о выходе новой версии Вордпресс 2.7. Поэтому, я не буду повторяться и перечислять новые возможности этой версии (если кто не читал, то вот ссылка на обзор). Я просто расскажу об одной из них — древовидных комментариях. Эта возможность давно напрашивалась и, вот теперь, в Вордпрессе можно использовать древовидные комментарии без установки дополнительных плагинов.

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

Совместимость с предыдущими версиями

Первое, что вам надо решить — нужна ли вам совместимость с предыдущими версиями Вордпресса? Если вы разрабатываете тему оформления для паблика, то ответ будет — “Безусловно да!”. Если вы хотите просто поправить тему оформления на своем блоге, чтобы отображались древовидные комментарии, то на совместимость можно забить. На всякий случай, просто сделайте копию старого файла comments.php (именно его мы будем менять).

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

Поместить весь код в comments.php — не лучшая идея. Вместо этого, лучше сделать два файла — с новым и старым кодом. Например, можно переименовать имеющийся файл comments.php в legacy.comments.php, а в comments.php поместить новый код.

Чтобы обеспечить использование comments.php или legacy.comments.php в зависимости от версии, в документации по Вордпрессу предлагается довольно хитрый способ — поместить следующий код в файл functions.php:

Я не сторонник создания лишних фильтров и предлагаю использовать другой вариант — новый код поместить в файл new.comments.php (старый в legacy.comments.php). А в файле comments.php написать такую очевидную конструкцию:

Проверка пароля

Поместите в начало нового comments.php этот код:

Эта проверка не сильно отличается от предыдущей версии — основное отличие в использовании функции post_password_required() вместо явной проверки куки.

Вывод комментариев

Вот мы и добрались до главного — кода, который будет выводить комментарии в новом, древовидном формате. Чтобы было понятнее, рассмотрим старый код:

и заменяющий его новый:

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

Основные отличия:

  • Вместо глобальной переменной $comments используется функция have_comments().
  • Собственно вывод комментариев обеспечивает функция wp_list_comments(). Она же реализует древовидность.
  • Код для навигации, обеспечивающий постраничное разбиение комментариев

Как видите, код получился проще и логичнее — с точки зрения кода вывод комментариев стал похож на вывод постов.

Постраничная разбивка комментариев

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

Включать/выключать разбивку на страницы и задавать количество комментариев на странице можно в админ панели Вордпресса.

Поддержка JavaScript

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

В форме комментирования (между тегами <form> и </form>) необходимо вставить строку

которая вставит два скрытых (hidden) поля: comment_post_ID и comment_parent. Если в вашем шаблоне уже есть поле comment_post_ID, то его надо удалить. Поле для ввода комментария (textarea) должно иметь id=”comment”.

Для корректной работы ссылок на комментарии к посту (например, с главной страницы) и JavaScript, форма должна быть окружена <div id=”respond”></div>.

Вместо текста “Оставьте комментарий” лучше вставить что-то типа:

Вместо параметра %s будет подставлен ник комментатора, на комментарий которого вы отвечаете.

Наконец, после того, как вы кликнете на кнопку “Ответить” возле комментария и появится поле для комментирования, вы можете передумать. Чтобы отменить комментарий, вставьте такой код:

Произвольный формат комментариев

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

Если вы решите переделать свою тему, но у вас возникнут сложности, постараюсь помочь в комментариях, но учтите, что минимальное понимание html и php все же понадобится.

  • Юрий

    А каким образом через функцию wp_list_comments(); можно обратиться допустим в времени или дате поста? чтобы сделать им свои стили?

  • В вызове wp_list_comments() надо указать callback функцию, которая будет отвечать за вывод комментариев.
    Подробнее смотрите пример здесь: http://codex.wordpress.org/Template_Tags/wp_list_comments

  • Юрий

    Ага, Спасибо, так и сделал…
    В принципе некоторые значения установленные по дефолту в функции
    wp_list_comments можно поменять на нужные, но этого зачастую все равно недостаточно :(

  • Юрий

    Вы писали:
    Вместо текста “Оставьте комментарий” лучше вставить что-то типа:
    <?php comment_form_title( ‘Оставьте комментарий’, ‘Оставьте комментарий для %s’ ); ?>

    Вместо параметра %s будет подставлен ник комментатора, на комментарий которого вы отвечаете.

    Наконец, после того, как вы кликнете на кнопку “Ответить” возле комментария и появится поле для комментирования, вы можете передумать. Чтобы отменить комментарий, вставьте такой код:
    <div id="cancel-comment-reply"> <small><?php cancel_comment_reply_link() ?></small> </div>

    ——

    вопрос такой почему "Оставить комментарий для кого-то" работает только когда нет функции cancel_comment_reply_link() ???
    Как это можно исправить?

  • У меня работает с cancel_comment_reply_link().
    Скорее всего вы что-то напутали с кодом, посмотрите внимательнее.

  • Юрий

    Да она работает, но пишет просто "оставить комментарий" а ниже "нажмите чтобы отменить ответ". А если функцию cancel… убрать то
    comment_form_title будет выдавать: " оставить комментарий для (ну допустим Васи). У вас так?

  • Да, у меня, тоже, так. Я на этот нюанс не обратил внимание.

  • Юрий

    Во-во и в кодексе ничего по этой теме нет! :(

  • Денис

    Проделал все вышеописанные действия, но в итоге только поменялся формат списка – вместо нумерованного списка <ol> посты стали выводится списком <ul>.
    Тема не стандартная, comments.php заменил из дефолтной темы версии 2.7 но древовидности так и не добился, также не могу понять как заставить работать wp_list_comments(); или paginate_comments_links.
    Помогите, пожалуйста, разобраться)

  • Денис, смотрите внимательнее. Я по этому алгоритму одну старую тему переделал и все работает.

  • Денис

    Тема была разработана под WP 2.6, после обновления WP до версии 2.7.1 тема работает по прежнему хорошо. Но древовидные комментарии не отображает.
    Проделал следующее:
    Скопировал comments.php из default темы WP 2.7, заменил им comments.php в нужной теме. Комментарии работают без изменений. Вношу все изменения по порядку, как Вы описали – изменилось оформление комментариев с <ol> на <ul>. Внес соответствующие изменения в header.php нужной темы – <?php if ( is_singular() ) wp_enqueue_script( ‘comment-reply’ ); ?>. <?php comment_id_fields(); ?> уже было в файле comments.php. Текст "Оставьте комментарий" изменять не стал.
    Древовидности нет. Подскажите куда копать?

  • А в админке включили древовидность?

  • Денис

    Сейчас покопался, нашел в настройках чекбокс "Включить древовидные (вложенные) комментарии с уровнем вложенности" включил и тут же включил "Разбивать комментарии на страницы". На страницы разбиты комментарии, а древовидности нет(

  • а сами комментрарии есть?
    если переключиться на дефолтную тему?

  • Денис

    комментарии есть. Переключался на дефолтную тему (только что), нет древовидных…

  • я имел в виду, есть ли сами комментарии в древовидной форме (в базе)
    если их нет, то и отображаться нечему

    кнопочки "Replya" под комментариями есть?

  • Денис

    в админке есть кнопка "Ответить" а в комментариях на странице сайта нет кнопки ответить.
    В какой базе?

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

  • Денис

    А не подскажите, как настроить в базе древовидность?

  • вы неправильно меня поняли – настраивать в базе ничего не надо

    вот, например, на моем блоге нет древовидных комментариев
    очевидно, если я реализую возможность показа древовидных комментариев, то в уже существующих диалогах ничего не изменится

    но новые комментарии, создаваемые как ответы на другие, будут уже отображаться в виде дерева

  • Денис

    В том то и дело, что ни в старых, ни во вновь созданных комментариях нет древовидности.

  • Денис

    Решил проблему установкой плагина Thread Comments) Работает как мне надо.

  • Сделал все как положено, но по нажатию на ответить форма сама куда надо не едет, а остается на месте. Ссылка "ответить" отправляет на форму. Нужный comment-reply.js подключен. В чем же может быть проблема?

    • Перспективный блоггер, у меня такая же проблема.
      После продолжительных “раскопок” удалось найти отправную точку именно этой проблемы – причина в том, что не работает функция cancel_comment_reply_link().
      А вот почему она не срабатывает, пока не знаю. Быть может, глюк конкретной версии движка вордпресса.
      У вас какой?
      У меня не работает на WordPress 3.0.1 Обновлять именно этот сайт до последней версии пока не хочется… При этом точно такая же пара файлов comments.php и functions.php на другом моем сайте, с движком WordPress 3.0.4 работает без этой ошибки.
      Можете посмотреть на эту ошибку на сайте, указанном у меня под логином.

      • Все, удалось разобраться. Заработало все.
        У меня эта функция не срабатывала, т.к. в хедере ошибка была.
        Короче, копайте именно это – где у вас cancel_comment_reply_link() вызывается? Должна вызываться в comments.php

  • да, вот помучаться вам пришлось… я несколько месяцев уже тоже не могу их установить, вот сегодня ваш пост мотивировал, может снова попробую, спасибо:)

  • Мерген

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

    • Откройте comments.php и переместите форму комментария (…) в нужное вам место.