DIW#9. Комментарии WordPress

29.08.2012

Сегодняшний перевод DIW будет посвящен комментариям WordPress — пожалуй, одной из важнейших функций WP. Именно благодаря функции комменттрования блоги и WordPress, как блоговый движок, получили такую популярность. Кроме, собственно, перевода главы из книги, я добавлю кое-что из своих наработок. Приступим

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

Comments.php

Все, что касается отображения комментариев шаблоном — содержится в файле comments.php. Если быть точным, то там есть такие пункты:

  • логика отображения комментариев(об этом ниже)
  • существующие комментарии
  • форма комментирования

С последними двумя все ясно, а вот с первым — что за логика? Что то вроде этого:

Запись защищена паролем?
Да — показать сообщение и прекратить исполнение
Нет — продолжаем

Есть ли комментарии к записи?
Да — показываем комментарии и продолжаем
Нет — ничего не показываем и продолжаем

Комментарии открыты?
Да — продолжаем
Нет — показываем сообщение и останавливаемся

Нужна ли регистрация для комментирования?
Да — показываем сообщение и останавливаемся
Нет — показываем форму комментирования

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

Добавить комментарии в шаблон довольно просто — для этого используется функция:

<?php comments_template(); ?>

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

Пользовательские поля

Пользовательские поля

Однако, есть более простой способ показа или скрытия формы комментариев. Он основывается на заполнении пользовательского поля, на скриншоте я показал это.

Для этого достаточно заменить вывод формы комментариев в файле page.php или single.php, в зависимости от того, где вы хотите показывать или скрывать форму комментариев, на следующий код:

<?php // показываем форму комментариев
if (!get_post_meta($post->ID, "commentform", true)) {
 comments_template(); }
?>

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

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

Настраиваем комментарии

Начнем с того, что комментариями пользуются спамеры. Это настоящая «головная боль» для более-менее популярного блога. Вот моя статистика, собранная за полгода работы плагина Akismet:

Статистика Akismet

Статистика Akismet

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

Убираем ссылку из имени комментатора

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

function remove_comment_url($fields) {
unset($fields['url']);
return $fields; }
add_filter('comment_form_default_fields','remove_comment_url');

Кто комментировал сознательно — продолжит это делать, а вот спамеры ничего не получат…

Внешнее оформление комментариев

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

<ol class="comments">
<?php wp_list_comments('type=comment&callback=custom_comments'); ?>
</ol>

Здесь, используя параметр callback, мы заставляем WordPress выводить комментарии с помощью функции custom_comments. Сначала посмотрим полный вариант кода, затем разберем подробнее:

function custom_comments($comment, $args, $depth) {
    $isByAuthor = false;
    if($comment->comment_author_email == get_the_author_meta('email')) {
        $isByAuthor = true;
    }
   $GLOBALS['comment'] = $comment; ?>
<li <?php comment_class(); ?> id="li-comment-<?php comment_ID() ?>">
<div id="comment-<?php comment_ID(); ?>" <?php if($isByAuthor){ echo 'class="author"';}?>>
<div class="comment-author vcard">
         <?php echo get_avatar( $comment->comment_author_email, '64', '/images/no_images.jpg', get_the_author() ); ?>
         <?php printf(__('<cite class="comment-name">%s</cite>'), get_comment_author()) ?>
         <?php edit_comment_link(__('(Редактировать)'),'  ','') ?>
      </div>
      <?php if ($comment->comment_approved == '0') : ?>
         <em><?php _e('Комментарий ожидает проверки') ?></em>

      <?php endif; ?>
      <?php comment_text() ?>
<div class="reply">
         <?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
      </div>
</div>
</li>
<?php
}

Несмотря на кажущуюся сложность — функция довольно простая… Да, ее нужно добавить в файл functions.php вашего шаблона.


автор комментарияВыделяем комментарии автора
Отлично, когда комментарии автора статьи — немного выделяются из общего потока. Для этого мы сначала найдем их, сравнивая E-mail автора статьи с адресом комментатора. В нашей функции за это отвечают следующие строки:

$isByAuthor = false;
if($comment->comment_author_email == get_the_author_meta('email')) {
 $isByAuthor = true;
}

Сравнили адреса, если они совпали — назначили переменной $isByAuthor значение истина. Пойдем дальше — нужно назначить отдельный класс для таких комментариев. Это происходит в следующей строке:

<div id="comment-<?php comment_ID(); ?>" class="author">>

Теперь можно в файле стилей слегка изменить фон и все — ответ автора статьи отличается от всех остальных.


аватар комментатораПолучаем аватар комментатора
Простая, но достаточно мощная функция, в которую обычно редко кто лезет. А зря, ведь аватары тоже можно настроить… В нашей функции это делает такой код:

<?php echo get_avatar( $comment->comment_author_email, '64', '/images/no_images.jpg', get_the_author() );?>

Здесь несколько параметров — первый содержит E-mail комментатора, второй — размер аватара, третий — картинку, которая показывается, если аватара у человека нет и четвертый — описание изображения(alt), обычно это ник комментатора.


Ссылка на комментатораУдаляем ссылку из имени комментатора
Я показывал выше сниппет, которым можно удалить поле URL в форме комментирования. Однако, есть и более интересный вариант. В моей функции ссылка из имени уже удалена, делается это в этой строке:

<?php printf(__('<cite class="comment-name">%s</cite>'), get_comment_author()) ?>

Если же вам необходимо оставить эту возможность — замените ее на такую строку:

<?php printf(__('<cite class="fn">%s</cite>'), get_comment_author_link()) ?>


Редактирование комментарияДобавляем ссылку на редактирование
Достаточно удобно иметь возможность из просмотра статьи перейти к редактированию отдельного комментария, не выискивая его в разделе админки. Сделать это очень просто — в нашей функции за это отвечает такая строка:

<?php edit_comment_link(__('(Редактировать)'),'  ','') ?>


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

<div class="reply">
  <?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>
</div>

Ответам назначен отдельный класс, поэтому тоже можно оформить, чтобы они внешне немного отличались. Вот только есть небольшая проблема — при ответе ссылка на комментатора начинает индексироваться. Побороть это поможет небольшой сниппет, который нужно добавить в functions.php:

/*
Добавляем rel="nofollow" к ответу
*/
function add_nofollow_to_reply( $link ) {
return str_replace( '")\'>', '")\' rel=\'nofollow\'>', $link );
}
add_filter( 'comment_reply_link', 'add_nofollow_to_reply' );


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

Удачного дня

, ,

Комментариев: 13

  1. Alex

    Подскажите пожалуйста, а как сделать так, чтобы при клике на кнопочку ответить, комментатора переносило на форму комментария, а не приходилось скролить вниз ?

    Спасибо.

    Ответить
    • GerinG

      Пример чего вы хотите посмотреть? Это не урок по CSS, тут показывать нечего Это обзорная статья с примерами функций

      Ответить
  2. Людмила

    Спасибо!!! Создала отдельную страничку «Вопрос-Ответ», а вопросы писать некуда. Нет формы комментариев. благодаря Вам, всё быстро исправила.

    Ответить
  3. GerinG

    WPixel — картинка не выводится, потому что не найдена? Судя по тому, что выводится ее альт — так и есть. Значит с путями где-то затык.

    Daniel — я бы не советовал заменять поле Email, гораздо лучше было бы использовать для этого URL. Делаем выпадающий список, его значение заносим вместо URL обычного комментария. Как список сделать я писал тут например — http://gering111.com/vupadaushiy-spisok-css/

    Ну а сформировать страницу с отзывами о магазине — это совсем другая песня Цикл по комментариям(вот только не помню, можно ли так делать, но вроде можно) и их оформление, на этом все

    Ответить
  4. Daniel

    Работаю сейчас над одним интернет проектом, столкнулся с проблемой: не знаю, как в форме добавления комментария вместо поля емэйл вставить произвольное поле, нажимая на которое, человек выбирал бы магазин из заранее заданного списка. После добавления комментария название магазина должно быть ссылкой на страницу магазина где было бы короткое его описание и отображались бы все комментарии этого магазина а их заголовками были бы тайтлы страниц, на которых они были добавлены. Я понимаю, что вы очень заняты, но был бы бесконечно благодарен, если бы вы разъяснили мне это дело

    Ответить
  5. Светлана

    Ругается на 10 строку (в вашем примере), т.е. на то место, где «echo get_avatar…». Первый месяц учусь делать шаблоны, прошу прощения за глупые ошибки.

    Ответить
    • GerinG

      Выполнил вашу просьбу
      Если 10 строка — весьма вероятно, что ошибка с картинкой, он не может ее найти. В моем (ну не совсем моем, все же статья — перевод) коде путь указан без учета пути к шаблону.
      Возможно, вам поможет что-то типа:

      echo get_avatar( $comment->comment_author_email, '64', get_bloginfo('template_directory').'/images/nopic.jpg', get_the_author() );

      Я заменил жесткое указание пути на строку, в которой указываю путь к шаблону и путь к картинке, с учетом этого.

      Ответить
      • WPixel

        чет даже изменяя путь к картинке она не выводится. выводится альт в виде админа

        Ответить
  6. Светлана

    Функция custom_comments, помещенная в файл functions.php, выдает ошибку. Поясните пожалуйста почему ?

    Ответить
    • GerinG

      Светлана, хотелось бы от вас больше информации. Пример ошибки, пример файла или еще что-то. Я не могу угадывать, отчего у вас не работает код

      Ответить