Сбор количества комментариев с виджета VK

Если на сайте используется виджет комментариев 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>
HTML

Добавим обработчики событий методом 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>	
HTML

Скрипт 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));
}
PHP

Недостаток метода – первоначальные данные будут собираться при активности пользователей и займет достаточно долгое время.

18.09.2018, обновлено 26.11.2019

Комментарии

, чтобы добавить комментарий.

Другие публикации

Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
38341
+15
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
25901
+9
В статье представлены все самые встречающеюся мета-теги с примерами и пояснениями их использования.
5754
+1
Пример создания файла карты сайта (sitemap.xml) на PHP. Интеграция его на сайт и подключение его в robots.txt
6406
+1
phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют...
7124
+3
После регистрации в системе эквайринга Сбербанка и получив доступ к тестовой среде, можно приступить к интеграции с...
17717
+13