Боремось з підставними коментаторами

Припустимо, що у вас на сайті коментарі дозволені без премодерування і також гостями. Чому так? Ну хоча б тому, що ресурс часто відвідуваний і коментований. Тож модерувати всі вхідні коментарі просто нереально. Також припустимо, що ви хочете убезпечитись від відставних коментаторів – людей, що використовують імена чи ніки інших коментаторів і таким чином бажають видати їх за себе. Наприклад, у вас на сайті хороший відвідувач і коментатор з ніком Batman. Він пише якісні коментарі і зовсім не спамер. Аж раптом одного дня з’являється ворог нашого чудового коментатора і починає постити коментарі від імені Batman з провокативним, як мінімум, змістом. В особливо кепських випадках хуліган навіть використовує е-пошту справжнього візаві. Таким чином навіть модератору важко зрозуміти – чи то Batman став злим чи хтось хуліганить прикриваючись його іменем? 🙂

Я знаю! Треба перевірка імені автора і адреси е-пошти!

Все вірно, треба. Шкода, але серед стандартних функцій ВП така перевірка не передбачена. На щастя, ми можемо додати таку перевірку! Ось один з варіантів – створити власну функцію, що безпосередньо здійснюватиме перевірку і зробити так, щоб наша функція виконувалась у момент додавання коментаря на сайт. У цьому нам допоможе екшн pre_comment_on_post. Це не ідеальне рішення, оскільки потребує модифікування core файлів двигунця WordPress, проте інших, схоже, немає.

Трошки теорії. Екшн pre_comment_on_post зустрічається лише раз у файлах двигунця і лише у файлі wp-comments-post.php. Це єдиний екшн, що спрацьовує саме у потрібний момент. Нажаль не ідеальний, бо має лише один аргумент – ID поста, до якого додається допис. Загалом виглядає у коді ось так: do_action('pre_comment_on_post', $comment_post_ID); (ряд. 47). Не ідеальний тому, що нам ще потрібен другий аргумент – масив даних про коментар, що додається. Без цього масиву нам просто немає що порівнювати. Отож, треба модифікувати згаданий рядок ось таким чином: do_action('pre_comment_on_post', $comment_post_ID, $_POST);. Тут $_POST якраз містить масив потрібних нам даних.

Фінальний код, який слід помістити у файл functions.php виглядає так:

add_action( 'pre_comment_on_post', 'check_commentator_email', 10, 2 );
function check_commentator_email($comment_post_ID, $post_data) {
    require_once(ABSPATH . WPINC . '/registration.php');

    if ( username_exists($post_data['author']) ) wp_die( 'Таке ім\'я вже використовується іншим користувачем!' );
    if ( email_exists($post_data['email']) ) wp_die( 'Такий email вже використовується іншим користувачем!' );
}

Також не забудьте модфиікувати файл wp-comments-post.php відповідним чином (див. врізку вище). І звісно ж, наш Batman повинен бути зареєстрованим користувачем. Як же інакше?)

Якщо ви знаєте кращий спосіб реалізувати описаний функціонал – не соромтесь, напишіть мені про це у коментарях! 😉

Сила CSS3 у одному div

Сила CSS3 у одному div

DevCampUA у Тернополі

DevCampUA у Тернополі

Новіший допис

There are 5 comments

  1. Serjart

    В тебе часова зона у вордпрессі невірно налаштована і я щось взагалі не зрозумів, як працює ця перевірка.

    1. Віталій Кійко

      Точно, не вірно)) Я вже наче поправив.

      Перевірка працює так: якщо на сайті є зареєстрований юзер Batman, то жоден гість не зможе скористатись його ніком при додаванні коментаря. Аналогічно з емейлом. При додавання коментаря, у якому гість використовує нік і/або е-пошту зареєстрованого юзера – вибиватиме помилку по типу, якщо не заповнено поле коментар, але з вказаним у коді текстом.

      1. Serjart

        Наскільки я зрозумів, потрібно було написати, що метод діє коли:
        1. Маємо зареєстрованого адеквата.
        2. Маємо незареєстрованого неадеквата, що робить спроби писати без реєстрації під даними адеквата.

        Виходить, що адекват також не зможе писати без входу?

Коментування вимкнено.