На прошлой неделе начал понемногу изучать документацию по написанию WordPress плагинов. Чтобы закрепить теорию попробовал сам написать небольшой плагин, который добавляет для формы комментариев дополнительное поле с вопросом для проверки на спам.
Плагин я назвал Custom Anti Spam. После его активации, в разделе «Настройки» админ панели WordPress появляется дополнительный раздел, в котором можно указать вопрос, который будет выводиться в форме комментариев и правильный ответ на него.
Таким образом, если кто-то напишет персональную спамилку под Ваш блог с указанием верного ответа на антиспам вопрос, можно просто зайти в админ панель и сменить вопрос.
Весь функционал плагина реализован в одном файле custom_anti_spam.php:
<?php /* Plugin Name: Custom Anti Spam Description: Anti-spam plugin wordpress for blocks spam in comments. Version: 1.0 Author: SeoGrot Author URI: http://seogrot.com/ */ add_action('admin_menu','cas_add_menu'); add_action('comment_post', 'comment_post'); add_filter('comment_form_default_fields','cas_fields'); add_option('user_question', 'Сколько пальцев на руке'); add_option('user_answer', '5'); function cas_options_page() { $question = get_option('user_question'); $answer = get_option('user_answer'); if (isset($_POST['submit'])) { $question = $_POST['question']; $answer = $_POST['answer']; update_option('user_question', $question); update_option('user_answer', $answer); } ?> <h2>Custom Anti Spam Plugin Options</h2> <form action="<?php echo $_SERVER['PHP_SELF']; ?>?page=custom_anti_spam.php&updated=true" method="post"> <table> <tr><td>Enter your question:</td><td><input name="question" type="text" size="50" value="<?php echo $question; ?>" /></td> </tr> <tr><td>Enter your answer:</td><td><input name="answer" type="text" size="50" value="<?php echo $answer; ?>" /></td> </tr> <tr><td colspan="2"><input type="submit" name="submit" value="SAVE" /></td> </tr> </form> <?php } function cas_add_menu() { add_options_page('Custom Anti Spam','Custom Anti Spam',8,basename(__FILE__),'cas_options_page'); } function cas_fields($fields) { $question = get_option('user_question'); $fields['new'] = '<p class="comment-form-question">' . $question . '<span class="required">*</span></p><p><input id="youranswer" name="youranswer" type="text" value="" ></p>'; return $fields; } function comment_post($id) { global $user_ID; $answer = get_option('user_answer'); if ($user_ID) return $id; if ($_POST['youranswer'] != $answer) { wp_delete_comment($id); echo '<br /><center>' . 'Wrong captcha!' . '<br /><a href="javascript:history.back()">' . 'Go back' . '</a><br /></center>'; exit; } } ?> |
где:
Функция add_action() — регистрирует хук на действия (admin_menu и comment_post). Действие admin_menu используется для вызова функции добавления нового пункта меню в админ панель. Действие comment_post — срабатывает сразу после добавления комментария и передает его ID.
Функция add_filter() — регистрирует хук на фильтр comment_form_default_fields, позволяющий добавить или удалить поля для формы комментариев. В нашем случае поля будут добавляться.
Функция add_option() — добавляет в таблицу options базы данных опцию с заданным значением. Добавляем две опции: в первой будет храниться вопрос, во второй ответ.
Функция get_option() — считывает значения опций из базы данных.
Функция update_option() — обновляет значения опций в базе данных.
Функция add_options_page() — добавляет страницу и пункт в меню «Настройки» админ-панели WordPress.
Функция wp_delete_comment() — удаляет либо помещает в корзину комментарий с указанным ID. Нам нужно, чтобы комментарий удалялся, так как если в случае неправильного ответа на антиспам вопрос комментарий попадёт в корзину, то повторно этот же комментарий добавить не получится. Система воспримет его как дубликат. Чтобы отключить корзину нужно в файл wp-config.php добавить строку: define(‘EMPTY_TRASH_DAYS’, 0);
Скачать файл плагина Custom_Anti_Spam.zip
Если данная статья попадётся на глаза гуру wordpress, интересно бы было услышать критику в комментариях: какие уязвимости есть у данного плагина, что можно бы было оптимизировать и т.п.
Добавить комментарий