JS/jQuery

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

Добавим обработчики событий:

widgets.comments.new_comment — срабатывает при добавлении комментария,
widgets.comments.delete_comment — при удалении.

Которые возвращают:

num количество комментариев
last_comment текст последнего комментария
date текущая дата в формате 2018-09-12T17:20:00+00:00
sign md5 от конкатенации строк: api_secretdatenumlast_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));
}

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

18 сентября 2018
Представленный код позволяет c помощью jQuery зафиксировать шапку таблицы при прокрутке страницы. Скрипт поддерживает...
В статье представлены способы зафиксировать блок при прокрутки страницы с примерами для горизонтального меню и баннера...