Добавляем уведомления виджету комментариев VK

Есть такая замечательная штука как виджет комментариев VK для сайтов. И у меня на сайте он есть наравне с обычными комментариями. Но есть у виджета и очень большой минус: уведомления о комментариях администратору никуда не приходят и для того чтобы их посмотреть нужно заходить на любую страницу сайта и нажимать ссылку «Администрирование».

Это не очень удобно. Именно поэтому я очень редко отвечал посетителям на комментарии в этом виджете, так как просто не знал об их появлении.

Но теперь всё изменится! Давайте сделаем уведомления на электронную почту о новых комментариях в виджете.

На самом деле всё просто. При отправке комментария виджет передаёт событие widgets.comments.new_comment. Подпишемся на это событие и выполним свой код, а именно отправку сообщения на электронную почту.

Стандартный код для вставки виджета на страницу выглядит так:

<div id="vk_comments"></div>
<script type="text/javascript">
 VK.Widgets.Comments('vk_comments');
</script>

Изменим его, добавив подписку на событие, используя VK.Observer:

<div id="vk_comments"></div>
<script type="text/javascript">
VK.Widgets.Comments("vk_comments");
VK.Observer.subscribe("widgets.comments.new_comment", function f(num, last, date, hash)
{
  var xmlHttp = new XMLHttpRequest();
  var params = 'num=' + encodeURIComponent(num) + '&last=' + encodeURIComponent(last) + '&date=' + encodeURIComponent(date) + '&hash=' + encodeURIComponent(hash) + '&url=' + encodeURIComponent(window.location) + '&title=' + encodeURIComponent(document.title);
  xmlHttp.open( "GET", "http://example.com/commentnotify/notifyme.php?"+params, false );
  xmlHttp.send( null );
});
</script>

В восьмой строке замените имя домена на своё.

Итак, мы получили все необходимые данные и отправили их скрипту /commentnotify/notifyme.php . Напишем теперь его.

Для отправки сообщения на электронную почту используем PHPMailer:

<?php
  include("./config.php");
  include("./smtpmail.php");
  if ( (!isset($_GET['num'])) || (!isset($_GET['last'])) || (!isset($_GET['date'])) || (!isset($_GET['hash'])) || (!isset($_GET['url'])) || (!isset($_GET['title'])) )
  {
    die();
  }
  $num = urldecode($_GET['num']);
  $comment = urldecode($_GET['last']);
  $date = urldecode($_GET['date']);
  $hash = urldecode($_GET['hash']);
  $url = urldecode($_GET['url']);
  $title = urldecode($_GET['title']);
 
  smtpmail("username@example.com", 
    "Новый комментарий на вашем сайте", 
    "Кто-то оставил новый комментарий на вашем сайте в виджете VK.\nСтраница: $title\n$url\n\nТекст комментария:\n".$comment);
?>

В функции smtpmail необходимо прописать адрес, на который слать уведомления, заголовок письма и его текст.
Осталось указать настройки для SMTP сервера с которого мы будем отправлять сообщения. Это сделаем в файле config.php, звёздочки замените на свои данные:

<?php
$__smtp = array(
    "host" => "*****************", //smtp сервер
    "debug" => 0,                   //отображение информации дебаггера (0 - нет вообще)
    "auth" => true,                 //сервер требует авторизации
    "port" => 25,                    //порт (по-умолчанию - 25)
    "username" => "******************", //имя пользователя на сервере
    "password" => "******************", //пароль
    "addreply" => "******************", //ваш е-mail
    "replyto" => "******************" //e-mail ответа, будет указан в поле Reply-to
    //Обычно username, addreply и replyto - одно и то же, вида username@mailserver.ru
);
?>

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

Ну и на всякий случай отключим индексирование нашего файла в robots.txt:

Disallow: /commentnotify/*