Сбор количества комментариев с виджета 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

Комментарии

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

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

Описание мета-тегов
В статье представлены все самые встречающеюся мета-теги с примерами и пояснениями их использования.
17.01.2018
4412
0
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
29.11.2017
20803
+8
Бот Телеграм на PHP
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
17.11.2018
25752
+12
Пример парсинга html-страницы на phpQuery
phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют...
18.03.2020
1851
+2
Формирование файла sitemap.xml
Пример создания файла карты сайта (sitemap.xml) на PHP. Интеграция его на сайт и подключение его в robots.txt
19.11.2016
4185
+1
Получить фото из Instagram без API
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и...
13.12.2019
3618
+4