29 июля 2009

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

Чулан
Перевод
Автор оригинала: SmashingMagazine
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
Перевод статьи: 10 полезных приемов по работе с комментариями в WordPress
Теги:wordpressкомментариисоветы и рекомендации
Хабы: Чулан
+7
640 29
Комментарии 14
Похожие публикации
Middle WordPress Developer
от 80 000 до 100 000 ₽rgbcodeМожно удаленно
Full-stack Web Developer (REMOTE)
от 2 000 $AXE-WEBМожно удаленно
Full-Stack Web Developer
от 50 000 до 200 000 ₽RapidWeb.meМожно удаленно
PHP Developer (удаленно)
от 100 000 ₽HelastelМожно удаленно
Unity-разработчик на VR- и AR-проекты
от 60 000 ₽JetStyleЕкатеринбургМожно удаленно
Лучшие публикации за сутки