WordPress как на ладони
WordPress темы и плагины за 250 рублей wordpress jino

Форма обратной связи

Как создать безопасную форму обратной связи без использования плагинов? Какими библиотеками/функциями пользоваться?

Заметки к вопросу:
Zeng 8 месяцев назад

htmlentities(), strip_tags()

0
Guest
8 месяцев назад
  • 0
    Kama5346

    Вот нашел в закромах такой код, полностью рабочая форма для страницы контактов. Код не большой, можно делать плагин или добавить в файл 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;
    }
    
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация