Форма обратной связи
Как создать безопасную форму обратной связи без использования плагинов? Какими библиотеками/функциями пользоваться?
Как создать безопасную форму обратной связи без использования плагинов? Какими библиотеками/функциями пользоваться?
Вот нашел в закромах такой код, полностью рабочая форма для страницы контактов. Код не большой, можно делать плагин или добавить в файл functions.php...
<?php /** * Plugin Name : Kama Contact Form * Description : Create simple contact form. Create page with post_name == contacts. * Author : Kama * Author URI : http://wp-kama.ru/ * Version : 0.2 */ ## filter the_content add_filter('the_content', 'wpcf_add_to_content'); function wpcf_add_to_content( $content ){ global $post; if( $post->post_name == 'contacts' ) $content .= wpcf_callback(); return $content; } ## styles function wpcf_styles(){ ?> <style type="text/css"> #contactform{ padding:2px; margin:5px 0px; overflow:hidden; line-height:1em; color:#666;} #contactform span{ color:#f00; } #contactform fieldset{ border:none; } #contactform input, #contactform textarea{ display:block; margin:2px 0px 15px; padding:5px;} #contactform input{ width:50%; line-height:1em; } #contactform textarea{ width:90%; min-height:250px; } .contacterror{ border:1px solid #ff0000!important; } input#contactsubmit{ width:25%; height:30px; margin-top:3px; padding:2px; display:block;} input.hiddenfield{ background:transparent; border:none; padding:0px; margin:0px;} label.wpcf_response{ float:left; line-height:20px; margin-right:20px; } #wpcf_response{ width:70px!important; } </style> <?php } ## Настройки function wpcf_option( $option = '' ){ $options = array( 'wpcf_email' => get_option('admin_email'), // Адрес Куда слать письма 'wpcf_prefix' => '['.get_bloginfo('name').']', // Префикс заголовка письма 'wpcf_question' => '2 + 4', // Каптча 'wpcf_answer' => '6', // ответ ); if( ! $option ) return $options; return $options[ $option ]; } ## Wrapper function which calls the form. function wpcf_callback(){ global $wpcf_strings; ob_start(); wpcf_styles(); $wpcf_strings = array( 'error' => '', 'name' => '<input type="text" name="wpcf_name" id="wpcf_name" value="' . esc_attr( @ $_POST['wpcf_name'] ) . '" >', 'email' => '<input type="text" name="wpcf_email" id="wpcf_email" value="' . esc_attr( @ $_POST['wpcf_email'] ) . '" >', 'subject' => '<input type="text" name="wpcf_subject" id="wpcf_subject" value="' .esc_attr( @ $_POST['wpcf_subject'] ) . '" >', 'msg' => '<textarea name="wpcf_msg" id="wpcf_msg" cols="35" rows="8" >' . esc_textarea( @ $_POST['wpcf_msg'] ) . '</textarea>', 'response' => '<input type="text" name="wpcf_response" id="wpcf_response" value="' . esc_attr( @ $_POST['wpcf_response'] ) . '" >', ); if( wpcf_check_input() ){ $to = wpcf_option('wpcf_email'); $subject = wpcf_option('wpcf_prefix') .' '. esc_attr($_POST['wpcf_subject']); $name = esc_attr($_POST['wpcf_name']); $email = esc_attr($_POST['wpcf_email']); $headers = array( "MIME-Version: 1.0", "From: $name <$email>", "Content-Type: text/html; charset=\"" . get_option('blog_charset') . "\"", ); $msg = $_POST['wpcf_msg']; $message = ''; $message .= "IP:" . getip() ."<br />"; $message .= "<b>$name</b> написал:<br /><br />"; $message .= str_replace("\n", "<br />", $msg); if( wp_mail( $to, $subject, $message, $headers) ){ echo '<p style="color:green;">Ваше письмо было отправлено, спасибо!</p> <p class="successmsg"><a href="'. home_url() .'/">Вернуться назад.</a></p>'; } else echo 'Не удалось отправить письмо, php функция wp_mail() не работает.'; } else { $question = htmlentities( wpcf_option('wpcf_question') ); echo <<<HTML <form id="contactform" action="" method="post"> <div class="error">{$wpcf_strings['error']}</div> <label for="wpcf_name">Ваше имя</label> {$wpcf_strings['name']} <label for="wpcf_email">Email</label> {$wpcf_strings['email']} <label for="wpcf_subject">Тема сообщения</label> {$wpcf_strings['subject']} <label for="wpcf_msg">Текст сообщения</label> {$wpcf_strings['msg']} <label for="wpcf_response">{$question}</label> {$wpcf_strings['response']} <input type="submit" name="Submit" value="Отправить" class="button-primary" id="contactsubmit" /> <input type="hidden" class="hiddenfield" name="wpcf_stage" value="process" /> <div><small><em>Все поля обязательны к заполнению.</em></small></div> </form> HTML; } return ob_get_clean(); } function wpcf_check_input(){ global $wpcf_strings; if( ! $_POST || ! isset($_POST['wpcf_stage']) ) return false; $error = array(); if( empty($_POST['wpcf_name']) ){ $error[] = 'Введите имя'; $wpcf_strings['name'] = str_replace('name=', ' class="contacterror" name=', $wpcf_strings['name']); } if( ! is_email($_POST['wpcf_email']) ){ $error[] = 'Неверный email'; $wpcf_strings['email'] = str_replace('name=', ' class="contacterror" name=', $wpcf_strings['email']); } if( empty($_POST['wpcf_subject']) ){ $error[] = 'Введите тему письма'; $wpcf_strings['subject'] = str_replace('name=', ' class="contacterror" name=', $wpcf_strings['subject']); } if( empty($_POST['wpcf_msg']) ){ $error[] = 'Введите текст сообщения'; $wpcf_strings['msg'] = str_replace('name=', ' class="contacterror" name=', $wpcf_strings['msg']); } if ( ! wpcf_is_challenge($_POST['wpcf_response']) ){ $error[] = 'Неправильный ответ на вопрос'; $wpcf_strings['response'] = str_replace('name=', ' class="contacterror" name=', $wpcf_strings['response']); } if( ! $error ) return true; // error $wpcf_strings['error'] = '<p style="color:red;">'. implode('<br>', $error) .'</p>'; return false; } function wpcf_is_challenge($input) { $is_challenge = false; $answer = wpcf_option('wpcf_answer'); $answer = htmlentities(stripslashes(esc_attr($answer))); if( $input == $answer ) $is_challenge = true; return $is_challenge; } ## Can't use WP's function here, so lets use our own function getip(){ if (isset($_SERVER)){ if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { $ip_addr = $_SERVER["HTTP_X_FORWARDED_FOR"]; } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) { $ip_addr = $_SERVER["HTTP_CLIENT_IP"]; } else { $ip_addr = $_SERVER["REMOTE_ADDR"]; } } else { if ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) { $ip_addr = getenv( 'HTTP_X_FORWARDED_FOR' ); } elseif ( getenv( 'HTTP_CLIENT_IP' ) ) { $ip_addr = getenv( 'HTTP_CLIENT_IP' ); } else { $ip_addr = getenv( 'REMOTE_ADDR' ); } } return $ip_addr; }Здравствуйте. После отправки формы на почту приходит 3 копии письма. Как это можно поправить?
Благодарю!