maks843
@maks843
Web-дизйнер

Почему не работает форма php?

2763dcee90c04687842d2bb6b94badfa.png
Не работает форма обратной связи

<?php if(is_front_page()) { ?>
  <div id="modal-window" class="modal-window">
<div class="window-container fadeInDown animated">
<button class="close">Закрыть</button>
  <h1>Напишите мне письмо</h1>
 <?php echo do_shortcode('[contact-form-7 id="195" title="Feedback"]'); ?>
</div>
</div>
<?php } ?>


Скрипт:
<script>
$(document).ready(function() {
$('.open-window').click(function() {
$('.modal-window').fadeIn(function() {
$('.window-container').addClass('visible');
});
});
$('.close, .modal-window').click(function() {
$('.modal-window').fadeOut().end().find('.window-container').removeClass('visible');
});
$('.window-container').click(function(event) {
event.stopPropagation()
});
});
</script>
  • Вопрос задан
  • 704 просмотра
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
maks843: не будет так шаблон работать, WordPress не понимает, что это за шаблон. Почитайте Template Hierarchy. У вас форма принудительно уходит на mail.php и передает ей данные полей через $_POST. Именно в этом файле нужно проводить обработку формы. Или же, правильнее, для самой формы action указать пустой - тогда форма будет отправлять данные на ту же страницу, где она размещена (перезагрузка страницы по сути). Далее определите, какой шаблон эта страница использует и в нем уже добавляйте обработчик, только обязательно через проверку if( isset($_POST['name']) && isset($_POST['email']) && isset($_POST['message']) ). Кстати, у вас textarea в коде формы стоит без атрибута name, каким образом вы надеетесь эти данные получать? Также, у вас поле для Subject имеет тип type="subject" - такого не существует.

Кроме того, ряд ваших IFов лучше переписать как тернарные операторы или if/else, unset делать не нужно. Ну и сами данные $_POST еще надо валидировать и фильтровать, у вас сейчас нет никакой защиты от передачи вредоносных данных.

<div class="window-container fadeInDown animated">
<button class="close">Закрыть</button>
    <h1>Напишите мне письмо</h1>
            <form action="" method="post">
                <input class="first" type="text" name="name" placeholder="Имя" required><br>
                <input class="first" type="email" name="email" placeholder="Email" required><br>
                <input class="first" type="text" name="subject" placeholder="Тема"><br>
                <textarea class="input textarea" name="message" placeholder="Сообщение" required></textarea><br>
                <input type="submit" class="button" value="Отправить">
            </form>
</div>


if( isset($_POST['name']) && isset($_POST['email']) && isset($_POST['message']) ) {

    $name = sanitize_text_field( $_POST['name'] );
    $email = sanitize_email( $_POST['email'] );
    $subject = ( !empty($_POST['subject']) ) ? sanitize_text_field( $_POST['subject'] ) : 'Default subject';
    $message = sanitize_text_field( $_POST['message'] );

    $to = 'your@email.com';
    $headers = 'From: ' . $name . ' <' . $email . '>' . "\r\n";
    $send = wp_mail( $to, $subject, $message, $headers ); // returns true/false

    echo ( true == $send ) ? 'Success message' : 'Error message';

}


Проверку, заполнены ли все обязательные поля, надо делать javascript'ом, плюс у вас есть атрибут required, тут уже браузер убедится, что поля заполнены. Также, не мешало бы валидировать формат email еще до отправки данных на сервер (или использовать HTML5 тип input type="email").

В общем, если честно, я не совсем понимаю, зачем вы пытаетесь вручную делать то, в чем пока еще смутно разбираетесь, вместо того, чтобы использовать один из сотни плагинов для форм обратной связи, которые уже учитывают безопасность, валидацию данных, обработку черех Ajax и тд. Если же все-таки хотите освоить эту сферу - начните последовательно изучать то, как правильно нужно работать с формами. Уроков в сети масса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Возможно надо указать правильный путь к странице не mail.php, а к примеру /mail.php, если эта страница находится в корне сайта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы