10 полезных приемов по работе с комментариями в WordPress

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

1. Создаем для комментариев ссылки с действиями

Создаем для комментариев ссылки с действиями
Проблема. Вне зависимости от наличия обязательного одобрения комментариев перед публикацией, часть записей всегда приходится редактировать, удалять или помечать как спам. По умолчанию WordPress предлагает для комментариев ссылку "Edit" (с использованием функции "edit_comment_link()"), не предусматривая "Delete" или "Spam". Предлагаю их добавить.

Решение. Для начала нужно создать функцию. Вставьте приведенный ниже код в файл "functions.php":

function delete_comment_link($id) {
if (current_user_can('edit_post')) {
echo '| <a href="'.admin_url("comment.php?action=cdc&c=$id").'">del</a> ';
echo '| <a href="'.admin_url("comment.php?action=cdc&dt=spam&c=$id").'">spam</a>';
}
}

Сохранив файл "functions.php", откройте "comments.php" и туда, где должны появиться ссылки "Delete" и "Spam", добавьте указанный код. Обе должны войти в loop комментария. В большинстве тем предусмотрена функция "edit_comment_link()". В таком случае код добавляется сразу после него.

delete_comment_link(get_comment_ID());

Анализ кода. Первым делом мы, само собой, убеждаемся, что у пользователя есть разрешение на редактирование комментариев. После его подтверждения отображаются ссылки, позволяющие удалить комментарий или пометить его как спам. Обратите внимание на функцию "admin_url()", с помощью которой можно получить URL администратора блога.

2. Отделяем от комментариев трекбэки

Отделяем от комментариев трекбэки
Проблема. В записях слишком много трекбэков? Лично у меня да. С одной стороны, это здорово, поскольку читатели видят, какие статьи из других блогов ссылаются на ваши. С другой стороны, чрезмерное их количество мешает следить за ходом обсуждения. В такой ситуации, безусловно, имеет смысл отделять трекбэки от комментариев, особенно если не используется предусмотренная в WordPress 2.7 функция "Reply".

Решение. Найдите в теме и отредактируйте файл "comments.php". Найдите loop комментариев, выглядящий примерно так:

foreach ($comments as $comment) : ?>
// Comments are displayed here
endforeach;

Теперь замените его приведенным ниже кодом:

<ul class="commentlist">
<?php //Displays comments only
foreach ($comments as $comment) : ?>
<?php $comment_type = get_comment_type(); ?>
<?php if($comment_type == 'comment') { ?>
<li>//Comment code goes here</li>
<?php }
endforeach;
</ul>

<ul>
<?php //Displays trackbacks only
foreach ($comments as $comment) : ?>
<?php $comment_type = get_comment_type(); ?>
<?php if($comment_type != 'comment') { ?>
<li><?php comment_author_link() ?></li>
<?php }
endforeach;

</ul>

Анализ кода. В принципе, абсолютно ничего сложного. Функция "get_comment_type()" сообщает тип — обычный комментарий или же трекбэк. Нам достаточно создать два HTML-списка, заполнив первый обычными комментариями, а второй — трекбэками.

3. Избавляемся от HTML-ссылок в комментариях

Избавляемся от HTML-ссылок в комментариях
Проблема. Блоггеры никогда не упустят случая прорекламировать свое детище, да и спамеры пока никуда не исчезли. Меня всегда ужасно раздражает невероятное количество ссылок в комментариях, как правило, не имеющих ни малейшего отношения к вопросу. По умолчанию URL-адреса в комментариях WordPress превращает в ссылки. К счастью те, кто устал от ссылок не меньше меня, могут это исправить.

Решение. Просто откройте файл "function.php" и вставьте представленный ниже код:

function plc_comment_post( $incoming_comment ) {
$incoming_comment['comment_content'] = htmlspecialchars($incoming_comment['comment_content']);
$incoming_comment['comment_content'] = str_replace( "'", '&apos;', $incoming_comment['comment_content'] );
return( $incoming_comment );
}

function plc_comment_display( $comment_to_display ) {
$comment_to_display = str_replace( '&apos;', "'", $comment_to_display );
return $comment_to_display;
}

add_filter('preprocess_comment', 'plc_comment_post', '', 1);
add_filter('comment_text', 'plc_comment_display', '', 1);
add_filter('comment_text_rss', 'plc_comment_display', '', 1);
add_filter('comment_excerpt', 'plc_comment_display', '', 1);

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

Анализ кода. Сначала мы создали две функции, заменяющие HTML-символы на HTML-объекты. После этого с помощью мощной функции "add_filter()" привязываем стандартные функции WordPress по обработке комментариев к двум только что созданным функциям. Это гарантирует, что во всех добавленных комментариях HTML-составляющие будут отфильтрованы.

4. Добавляем в комментарии аватары Twitter

Добавляем в комментарии аватары Twitter
Проблема. Блоггерам сеть Twitter крайне полезна благодаря возможности как популяризировать собственный блог, так и быть на связи с коллегами-блоггерами и собственной аудиторией. Сеть Twitter настолько популярна, что вместо глобальных аваторов (граватаров) комментарии вполне можно иллюстрировать аватарами Twitter.

Решение.
1. Сначала получаем отсюда функциональный файл.
2. Затем распаковываем архив на жесткий диск и открываем файл "twittar.php".
3. Выделив все его содержимое, вставляем в относящийся к блогу файл "functions.php".
4. Последним шагом открываем файл "comments.php" и находим loop комментариев.
5. Вставляем в loop следующую строку:

<?php twittar('45', 'default.png', '#e9e9e9', 'twitavatars', 1, 'G'); ?>

Анализ кода. Пару месяцев назад на Smashing Magazine www.smashingmagazine.com был представлен потрясающий программный модуль Twittar, служащий для включения аватаров Twitter в блоги WordPress. Получив огромное количество откликов от читателей WpRecipes.com, я решил превратить программный модуль во фрагмент кода — для тех, кому так удобнее.

Само собой, желающие могут просто установить надстройку вместо редактирования содержимого файла "function.php" — выбор исключительно за вами.

5. Выделяем стилем комментарии автора

Выделяем стилем комментарии автора
Проблема. В записях с большим количеством комментариев не всегда легко обнаружить комментарии и ответы автора, особенно если в блоге отсутствует реализованная в WordPress 2.7 функция древовидных комментариев "Threaded Comments". Но выход все же есть: выделим комментарии автора другим стилем — и читатели быстро найдут все ваши ответы.

Решение.
1. Откройте файл "comments.php" и найдите loop комментариев:

<?php foreach comment as $comment) { ?>

2. После этой строки вставьте следующий фрагмент:

<?php
$isByAuthor = false;
if($comment->comment_author_email == get_the_author_email()) {
$isByAuthor = true;
}
?>

3. Затем отыщите в коде строку, представляющую комментарии (она может быть разной в зависимости от темы):

<li class="<?php echo $oddcomment; ?>" id="comment-<?php comment_ID() ?>">

4. Теперь нужно вывести класс "authorcomment" для комментариев автора:

<li class="<?php echo $oddcomment; ?> <?php if($isByAuthor ) {
echo 'authorcomment';} ?>" id="comment-<?php comment_ID() ?>">

5. Осталось создать для комментариев автора класс CSS. Откройте файл "style.css" и вставьте в него фрагмент кода. Цвета из примера замените по своему усмотрению:

.authorcomment{
color:#fff;
font-weight:bold;
background:#068;
}

Анализ кода. Принцип действия предложенного кода основан на сопоставлении адресов электронной почты комментирующих записи с адресом автора. При совпадении "$isByAuthor" устанавливается на "true". При выводе комментариев на экран проверяется величина "$isByAuthor". При возврате значения "true" к контейнеру добавляется класс "authorcomment".

В версии WordPress 2.7 и выше эту задачу выполнить проще: достаточно внести класс "comment_class();" в DIV комментария, что автоматически добавит класс "bypostauthor" в случае комментариев к собственным записям (отдельная благодарность Nima!).

6. Выводим общее количество комментариев и среднее на запись

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

Решение.

<?php
$count_posts = wp_count_posts();
$posts = $count_posts->publish;

$count_comments = get_comment_count();
$comments  = $count_comments['approved'];

echo "There's a total of ".$comments." comments on my blog, with an average ".round($comments/$posts)." comments per post.";
?>

Анализ кода. Существующие в версии 2.5 функции "wp_count_posts()" и "get_comment_count()" позволяют легко получить, соответственно, общее количество записей и комментариев по блогу WordPress. Чтобы вычислить среднее число комментариев к записи, достаточно элементарных арифметических действий и функции "PHP round()", которая обеспечит нам целочисленное значение.

7. Отображаем n-ное количество последних комментариев

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

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

<?php
$pre_HTML ="";
$post_HTML ="";
global $wpdb;
$sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url, SUBSTRING(comment_content,1,30) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT 10";

$comments = $wpdb->get_results($sql);
$output = $pre_HTML;
$output .= "\n<ul>";
foreach ($comments as $comment) {
$output .= "\n<li>".strip_tags($comment->comment_author) .":" . "<a href=\"" . get_permalink($comment->ID)."#comment-" . $comment->comment_ID . "\" title=\"on ".$comment->post_title . "\">" . strip_tags($comment->com_excerpt)."</a></li>";
}
$output .= "\n</ul>";
$output .= $post_HTML;
echo $output;
?>

Анализ кода. Здесь мы тоже применим объект "$wpdb", но на этот раз вкупе с методом "get_results()". После получения комментариев из базы данных WordPress воспользуемся loop'ом "for" для их компоновки в неупорядоченный HTML-список. Инициализированные в верхней части фрагмента переменные "$pre_HTML" и "$post_HTML" определяют, какое содержимое идет до и после списка комментариев.

8. Избежать спама в комментариях — просто

Избежать спама в комментариях — просто
Проблема. Спам в комментариях — общая головная боль. Akismet — неплохое решение, но почему бы сразу не блокировать спамеров вместо того, чтобы помечать подозрительные сообщения? Предлагаемый код ищет заголовок запроса HTTP referrer (страницу, откуда пришел запрос) и автоматически блокирует комментарий, если она некорректна или не определена.

Решение. В файл "functions.php" вставьте приведенный ниже код:

function check_referrer() {
if (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] == “”) {
wp_die( __('Please enable referrers in your browser, or, if you\'re a spammer, bugger off!') );
}
}

add_action('check_comment_flood', 'check_referrer');

Вот, собственно, и все. Сохранив файл, выводим блог на новый уровень защиты от спама.

Анализ кода. Код автоматически отклоняет запросы на публикацию комментариев, исходящие от браузера (обычно бота) без заголовка запроса HTTP referrer. Проверка выполняется с помощью массива "PHP $_SERVER[]". Если заголовок не определен или неверен, вызывается функция "wp_die", и выполнение сценария прекращается.

Данная функция привязывается к реализованной в WordPress функции "check_comment_flood()". Таким образом, мы может быть уверены, что обращение к функции "check_referrer()" будет выполняться при каждой публикации комментария.

9. Поддерживаем совместимость WordPress с версиями ниже 2.7

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

Решение. Для этой цели понадобится два файла. Первый — файл с поддерживаемыми WordPress 2.7 комментариями "comments.php". Второй — шаблон комментариев для более ранних версий WordPress "legacy.comments.php". Оба файла будут храниться в папке с темой.

В файл "functions.php" добавьте представленный ниже код:

<?php
add_filter('comments_template', 'legacy_comments');

function legacy_comments($file) {
if(!function_exists('wp_list_comments')) : // WP 2.7-only check
$file = TEMPLATEPATH.'/legacy.comments.php';
endif;
return $file;
}
?>

Анализ кода. Данный код создает функцию "legacy_comments()", привязанную к стандартной функции "comments_template". При каждом обращении WordPress к "comments_template()" будет исполняться наша функция "legacy_comments()". В отсутствие функции "wp_list_comments()" код автоматически загружает "legacy.comments.php" вместо "comments.php".

10. Выводим записи с наибольшим числом комментариев за определенное время

Выводим записи с наибольшим числом комментариев за определенное время
Проблема. Количество комментариев — отличный способ измерить популярность блога, а также удачный фильтр для вывода списка самых популярных записей. Неплохо было бы ограничить самые популярные записи конкретным периодом времени, например, отобразив список самых-самых за прошлый месяц.

Решение. Просто вставьте предложенный код туда, где хотите вывести список самых популярных записей. Не забудьте поменять даты в строке 3 на актуальные для вас.

<ul>
<?php
$result = $wpdb->get_results("SELECT comment_count,ID,post_title, post_date FROM $wpdb->posts WHERE post_date BETWEEN '2009-01-01' AND '2009-02-01' ORDER BY comment_count DESC LIMIT 0 , 10");

foreach ($result as $topten) {
$postid = $topten->ID;
$title = $topten->post_title;
$commentcount = $topten->comment_count;
if ($commentcount != 0) {
?>
<li><a href="<?php echo get_permalink($postid); ?>"><?php echo $title ?></a></li>
<?php }
}
?>
</ul>

Анализ кода. Первым делом отправляем SQL-запрос базе данных WordPress посредством объекта "$wpdb". Получив результаты, используем простой PHP-оператор "foreach" для вывода самых популярных записей за определенный период в виде неупорядоченного HTML-списка.

Оригинал статьи: 10 Handy WordPress Comments Hacks

Предыдущие записи из рубрики `Настройка WordPress`

25 комментариев

wp-admin, 28.07.2009 в 14:34

Я как знал, что не стоит мне за эту статью браться 🙂

ОтветитьОтветить
Deimos, 28.07.2009 в 14:41

Привет Дмитрий, а в итоге взялся или нет? Хорошая статья, я из нее два способа подчерпнул 😉

ОтветитьОтветить
web 2.0 portal, 29.07.2009 в 12:56

Действительно интересно. Но как я погляжу, в своем блоге вы эти способы не используете. Или используете, но не все? Я лично кнопку "спам" не нашел 🙂

ОтветитьОтветить
Deimos, 29.07.2009 в 13:32

Ну почему не использую, часть использую - выделяю цветом админа, вывожу последние комментарии, а кнопка "спам" и "удалить" видна только админу.

ОтветитьОтветить
Олегыч, 30.07.2009 в 13:56

Привет! Подскажи пожалуйста куда вставлять все эти коды, просто я только начинаю разбираться с WordPressом 🙂 Где находятся файлы functions.php и comments.php? И можешь ли помочь с настройкой блога за $ деньги (поправить шаблон, настроить пару плагинов)?

ОтветитьОтветить
Deimos, 30.07.2009 в 14:16

Олегыч привет! Файлы functions.php и comments.php находятся в папке Вашей темы. Если их нету, то надо создать!
По поводу настройки блога за $ - конечно могу, стучи в асю, обсудим подробности 😉

ОтветитьОтветить
alexpts, 01.08.2009 в 11:14

4 пункт по-моему для всех бесполезен, родные gravatar`ы все блоггеры использует. А твиттер аватары, если только для галочки делать. Что, думаю, многим лень.

ОтветитьОтветить
Saenkos, 05.08.2009 в 21:55

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

ОтветитьОтветить
Deimos, 06.08.2009 в 10:04

Saenkos, если честно я не понял что надо сделать, можете более подробно объяснить чего надо достичь?!

ОтветитьОтветить
Saenkos, 07.08.2009 в 09:53

попытаюсь по понятнее...

Если кликнуть по моему логину "Saenkos" в коментарии от 05.08.2009 в 21:55, то вы автоматически перейдёте по ссылке на сайт, который я указывал в при добавлении коментария.

Можно ли убрать эту ссылку или заменить все ссылки в коментариях на один адрес например http://www.wp-info.ru.

Если плагин, чтобы это делась автоматически?

ОтветитьОтветить
Инструменты СЕО, 17.08.2009 в 14:58

Попробую ответить на вопрос Saenkos. Чтоб удалить ссылку из ника комментатора, найдите в файле comments.php такие строки:

<a id="commentauthor-" href="" rel="external nofollow">

Теперь замените href="" на href="ваш_урл" или href=""

Но и у меня есть вопрос к автору поста. Как удалить поле "Ваш адрес", чтоб комментатор просто не мог вбить свою ссылку, когда заполняет логин/емейл.

ОтветитьОтветить
Deimos, 17.08.2009 в 15:03

{Инструменты СЕО}, дак в этом же файле (comments.php) уберите строку похожую на эту -
<input type="text" name="url" id="url" value="">, если не получится то киньте в обратную связь Ваш шаблон, я посмотрю!

ОтветитьОтветить
Алешка, 07.09.2009 в 14:03

вопрос по поводу 7 пункта. хочу сделать на сайте страничку, на которой все пользователи могут просматривать все ( со всех страниц/постов) последние комментарии ( последние 20 или за последние 2 дня). попробовал вставить предложенный код в запись/страницу - нужного эффекта не увидел ;(
может, что не так сделал? объясните причину моей неудачи?
З.Ы. использую WP 2/8/3

ОтветитьОтветить
Deimos, 07.09.2009 в 16:10

Алешка, вставляли то в шаблон или прямо в страницу через админку? Вставлять надо в шаблон (Если не знаете как - напишите, обьясню подробнее). Проверю работоспособность кода вечером, но на первый взгляд должен работать!

ОтветитьОтветить
MrBoris, 06.10.2009 в 15:26

Что-то я не догнал, что нужно изменить

В версии WordPress 2.7 и выше эту задачу выполнить проще: достаточно внести класс "comment_class();" в DIV комментария, что автоматически добавит класс "bypostauthor" в случае комментариев к собственным записям (отдельная благодарность Nima!).

У меня версия старше 2.7 что я должен сделать для подсветки комментариев?

ОтветитьОтветить
Deimos, 08.10.2009 в 13:01

MrBoris, сделать все что описано в пятом пункте. Хотя я на 2.8.х не проверял, но по идее должно работать 😉

ОтветитьОтветить
Olga, 28.11.2009 в 10:12

Всё сделала по выделению комментов автора, как описано, но у меня ничего не сработало! Где могла ошибиться? И подскажите,может есть плагин с такой функцией , что бы не менять HTML?

ОтветитьОтветить
Deimos, 01.12.2009 в 10:16

Olga, плагина не знаю, на счет того где ошибка сказать трудно - надо смотреть!

ОтветитьОтветить
kama, 21.03.2010 в 23:35

8. Избежать спама в комментариях — просто
Идея просто шикарная, но если читатель пришел по ссылки с другого ресурса или. То откомментить он не сможет до тех пор пока не перейдет на другую страницу сайта и вернется обратно. Её б маленько доработать 🙂

ОтветитьОтветить
Максим, 08.08.2013 в 21:59

Deimos, Добрый день! Насчет 5 пункта: как мне быть, если нет такой строки в файле comments.php:

<?php foreach comment as $comment) { ?>
ОтветитьОтветить

Комментировать