Если на сайте используется виджет комментариев VK, то со временем возникает потребность вывода количества комментариев на страницах категорий или для рейтинга обсуждаемых статей. Рассмотрим как это реализовать.
Страница виджета — vk.com/dev/Comments
Документация — vk.com/dev/widget_comments
Обычно код вставки виджета выглядит следующим образом:
<head>
<script type="text/javascript" src="https://vk.com/js/api/openapi.js?159"></script>
<head>
...
<script type="text/javascript">
VK.init({apiId: API_ID, onlyWidgets: true});
</script>
<div id="vk_comments"></div>
<script type="text/javascript">
VK.Widgets.Comments("vk_comments", {limit: 10, attach: "*"});
</script>
Добавим обработчики событий методом VK.Observer.subscribe()
:
widgets.comments.new_comment
— срабатывает при добавлении комментария,
widgets.comments.delete_comment
— при его удалении.
События возвращают:
num | Количество комментариев |
last_comment | Текст последнего комментария |
date | Текущая дата в формате 2018-09-12T17:20:00+00:00 |
sign | Md5 от конкатенации строк: api_secret, date, num, last_comment |
При срабатывании событий, полученное количество и ID статьи ($articles_id
) будут отправлены через AJAX на скрипт set_count_comments.php.
<script type="text/javascript">
VK.Widgets.Comments("vk_comments", {limit: 10, width: "", attach: "*"});
VK.Observer.subscribe("widgets.comments.new_comment", function f(num){
setCountComments(num);
});
VK.Observer.subscribe("widgets.comments.delete_comment", function f(num){
setCountComments(num);
});
function setCountComments(num){
$.ajax({
type: "GET",
url: "/set_count_comments.php",
data: {"num": num, "id": <?php echo $articles_id; ?>}
});
}
</script>
Скрипт set_count_comments.php получит и обновит данные в БД для каждой статьи по отдельности.
<?php
$id = intval($_GET['id']);
$num = intval($_GET['num']);
if (!empty($id)) {
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("UPDATE `articles` SET `comments` = :num WHERE `id` = :id");
$sth->execute(array('num' => $num, 'id' => $id));
}
Недостаток метода – первоначальные данные будут собираться при активности пользователей и займет достаточно долгое время.