Краткий рассказ о переделывании wordpress-плагина Simple Contact Form: отключении визуальной капчи и подключении неявной проверки на робота в виде Cookies (используя идеи плагина Cookies For Comments).
План действий:
1. Отключить визуальную, текстовую капчу.
2. Подлкючить капчу на Cookies.
3. Протестировать.
1.1. Убираем поля для капчи в форме, файл simple-contact-form.php:
<div style='padding-top:4px;' class="gcf_title"> Enter_your_message </div> <div> <textarea name="gcf_message" class="gcftextarea" rows="3" id="gcf_message"></textarea> </div> <!--<div style='padding-top:4px;' class="gcf_title"> Enter below security code </div> <div> <input name="gcf_captcha" class="gcftextbox" type="text" id="gcf_captcha" maxlength="6"> </div> <div style='padding-top:4px;'> <img src="<?php echo get_option('siteurl'); ?>/wp-content/plugins/simple-contact-form/captcha.php?width=100&height=30&characters=5" /> </div>--> |
1.2. Комментируем все строки обработки капчи в функциях gcf_submit(obj,url) и gcfContents(), а также меняем код формирования строки str (отправляемой на обработку на серверный скрипт simple-contact-save.php) в файле simple-contact-form.js:
// ... _e=document.getElementById("gcf_email"); _n=document.getElementById("gcf_name"); _m=document.getElementById("gcf_message"); //_c=document.getElementById("gcf_captcha"); // ... /* else if(_c.value=="") { alert("Please enter enter below security code."); _c.focus(); return false; } */ // ... var str = "gcf_name=" + encodeURI( document.getElementById("gcf_name").value ) + "&gcf_email=" + encodeURI( document.getElementById("gcf_email").value ) + "&gcf_message=" + encodeURI( document.getElementById("gcf_message").value ); |
2.1. Добавляем функцию создания абстрактного ключа get_cfc_key() файл simple-contact-form.php:
TODO: протестировать неиспользование проверки if(current_user_can('edit_plugins')).
function get_cfc_key() { if( function_exists( 'get_site_option' ) ) { $cfc_key = get_site_option( 'cfc_key' ); } else { $cfc_key = get_option( 'cfc_key' ); } if( !$cfc_key ) { if( current_user_can('edit_plugins') ) { $cfc_key = md5( time() ); if( function_exists( 'add_site_option' ) ) { $cfc_key = add_site_option( 'cfc_key', $cfc_key ); } else { $cfc_key = add_option( 'cfc_key', $cfc_key ); } } else { return; } } return $cfc_key; } |
2.2. Вносим соответствующие изменения в функцию gCF():
// ... $cfc_key = get_cfc_key(); // получение значения ключа // ... <link rel="stylesheet" href="<?php echo trailingslashit( get_option( 'siteurl' ) ) . $cfc_key . '.css?t=' . mt_rand(); ?>" type="text/css" media="screen" /> // генерируем CSS-файл для дальнейшей проверки его наличия в коде страницы // ... |
2.3. Вносим изменения в текст функции gCF_widget_init():
// ... if(function_exists('register_widget_control')) { register_widget_control(array('Simple contact form', 'widgets'), 'gCF_control', 400, 400); } $cfc_key = get_cfc_key(); if( strpos( $_SERVER[ 'REQUEST_URI' ], $cfc_key . '.css' ) ) { // проверяем наличие CSS-файла if( !isset( $_COOKIE[ $cfc_key ] ) ) $_SESSION['cfc_key'] = $cfc_key; @setcookie( $cfc_key, 1, time()+604800, '/' ); header("Content-type: text/css"); define( 'DONOTCACHEPAGE', 1 ); // don't let wp-super-cache cache this page. die(); } // ... |
2.4. Меняем суть обработки пришедшего при помощи Ajax запроса в файле simple-contact-save.php:
$gCF_abspath = dirname(__FILE__); $gCF_abspath_1 = str_replace('wp-content/plugins/simple-contact-form', '', $gCF_abspath); $gCF_abspath_1 = str_replace('wp-content\plugins\simple-contact-form', '', $gCF_abspath_1); require_once($gCF_abspath_1 .'wp-config.php'); $cfc_key = get_option('cfc_key'); $gcf_table = get_option('gCF_table'); $gcf_name = $_POST['gcf_name']; $gcf_email = $_POST['gcf_email']; $gcf_message = $_POST['gcf_message']; if (isset($_COOKIE[$cfc_key])){ $sql = "insert into $gcf_table" . " set `gCF_name`='" . mysql_real_escape_string(trim($gcf_name)) . "', `gCF_email`='" . mysql_real_escape_string(trim($gcf_email)) . "', `gCF_message`='" . mysql_real_escape_string(trim($gcf_message)) . "', `gCF_ip`='" . $_SERVER['REMOTE_ADDR'] . "', `gCF_date`=NOW();"; $wpdb->get_results($sql); echo 'Сообщение отправлено.'; } else { echo 'Сообщение не отправлено.'; } |
Также в этот скрипт можно добавить функцию отправки сообщение на почту, используя WordpPress-функцию для отправки почты wp_mail. Вставить ее примерно в таком виде <?php wp_mail('me@example.net', 'Сообщение из формы контактов', $gcf_message); ?>.
3. Тестирование и принцип работы:
Протестировать работу формы вы можете на странице категории «Вопрос-Ответ», например, задав вопрос.
Форма должна отработать так:
1. При формировании страницы с виджетом формы в ее коде появляется ссылка на тестовый CSS-файл с ключем в имени.
2. Если 1-ый пункт выполнился то также создался файл Cookies с ключом в теле и недельным сроком действия.
3. При заполнении формы контактов и нажатии кнопку отправить AJAX отправляет данные на файл обработки в котором проверяется ключ в теле одного из Cookies, относящегося к сайту.
Если кому-нибудь понадобиться готовая сборка измененного плагина напишите в комментариях. Если получиться отправить сообщение с помощью робота также напишите.
Здравствуйте. А можно эту форму к Joomla прикрутить?
Привет, думаю в каталоге расширений Joomla сейчас есть более свежие, и, возможно более технологичные аналоги.