Виджет TOP комментаторов

Приветствую! Сегодня рассмотрим возможности реализации такой фишки, как создание виджета самых активных комментаторов блога. Для чего он нужен? Данный блок удобно использовать при проведении конкурса комменаторов на блоге, чтобы каждый посетитель наглядно видел, кто лидирует. С другой стороны он положительно повлияет на привлечение на блог новых комментаторов, поскольку присутствие фотографии и ссылки на сайт комментаторов не только работает на удовлетворение их самолюбия (прятно ж полюбоваться на свою аватарку, красующуюся на всех страницах популярного блога), но и на реальное увеличение трафика на их сайты, так как если этот блок находится на всех страницах сайта, то на блоги присутствующих в этом виджете людей резко увеличится приток посетителей.

Список активных комментаторов за месяц

Наиболее простой способ организовать на своем блоге список ТОП комментаторов за определенный отрезок времени — установить плагин TOP Commentators Widget. Устанавливаем его и активируем. Далее нам надо зайти не как обычно в раздел управление настройками в меню «Параметры», а непосредственно в сами виджеты, где мы его активируем, вставив в сайдбар. И прямо здесь появятся его настройки.

TOP Сommentators Widget

Давайте посмотрим, что означают основные из них.

Reset period every — здесь выставлете тот период, за который вы будете вести свой топ. Для определения лучшего комменатора месяца выберите «Month»
Limit number of names to — количество выводимых в списке комментаторов
Limit characters in names to — ограничение на количество букв в имени
Remarks for blank list — сообщение, которое будет появлться, если еще никто не оставил комментария
Filter the following full/partial URLs и Filter the following full/partial Emails — не отображать в списке людей с определенным адресом сайта или email
Display list as — стиль отображения — с нумерацией или без
Open each link in a new window? — открывать ссылки в новом окне
NoFollow each name if hyperlinked? — добавлять к ссылкам на сайты параметр nofollow
Show number of comments for each commenter? — показывать количество оставленных отзывов для каждого участника
Show in home page only? — показывать виджет только на главной странице
Display only commentors with URL? — отображать только тех пользователей, которые указали адрес на свой сайт
Display Gravatar? — показывать граватар участника топа
Use the following default Gravatar — его размер и картинка по умолчанию

Настраиваем все эти параметры и получаем результат, похожий на тот, что на моем блоге:





Виджет лучших комментаторов месяца

Лучшие комментаторы без плагина

Есть возможность организовать тоже самое и без установки дополнительных плагинов. Правда, для гибких настроек придется самостоятельно править код, но все основное сделать достаточно просто.

Открываем файл functions.php и добавляем следующий кусок:

//ТОП КОММЕНТАТОРОВ

function top_commentator(){
global $wpdb;

$month = true;
$nofollow = true;
$count = 6;
$col = 2;
$avatarSize = 60;
$exceptionEmail = 'wpotvet@gmail.com';

$results = $wpdb->get_results('
SELECT
COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
FROM
(select * from '.$wpdb->comments.' order by comment_ID desc) as pc
WHERE
comment_author_email != "" AND
comment_type = "" AND
comment_approved = 1 AND
comment_author_email NOT IN ('.preg_replace('/([\w\d\.\-_]+@[\w\d\.\-_]+)(,? ?)/','"\\1"\\2',$exceptionEmail).')'.
($month ? 'AND month(comment_date) = month(now()) AND year(comment_date) = year(now())' : '').
'GROUP BY
comment_author_email
ORDER BY
comments_count DESC
LIMIT '.$count
);
$output = "<div class='top-comment'><table width='100%'><tr align='center' valign='top'>";
$i = 0;
foreach($results as $result){
if ($i>=$col) {
$output .= "</tr><tr align='center' valign='top'>";
$i = 0;
}
$i++;
$output .= "<td><div class='avatar-top'>".get_avatar($result->comment_author_email,$avatarSize)."</div><div class='avatar-comment'>";
if ($result->comment_author_url)
if ($nofollow)
$output .= "<a target='_blank' rel='nofollow' href='".$result->comment_author_url."'>".$result->comment_author."</a>";
else
$output .= "<a target='_blank' href='".$result->comment_author_url."'>".$result->comment_author."</a>";
else
$output .= $result->comment_author;
if ($comment) $output .= " (".$result->comments_count.")";
$output .= "<div style='clear:both;'></div></div></td>";
}
if ($i<=$col) $output .= "</tr>";
$output .= "</table></div>";
echo $output;
}

Теперь посмотрим, что здесь можно поменять.

$month = true; — этот код отвечает за то, за какой период будет выводиться список. Если написано «true», то будет выводиться ТОП самых активных за месяц, если «false», то за все время.
$nofollow = true; — даем команду поисковикам не следовать по ссылкам
$count = 6; — задаем количество отображаемых людей в списке
$col = 2; — количество колонок, в которые будут группироваться посетители
$avatarSize = 60; — размер аватара
$exceptionEmail = ‘wpotvet@gmail.com’; — email, владелец которого будет исключаться из списка. Например, сюда можете написать почту администратора сайта, чтобы он не участвовал в рейтинге.

После того, как все прописали, добавляем использованные классы стилей в файл style.css. Их также можно изменить на свой вкус:

.top-comment{height:100%;}
.top-comment table{min-height:100%;height:100%;border:none;}
.top-comment table td{padding:0 5px 15px 5px;border:none}
.top-comment .avatar-top img{-webkit-box-shadow:#666 0px 2px 3px;-moz-box-shadow:#666 0px 2px 3px;box-shadow:#666 0px 2px 3px;padding:3px;background:white;border-image:initial;border:1px solid #aaa;margin:0 0 3px 0;}
.top-comment .avatar-comment{font-size:12px;display:block;line-height:1em;margin-top:1px;width:50px}

И наконец, добавляем в новый виджет при активированном плагине вставке PHP кода или напрямую в sidebar.php код, выводящий данный список TOP комментаторов на странице:

<center><?php top_commentator(); ?>

Виджет комментаторов

Аналогичный пример, но уже с выводом количества комментариев, оставленных каждым участником:

function sp_top_commentator(){
global $wpdb;
$length = 0;        // Максимальная длинна имени в символах, если стоит 0, то имя не обрезается
$month = true;     // true - за текущий месяц, false - за все время
$comment = true;    // показывать количество комментариев
$nofollow = true;   // ссылки nofollow
$count = 9;        // количество комментаторов
$col = 3;       // количество колонок
$avatarSize = 40;   // размер аватара
$exceptionEmail = 'wpotvet@gmail.com'; // мыла-исключения
$results = $wpdb->get_results('
SELECT COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url FROM (select * from '.$wpdb->comments.' order by comment_ID desc) as pc WHERE
comment_author_email != "" AND
comment_type = "" AND
comment_approved = 1 AND
comment_author_email NOT IN ('.preg_replace('/([\w\d\.\-_]+@[\w\d\.\-_]+)(,? ?)/','"\\1"\\2',$exceptionEmail).')'.
($month ? 'AND month(comment_date) = month(now()) AND year(comment_date) = year(now())' : '').
'GROUP BY comment_author_email ORDER BY comments_count DESC LIMIT '.$count );

$output = "<div class='top-comment'><table width='100%'><tr align='center' valign='top'>";
$i = 0;
foreach($results as $result){
if ($i>=$col) {
$output .= "</tr><tr align='center' valign='top'>";
$i = 0;
}
$i++;
$output .= "<td><div class='avatar-top'>".get_avatar($result->comment_author_email,$avatarSize)."</div><div class='avatar-comment'>";
if ($length and $length<mb_strlen($result->comment_author)) $result->comment_author = trim(mb_substr($result->comment_author, 0, $length)).'.';
if ($result->comment_author_url)
if ($nofollow)
$output .= "<a target='_blank' rel='nofollow' href='".$result->comment_author_url."'>".$result->comment_author."</a>";
else
$output .= "<a target='_blank' href='".$result->comment_author_url."'>".$result->comment_author."</a>";
else
$output .= $result->comment_author;
if ($comment) $output .= "(".$result->comments_count.")";
$output .= "<div style='clear:both;'></div></div></td>";
}
if ($i<=$col) $output .= "</tr>";
$output .= "</table></div>";
echo $output;
}

И для вставки в виджет с выводом результатов:

<?php sp_top_commentator(); ?>

ТОП комментаторов — победителей конкурса

Еще один похожий пример — для тех, кто проводит конкурс на лучшего комментатора месяца, полезным будет такой блок, где будет отображаться победители за прошедший месяц. Делается это добавлением в файл функций кода

function sp_commentator_winners(){
    global $wpdb;
    $length = 0;        // Максимальная длинна имени в символах, если стоит 0, то имя не обрезается
    $comment = true;    // показывать количество комментариев
    $nofollow = true;   // ссылки nofollow
    $col = 3;           // количество колонок
    $avatarSize = 40;   // размер аватара
    $exceptionEmail = 'mail1@dom.ru, mail2@mod.ru'; // мыла-исключения
    $countWinners = 3;  // количество победителей      
        
    $results = $wpdb->get_results('
        SELECT
            COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
        FROM
            (select * from '.$wpdb->comments.' order by comment_ID desc) as pc
        WHERE
            comment_author_email != "" AND
            comment_type = "" AND
            comment_approved = 1 AND
            comment_author_email NOT IN ('.preg_replace('/([\w\d\.\-_]+@[\w\d\.\-_]+)(,? ?)/','"\\1"\\2',$exceptionEmail).') AND
            month(comment_date) = month(now() - interval 1 month)
        GROUP BY
            comment_author_email
        ORDER BY
            comments_count DESC
        LIMIT '.$countWinners
    );
            
    $output = "<div class='top-comment'><table width='100%'><tr>";
    $i = 0;
    foreach($results as $result){
        if ($i>=$col) {
            $output .= "</tr><tr>";
            $i = 0;
        }
        $i++;
        $output .= "<td><div class='avatar-top'>".get_avatar($result->comment_author_email,$avatarSize)."</div><div class='avatar-comment'>";
        if ($length and $length<mb_strlen($result->comment_author)) $result->comment_author = trim(mb_substr($result->comment_author, 0, $length)).'.';
        if ($result->comment_author_url)
            if ($nofollow)
                $output .= "<a target='_blank' rel='nofollow' href='".$result->comment_author_url."'>".$result->comment_author."</a>";
            else
                $output .= "<a target='_blank' href='".$result->comment_author_url."'>".$result->comment_author."</a>";
        else
            $output .= $result->comment_author;
if ($comment) $output .= "(".$result->comments_count.")"; $output .= "<div style='clear:both;'></div></div></td>"; } if ($i<=$col) $output .= "</tr>"; $output .= "</table></div>"; echo $output; }

и в виджете выводим при помощи:

<?php sp_commentator_winners(); ?>

Наконец, последний пример — для объединения топа + если идет начало месяца, будет показываться список лучших комментаторов прошедшего месяца.

function sp_top_commentator_winners(){
    global $wpdb;
    $length = 0;        // Максимальная длинна имени в символах, если стоит 0, то имя не обрезается
    $month = false;     // true - за текущий месяц, false - за все время
    $comment = true;    // показывать количество комментариев
    $nofollow = true;   // ссылки nofollow
    $count = 12;        // количество комментаторов
    $col = 3;       // количество колонок
    $avatarSize = 40;   // размер аватара
    $exceptionEmail = 'mail1@dom.ru, mail2@mod.ru'; // мыла-исключения
    
    $showWinners = true;    // показывать победителей
    $countWinners = 3;  // количество победителей
    $showDays = 3;      // количество дней, которое показываются победители
    $separator = '<hr style="display:block;">'; // разделитель ТОПа и победителей
    
    $results = $wpdb->get_results('
        SELECT
            COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
        FROM
            (select * from '.$wpdb->comments.' order by comment_ID desc) as pc
        WHERE
            comment_author_email != "" AND
            comment_type = "" AND
            comment_approved = 1 AND
            comment_author_email NOT IN ('.preg_replace('/([\w\d\.\-_]+@[\w\d\.\-_]+)(,? ?)/','"\\1"\\2',$exceptionEmail).')'.
            ($month ? 'AND month(comment_date) = month(now()) AND year(comment_date) = year(now())' : '').
        'GROUP BY
            comment_author_email
        ORDER BY
            comments_count DESC
        LIMIT '.$count
    );

    $firstIteration = true; // отвечает за то чтобы было всего две итерации
    do {
        $output = "<div class='top-comment'><table width='100%'><tr>";
        $i = 0;
        foreach($results as $result){
            if ($i>=$col) {
                $output .= "</tr><tr>";
                $i = 0;
            }
            $i++;
            $output .= "<td><div class='avatar-top'>".get_avatar($result->comment_author_email,$avatarSize)."</div><div class='avatar-comment'>";
            if ($length and $length<mb_strlen($result->comment_author)) $result->comment_author = trim(mb_substr($result->comment_author, 0, $length)).'.';
            if ($result->comment_author_url)
                if ($nofollow)
                    $output .= "<a target='_blank' rel='nofollow' href='".$result->comment_author_url."'>".$result->comment_author."</a>";
                else
                    $output .= "<a target='_blank' href='".$result->comment_author_url."'>".$result->comment_author."</a>";
            else
                $output .= $result->comment_author;

            if ($comment) $output .= "(".$result->comments_count.")";
            $output .= "<div style='clear:both;'></div></div></td>";
        }
        if ($i<=$col) $output .= "</tr>";
        $output .= "</table></div>";
        echo $output;
        
        if ($showWinners and date('j') <= $showDays and $firstIteration) {
            $results = $wpdb->get_results('
                SELECT
                    COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
                FROM
                    (select * from '.$wpdb->comments.' order by comment_ID desc) as pc
                WHERE
                    comment_author_email != "" AND
                    comment_type = "" AND
                    comment_approved = 1 AND
                    comment_author_email NOT IN ('.preg_replace('/([\w\d\.\-_]+@[\w\d\.\-_]+)(,? ?)/','"\\1"\\2',$exceptionEmail).') AND
                    month(comment_date) = month(now() - interval 1 month)
                GROUP BY
                    comment_author_email
                ORDER BY
                    comments_count DESC
                LIMIT '.$countWinners
            );
            echo $separator;
            $firstIteration = false;
        } else {
            $showWinners = false;
        }
    } while($showWinners);
}

и

<?php sp_top_commentator_winners(); ?>

За разработку кода спасибо автору сайта paperplane.su

Поделись этой статьей с друзьями!

Это будет интересно прочитать:

Комментариев: 23

  • Спасибо большое за статью!
    Я давно искала такой плагин, чтобы установить к себе на сайт.
    Сайт молодой и мне еще надо многому учиться.

  • Спасибо за полезную информацию. И у меня сразу впорос. Вот Вы каждый раз, когда пишите о новом функционале, приводите варианты с плагином и без. И сразу возникает вопрос зачем? То есть какое принципиальное отличие варианта с плагином от варианта с кодом?

    • Спасибо! Отличие в том, что плагин может делать дополнительные запросы в БД и кушать ресурсы, в то время как прямая вставка кода в движок это исключает. Но зато плагин легче новичку настроить из админки

      • Разве вставка не делает запросы в базу? Любому коду нужны данные, чтобы выдать какой либо результат. И плагин — это по сути тоже код, только с некоторыми дополнениями. Или я ошибаюсь?

        • Зависит от плагина. Плюс у плагина есть еще админка, которая также потребляет русурсы

  • Отличный пост. Самое главное, что все прекрасно работает. Правда. отображение комментаторов виджете изменяется в зависимости от стилей самой темы.

  • Александр. Единственное, что хотелось бы добавить в скрипт — это отображение количество оставленных комментариев. Не подскажите, как это реализовать?

    • Для этого используйте такой скрипт:
      function sp_top_commentator(){

      global $wpdb;

      $length = 0; // Максимальная длинна имени в символах, если стоит 0, то имя не обрезается

      $month = true; // true - за текущий месяц, false - за все время

      $comment = true; // показывать количество комментариев

      $nofollow = true; // ссылки nofollow

      $count = 9; // количество комментаторов

      $col = 3; // количество колонок

      $avatarSize = 40; // размер аватара

      $exceptionEmail = 'wpotvet@gmail.com'; // мыла-исключения

      $results = $wpdb->get_results('

      SELECT

      COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url

      FROM

      (select * from '.$wpdb->comments.' order by comment_ID desc) as pc

      WHERE

      comment_author_email != "" AND

      comment_type = "" AND

      comment_approved = 1 AND

      comment_author_email NOT IN ('.preg_replace('/([\w\d\.\-_]+@[\w\d\.\-_]+)(,? ?)/','"\\1"\\2',$exceptionEmail).')'.

      ($month ? 'AND month(comment_date) = month(now()) AND year(comment_date) = year(now())' : '').

      'GROUP BY

      comment_author_email

      ORDER BY

      comments_count DESC

      LIMIT '.$count

      );

      $output = "

      ";

      $i = 0;

      foreach($results as $result){

      if ($i>=$col) {

      $output .= "

      ";

      $i = 0;

      }

      $i++;

      $output .= "

      ";

      }

      if ($i< =$col) $output .= "

      ";

      $output .= "

      ".get_avatar($result->comment_author_email,$avatarSize)."
      ";

      if ($length and $lengthcomment_author)) $result->comment_author = trim(mb_substr($result->comment_author, 0, $length)).'.';

      if ($result->comment_author_url)

      if ($nofollow)

      $output .= "".$result->comment_author."";

      else

      $output .= "".$result->comment_author."";

      else

      $output .= $result->comment_author;

      if ($comment) $output .= "(".$result->comments_count.")";

      $output .= "

      ";

      echo $output;

      }

      Вставка в виджет:
      < ?php sp_top_commentator(); ?>

    • 🙂 короче установить не смог, и поставил плагин,

      К сожалению Вы не совсем точно указали куда этот код установить в функшионе? я поставил наверх перед <?php и вышли крякозябрики, ставил и внизу и в середине и не пашет. когда поставил в середине кряков не было, но и не работал. может у меня тема не подходит, возможно ли такое?

      • и еще у меня вопрос. Я в настройках в плагине комментарии убрал админ, и свое имя. теперь если напишет с именем Марат то в топ не будут выходить? Спасибо заранее!

        • Да, не будут появляться пользователи, которые указали при отправке комментов те имена, которые вы задали в этих настройках

      • Вставлять код надо после < ?php, если делать все точно по инструкции, то должно работать, у меня работает. Возможно, в вашем шаблоне уже какие-то функции есть, либо какие-то установленые плагины, которые ему мешают работать

    • Блин надеюсь Мараты не будут писать комменты, а то еще огорчатся, скажут сколько писали и нет в топе 🙂

Добавить комментарий