WordPress. Создаем встроенную форму обратной связи

Множество существующих плагинов wordpress позволяют встраивать форму обратной связи на ваш блог, но использование плагинов – не обязательное условие. В сегодняшней статье, вы узнаете как создать встроенную контактную форму, с помощью собственной WordPress-темы.

Пример такой формы можно найти на сайте PHP Snippets, там она выглядит следующим образом:

Шаг 1: Создание шаблона

Сначала, нам понадобится создать шаблон страницы. Для этого, скопируйте содержимое файла page.php в новый файл, и сохраните его под именем page-contact.php.

Для того, чтобы WordPress определил наш файл как шаблон, нам нужно добавить комментарий, следующего вида:

[php]
<?php
/*
Template Name: Contact
*/
?>
[/php]

В результате наш файл page-contact.php должен выглядеть вот так:

[php]
<?php
/*
Template Name: Contact
*/
?>

<?php get_header() ?>

<div id="container">
<div id="content">
<?php the_post() ?>
<div id="post-<?php the_ID() ?>" class="post">
<div class="entry-content">
</div><!– .entry-content ->
</div><!– .post–>
</div><!– #content –>
</div><!– #container –>

<?php get_sidebar() ?>
<?php get_footer() ?>
[/php]

Шаг 2: Создание формы

Теперь, создадим простую форму обратной связи. Просто вставьте приведенный код внутри блока entry-content.

[php]
<form action="<?php the_permalink(); ?>" id="contactForm" method="post">
<ul>
<li>
<label for="contactName">Name:</label>
<input type="text" name="contactName" id="contactName" value="" />
</li>
<li>
<label for="email">Email</label>
<input type="text" name="email" id="email" value="" />
</li>
<li>
<label for="commentsText">Message:</label>
<textarea name="comments" id="commentsText" rows="20" cols="30"></textarea>
</li>
<li>
<button type="submit">Send email</button>
</li>
</ul>
<input type="hidden" name="submitted" id="submitted" value="true" />
</form>
[/php]

Код формы очень простой, и не нуждается в разъяснениях. Обратите внимания на  тэг input type=”hidden”, добавленный в строке 19 – позже, он будет использоваться для проверки была ли отправлена форма.

Шаг 3: Обработка данных и ошибок

Наша форма выглядит прекрасно, но пока что является бесполезной, поскольку не отправляет сообщения. Прежде всего, перед отправкой сообщения, нам нужно проверить была ли отправлена форма, и правильно ли заполнены все поля.

Если поля заполнены правильно, мы получаем почтовый адрес администратора блога и отправляем ему сообщение. Если поля заполнены частично или с ошибками, сообщение не отправляется, и пользователю выводится список ошибок.

Вставьте следующий код между комментарием с названием шаблона и функцией get_header().

[php]
<?php
if(isset($_POST[‘submitted’])) {
if(trim($_POST[‘contactName’]) === ”) {
$nameError = ‘Please enter your name.’;
$hasError = true;
} else {
$name = trim($_POST[‘contactName’]);
}

if(trim($_POST[’email’]) === ”) {
$emailError = ‘Please enter your email address.’;
$hasError = true;
} else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", trim($_POST[’email’]))) {
$emailError = ‘You entered an invalid email address.’;
$hasError = true;
} else {
$email = trim($_POST[’email’]);
}

if(trim($_POST[‘comments’]) === ”) {
$commentError = ‘Please enter a message.’;
$hasError = true;
} else {
if(function_exists(‘stripslashes’)) {
$comments = stripslashes(trim($_POST[‘comments’]));
} else {
$comments = trim($_POST[‘comments’]);
}
}

if(!isset($hasError)) {
$emailTo = get_option(‘tz_email’);
if (!isset($emailTo) || ($emailTo == ”) ){
$emailTo = get_option(‘admin_email’);
}
$subject = ‘[PHP Snippets] From ‘.$name;
$body = "Name: $name \n\nEmail: $email \n\nComments: $comments";
$headers = ‘From: ‘.$name.’ <‘.$emailTo.’>’ . "\r\n" . ‘Reply-To: ‘ . $email;

mail($emailTo, $subject, $body, $headers);
$emailSent = true;
}

} ?>
[/php]

В этом коде, проверяется отправка формы и корректное заполнение полей. Если появляются ошибки, в виде пустого поля или неправильно указанного почтового адреса, формируется сообщение об ошибке и форма не отправляется.

Теперь, нам нужно отобразить сообщение об ошибке, рядом с нужным полем, например “Пожалуйста, введите имя”.  Ниже приведен полный код шаблона, который вы можете использовать в своей теме.

[php]
<?php
/*
Template Name: Contact
*/
?>

<?php
if(isset($_POST[‘submitted’])) {
if(trim($_POST[‘contactName’]) === ”) {
$nameError = ‘Please enter your name.’;
$hasError = true;
} else {
$name = trim($_POST[‘contactName’]);
}

if(trim($_POST[’email’]) === ”) {
$emailError = ‘Please enter your email address.’;
$hasError = true;
} else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", trim($_POST[’email’]))) {
$emailError = ‘You entered an invalid email address.’;
$hasError = true;
} else {
$email = trim($_POST[’email’]);
}

if(trim($_POST[‘comments’]) === ”) {
$commentError = ‘Please enter a message.’;
$hasError = true;
} else {
if(function_exists(‘stripslashes’)) {
$comments = stripslashes(trim($_POST[‘comments’]));
} else {
$comments = trim($_POST[‘comments’]);
}
}

if(!isset($hasError)) {
$emailTo = get_option(‘tz_email’);
if (!isset($emailTo) || ($emailTo == ”) ){
$emailTo = get_option(‘admin_email’);
}
$subject = ‘[PHP Snippets] From ‘.$name;
$body = "Name: $name \n\nEmail: $email \n\nComments: $comments";
$headers = ‘From: ‘.$name.’ <‘.$emailTo.’>’ . "\r\n" . ‘Reply-To: ‘ . $email;

mail($emailTo, $subject, $body, $headers);
$emailSent = true;
}

} ?>
<?php get_header(); ?>
<div id="container">
<div id="content">

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div <?php post_class() ?> id="post-<?php the_ID(); ?>">
<h1 class="entry-title"><?php the_title(); ?></h1>
<div class="entry-content">
<?php if(isset($emailSent) && $emailSent == true) { ?>
<div class="thanks">
<p>Thanks, your email was sent successfully.</p>
</div>
<?php } else { ?>
<?php the_content(); ?>
<?php if(isset($hasError) || isset($captchaError)) { ?>
<p class="error">Sorry, an error occured.<p>
<?php } ?>

<form action="<?php the_permalink(); ?>" id="contactForm" method="post">
<ul class="contactform">
<li>
<label for="contactName">Name:</label>
<input type="text" name="contactName" id="contactName" value="<?php if(isset($_POST[‘contactName’])) echo $_POST[‘contactName’];?>" class="required requiredField" />
<?php if($nameError != ”) { ?>
<span class="error"><?=$nameError;?></span>
<?php } ?>
</li>

<li>
<label for="email">Email</label>
<input type="text" name="email" id="email" value="<?php if(isset($_POST[’email’])) echo $_POST[’email’];?>" class="required requiredField email" />
<?php if($emailError != ”) { ?>
<span class="error"><?=$emailError;?></span>
<?php } ?>
</li>

<li><label for="commentsText">Message:</label>
<textarea name="comments" id="commentsText" rows="20" cols="30" class="required requiredField"><?php if(isset($_POST[‘comments’])) { if(function_exists(‘stripslashes’)) { echo stripslashes($_POST[‘comments’]); } else { echo $_POST[‘comments’]; } } ?></textarea>
<?php if($commentError != ”) { ?>
<span class="error"><?=$commentError;?></span>
<?php } ?>
</li>

<li>
<input type="submit">Send email</input>
</li>
</ul>
<input type="hidden" name="submitted" id="submitted" value="true" />
</form>
<?php } ?>
</div><!– .entry-content –>
</div><!– .post –>

<?php endwhile; endif; ?>
</div><!– #content –>
</div><!– #container –>

<?php get_sidebar(); ?>
<?php get_footer(); ?>
[/php]

Шаг 4: Добавляем проверку jQuery

Наша форма уже работает прекрасно, но мы можем улучшить ее, добавив проверку на клиенте. Для этого, мы будем использовать jQuery и плагин jQuery Validation. Это отличный плагин, позволяющий легко и быстро проверить правильное заполнение полей.

Cкачайте плагин и поместите его в папку с вашей темой, внутри папки /js. После этого, вставьте следующие строки в новый файл:

[javascript]
$(document).ready(function(){
$("#contactForm").validate();
});
[/javascript]

Сохраните файл под именем verif.js в папке /js.

Теперь, нам нужно подключить ява-скрипт файлы в нашу тему. Откройте файл header.php и вставьте следующий код внутри тэгов <head></head>:

[html]
<?php if( is_page(‘contact’) ){ ?>
<script type="text/javascript" src="<?php bloginfo(‘template_directory’); ?>/js/jquery.validate.min.js"></script>
<script type="text/javascript" src="<?php bloginfo(‘template_directory’); ?>/js/verif.js"></script>
<?php }?>
[/html]

После этого, ваша форма будет проверяться плагином на клиентской стороне. Плагин работает довольно просто – выбирает элементы формы, имеющий css-класс required и проверяет их на корректное заполнение. В случае ошибки, отображается сообщение. Надеюсь, вам понравится ваша новая WordPress-форма.

Перевод статьи “How to create a built-in contact form for your WordPress theme”, автор Jean-Baptiste Jung


Posted

in

,

by

Tags:

Comments

25 responses to “WordPress. Создаем встроенную форму обратной связи”

  1. tanatos Avatar

    Видно что переводная статья, потому что очень скучно читать.

    Думаю что если хочет человек написать , то и на мыло напишет .

    1. Дмитрий Avatar

      Не вижу разницы между написанной и переведённой статьей в плане интереса для чтения. Расскажите?

      Понятно что напишет, но формы обратной связи созданы для того чтобы упростить этот процесс.

  2. Патрик Avatar
    Патрик

    извините, не совсем понятно как этот файл подключить в блог. имеется ввиду, где именно в движке идет его подключение.

    1. dreamhelg Avatar
      dreamhelg

      Да, действительно, стоило об этом упомянуть. Для того, чтобы подключить форму к блогу, нужно создать новую страницу, и в правом, боковом меню, выбрать шаблон Contact. После этого, на этой странице будет форма обратной связи.

      1. Патрик Avatar
        Патрик

        спасибо большое, заработало =)

  3. cliverd Avatar

    Спасибо, все получилось но только с 3 раза.
    Обязательно подпишусь на ваш блог.

  4. Анечка Avatar

    А для меня информация оказалась как нельзя кстати….как раз над формой обратной связи голову ломаю)) спасиб, помогли немного))

  5. n.p. Avatar

    У меня тоже получилось. Использовал до этого подобную форму связи, но у меня она криво отображалась на страничке.

  6. Андрей Avatar

    Спасибо большое, иду пробовать. Судя по отзывам – должно получиться)

  7. Marga Avatar

    Информация действительно стоящая . А по поводу того что статья скучно читается , так по мне вся техническая литература пишется не для развлечения .
    Огромное Вам спасибо много интересного подчерпнул из вашего блога.

  8. dumor Avatar

    Спасибо! Еще бы порекомендовали нормальный плагин для гостевой книги, был бы Вам благодарен.

  9. Алексей Avatar

    Да ладно вам. Нормальная инфа и достаточно нормально описано. Как смог автор так и перевел. Он же для людей старается, а вы еще и накатываете…
    Для вордпреса и так полным полно плагинов, но не на каждый можно найти такое подробное описание.

  10. carerakjan Avatar

    форма отличная и легкая в понимании, единственное но – защита от спам ботов… у себя я прикрутил, сделайте это в примере и тогда все будет супер..)

  11. axel Avatar

    не все таки, wordpress не самая удобная система для разработки))) я б даже сказал худшая…
    долго и слишком много кода нужна писать для создания простых вещей

    1. Юрий Avatar

      Можно и проще я, например, создал страницу КОНТАКТЫ и там просто в html создал простую форму и в папку сайта добавил коротенький PHP-скрипт send, причём это работает на любых сайтах.
      У меня сайты и на вордпрессе и в html.

  12. Мария Новицкая Avatar
    Мария Новицкая

    Здравствуйте! Подскажите, пожалуйста, почему сообщения из этой формы приходят в неверной кодировке? Кириллические символы отображаются абракадаброй, английские нормально. Кодировка сайта utf8.

  13. Артем Avatar

    И спасибо за пост.. Поставил себе на сайте такую 😉

  14. Иннер Дизайн Avatar

    Its work! Я обескуражен!

    1. Ирина Avatar
      Ирина

      Где найти новый файл, чтобы вставить скопированный page.php?

  15. anadikt Avatar

    Смотрю народу не нравится то что статья переведена!!! А мне как бы пофиг… самое главное суть статьи уловить!! Автору спасибо за труд в переводе!!!!

  16. вера Avatar
    вера

    А для меня это очень нужная информация и своевременная! и понятная! Поняла разницу между проверкой на стороне клиента и сервера – как пелена упала. Я благодарю автора этого блога, по-моему был еще такой красивенький синенький у dreamhelg, туда я часто захожу – отличный блог

  17. Artem Avatar

    Теперь можно обойтись и без Contact Form 7!!!

  18. ivan90 Avatar

    Artem, пользуюсь стандартной формой седьмой версии, не жалуюсь, а обойтись не получиться, уже привыкли. Попробую версию автора здесь

  19. Владимир Avatar
    Владимир

    Очень интересная форма. Ещёб добавить отправку файла…..

Leave a Reply

Your email address will not be published. Required fields are marked *