Здравствуйте дорогие посетители! Довольно много времени прошло с того момента, как я пообещал написать статью на тему «ТОП комментаторов» естественно без использования плагинов. Но этот момент настал и вместо того чтобы долго и нудно лить воду предлагаю сразу приступить к делу.
Что умеет функция?
- задается максимальная длина имени
- выводит комментаторов за месяц или за все время (на выбор)
- показывает количество комментариев каждого пользователя (отключается)
- ссылки комментаторов follow или nofollow (на выбор)
- задается количество отображаемых комментаторов
- задается количество колонок комментаторов
- задается размер аватаров
- задаются в исключение E-mail адреса
Если вы проводите конкурсы, связанные с комментариями, вам также будут интересны следующие настройки функции:
- показывает победителей
- задается количество отображаемых победителей
- задается количество дней, сколько показывать победителей
- задается стиль разделителя ТОПа и Победителей
Плагинами я не пользовался, поэтому сравнивать не с чем. При создании блога старался работать с кодом, поскольку знал, что плагины делают большой вклад в замедление загрузки страниц. Думаю, вы знаете, что длительная загрузка страниц раздражает не только посетителей, но и поисковые системы.
Перед внесением изменений, рекомендую сделать резервную копию файлов.
Для начала проверьте, включено ли отображение аватаров на вашем блоге. Для этого проследуйте в панель администратора, «Параметры – Обсуждение», внизу, нужно отметить галочкой «Показывать аватары», если вы еще этого не сделали.
Предоставляю код (автор):
function sp_top_commentator_winners(){ global $wpdb; $length = 0; // Максимальная длинна имени в символах, если стоит 0, то имя не обрезается $month = false; // true - комментаторы за текущий месяц, false - за все время $comment = true; // Показывать количество комментариев? true - показывать, false - не показывать $nofollow = true; // Ссылки nofollow, true - да, false - нет $count = 12; // Количество отображаемых комментаторов $col = 3; // Количество колонок $avatarSize = 40; // Размер аватара в px $exceptionEmail = 'mail@mail.ru, mail2@mail.ru'; // исключить эти E-mail адреса из ТОПа $showWinners = true; // Показывать победителей? true - показывать, false - не показывать $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); }
Данный код нужно поместить в файл functions.php вашей темы, что можно сделать с помощью Notepad++ или через панель администратора «Внешний вид – Редактор», вставляйте в самый конец, перед ?>.
Далее нам нужно где-то показывать ТОП комментаторов. Для этого вставьте следующий код (например, в сайдбар или прямо в виджет WordPress):
<?php sp_top_commentator_winners(); ?>
Оформим наш ТОП с помощью CSS, на моем блоге такие стили (темный фон, закругленные края):
/* Топ комментаторов */ .top-comment { height:100%; } .top-comment table { min-height: 100%; height:100%; } .top-comment table td { padding:0 5px 15px 5px; } .top-comment .avatar-top img { -webkit-box-shadow: #666 0px 0px 5px; -moz-box-shadow: #666 0px 0px 5px; box-shadow: #666 0px 0px 5px; padding: 3px; background: black; border-image: initial; border: 1px solid #D0D0BB; border-radius: 5px 5px 5px 5px; margin: 5px 12px 2px 10px; } .top-comment .avatar-comment { font-size: 12px; margin: 0 0 -10px;
Белый фон, без закругления:
.top-comment { height:100%; } .top-comment table { min-height: 100%; height:100%; width:100%; } .top-comment table tr { text-align:center; vertical-align: top; } .top-comment table td { padding:0 5px 15px 5px; } .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 #D0D0BB; margin: 0 0 3px 0; } .top-comment .avatar-comment { font-size: 12px; }
Данный код вставляется в файл стилей (обычно это style.css или screen.css) в самый конец.
Надеюсь, что вам пригодиться данное решение ТОПа комментаторов без плагина, с помощью которого можно легко и не напрягаясь проводить конкурсы.
Новость! Сегодня получил письмо от хостера о том, что мой малопосещаемый и неприметный блог был подвергнут брут атаке подбора пароля. Приятно удивило, что среагировали ребята быстро и тутже сменили мне страницу логина, дабы избежать дальнейших атак! Честно скажу, давно собирался написать о хостинге, который я использую, но толи лень меня одолевала, толи не было стимула,… в общем, не пропустите мой отзыв о хостинге.
Сережа, не могу понять почему у меня не работает. Все сделала как ты описал. Только стиль не выбирала.
Все разобралась! Еще код для поддержки рHр в виджете добавила и все заработало! УРА!
Извините, что долго не отвечал, были проблемы с Интернетом 🙂 Вы и сами успели справиться 🙂
Случайно зашол на ваш блог. Сначала просмотрел и закрыл, а потом искал решение проблемы с виджетами и вспомнил, что видел здесь. Внимательно почитал и оказалось что тут полно полезностей! Спасибо!! В сочетании с php в виджете все отлично работает! Ура!! 😆 😀 😎 😯
Пожалуйста 🙂
Спасибо,Сергей за актуальную тему! А то плагин ТОП комментаторов сам не закрывает ссылки сайтов комментаторов и в результате может появиться переспам (как то на себе убедилась) 😕 И ноиндекс от этого не очень то помогает, кодом всегда надежнее,да лишний плагин не придется ставить 🙂
Пожалуйста 🙂 Я тоже не люблю плагины, которые, кроме основной функции выполняют еще 10 ненужных 🙂
Здравствуйте. Не могли бы Вы объяснить как работает данный код, если я буду проводить конкурс комментаторов. Вот я его поставил на свой блог. Комментарии уже какие-то есть и уже имеются топ комментаторы. Но когда я начну проводить конкурс, что мне нужно будет сделать? Ведь потребуется как-то сделать, чтобы на время конкурса счетчик обнулился или как?
Не совсем могу понять, как проводить конкурсы с помощью данного кода)
Спасибо!
Наверное, вы не обратили внимание на сам код, в котором есть пояснения:
$month = false; // true — комментаторы за текущий месяц, false — за все время
$count = 12; // Количество отображаемых комментаторов
$showWinners = true; // Показывать победителей? true — показывать, false — не показывать
$countWinners = 3; // Количество победителей
$showDays = 3; // Количество дней, которое показываются победители
То есть, если вы включили показ победителей, то 1 числа следующего месяца будут показаны победители (число победителей выставляется) и также задается количество дней, сколько будут показываться победители (по умолчанию я поставил 3 дня, то есть с 1 по 3 число нового месяца). Победители обнуляются автоматически.
Я видел этот код. Мне просто было непонятно как происходит отбор победителей. Оказывается все на автомате. Спасибо)
Пожалуйста 🙂
Сережа, У меня в конце месяца победитель показывается снизу после всех комментаторов. А у тебя в блоге наоборот. Подскажи, где и что нужно поменять
Код один и тот же, если вы не вносили изменения, то все должно быть, как у меня. 🙂 А вообще, какая разница, сверху или снизу? 🙂 В основном ставят отображение победителей на пару дней, и это скорее для вас, для того, чтобы не следить за количеством комментариев посетителей.
Здравствуйте. А мне вот понравились как у вас на блоге реализованы комментарии. Скажите как сделать чтобы коментарии с классом «children», тоесть при ответе на комент, твой комент будет с классом «children» . как сделать так чтобы он был в отдельном блоке а не вложен в тот блок на который комент ответили.. тоесть как у вас на сайте? Я в Php не силен. потому для меня сложновато это все. Но буду очень признателен за подсказку!
Здравствуйте, Дмитрий. Не совсем понял ваш вопрос, вы хотите сделать древовидные (вложенные) комментарии? Эта функция является стандартной у WordPress и включается в админке, параметры — обсуждения.
Хочу древовидные но не вложенные.. чтобы блоки были раздельными как у вас… а не все в одном блоке как по стандарту.