Припустимо, що у вас на сайті коментарі дозволені без премодерування і також гостями. Чому так? Ну хоча б тому, що ресурс часто відвідуваний і коментований. Тож модерувати всі вхідні коментарі просто нереально. Також припустимо, що ви хочете убезпечитись від відставних коментаторів – людей, що використовують імена чи ніки інших коментаторів і таким чином бажають видати їх за себе. Наприклад, у вас на сайті хороший відвідувач і коментатор з ніком 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 повинен бути зареєстрованим користувачем. Як же інакше?)
Якщо ви знаєте кращий спосіб реалізувати описаний функціонал – не соромтесь, напишіть мені про це у коментарях! 😉
Коментування вимкнено.
В тебе часова зона у вордпрессі невірно налаштована і я щось взагалі не зрозумів, як працює ця перевірка.
Точно, не вірно)) Я вже наче поправив.
Перевірка працює так: якщо на сайті є зареєстрований юзер Batman, то жоден гість не зможе скористатись його ніком при додаванні коментаря. Аналогічно з емейлом. При додавання коментаря, у якому гість використовує нік і/або е-пошту зареєстрованого юзера – вибиватиме помилку по типу, якщо не заповнено поле коментар, але з вказаним у коді текстом.
Непонятно…
Я пишу деколи заплутано. Але що саме вам не зрозуміло? Який момент?
Наскільки я зрозумів, потрібно було написати, що метод діє коли:
1. Маємо зареєстрованого адеквата.
2. Маємо незареєстрованого неадеквата, що робить спроби писати без реєстрації під даними адеквата.
Виходить, що адекват також не зможе писати без входу?