wp_mail не отправляет письма
Я использовал плагин WP-Mail-SMTP
для настройки почты в моей WordPress-установке.
Проверил его работу, отправив письмо на свою личную почту.
Теперь пытаюсь отправить данные формы с помощью функции wp_mail()[WP].
Ниже приведен код:
<?php
if(isset($_POST["button_pressed"])){
// Проверка на пустые поля..
if($_POST["dname"]==""){
echo "Заполните все поля..";
}
else {
$email=$_POST['email'];
$message = $_POST['dname'];
$headers = 'From:' . "\r\n"; // Email отправителя
$headers .= 'Cc:' . "\r\n"; // Копия письма
// Строки сообщения не должны превышать 70 символов (правило PHP), поэтому делаем перенос
// $message = wordwrap($message, 70);
wp_mail("PRIVATE-EMAIL-ADDRESS", $subject, $message, $headers)
echo "Ваше письмо успешно отправлено! Спасибо за обратную связь";
}
?>
HTML форма:
<form>
<div class="row">
<div class="form-group">
<div class="col-sm-6"><input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ СОБАКИ" id="dname" /></div>
<div class="col-sm-6"><input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ ВЛАДЕЛЬЦА" id="name" /></div>
</div>
</div>
<input type="submit" value="ОТПРАВИТЬ" />
<input type="hidden" name="button_pressed" value="1" />
</form>
Пробовал разные руководства, но ничего не помогло. Ваши комментарии и предложения будут очень полезны. Спасибо за уделенное время.
Поковырявшись несколько часов, я нашел проблему.
Оказалось, дело было в форме, а не в PHP.
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ СОБАКИ" id="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ ВЛАДЕЛЬЦА" id="name" /></div>
Атрибут id
нужно заменить на name
.
Исправленная версия
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ СОБАКИ" name="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="ВВЕДИТЕ ИМЯ ВЛАДЕЛЬЦА" name="name" /></div>
</div>

ОЙ-ЁЙ. Здесь очень много ошибок.
Вы должны обрабатывать данные $_POST, иначе могут произойти очень плохие вещи...
Лучше использовать одинарные кавычки для строк в WordPress
Отступы и пробелы не соответствуют лучшим практикам.
Вы ничего не делаете с $_POST['name'] ???
Вы вызываете $_POST["email"], но не передаете его через форму, что приведет к ошибкам неопределенной переменной (ИСПОЛЬЗУЙТЕ WP DEBUG !!! ВКЛЮЧИТЕ ЕГО)
Важно проверять все значения $_POST, а не только одно, потому что кто-то может изменить форму или спамер может отправить письмо без заполнения всех полей, что снова приведет к ошибкам неопределенной переменной.
У wp_mail должна быть точка с запятой в конце
У вас отсутствует закрывающая скобка, PHP код не будет работать.
Else не нужен
Лучше использовать wp_die, если форма была изменена. Если вы не хотите плохого пользовательского опыта, просто используйте HTML-атрибут required в полях ввода.
Нет необходимости в закрывающих div после полей ввода
Лучше использовать CSS и нативный Bootstrap для обработки заглавных букв.
PHP код
<?php
if ( isset( $_POST["button_pressed"] ) ) {
// Проверка на пустые поля..
if ( empty( $_POST['dname'] ) || empty( $_POST['name'] ) ) {
wp_die( __( 'Пожалуйста, заполните все поля в следующий раз.', 'your-text-domain' ) );
}
$message = sanitize_text_field( $_POST['dname'] );
// $email = sanitize_email( $_POST["email"] );
$name = sanitize_text_field( $_POST['name'] );
$headers = 'From:' . "\r\n"; // Email отправителя
$headers .= 'Cc:' . "\r\n"; // Копия письма отправителю
// Отправка письма
wp_mail( 'PRIVATE-EMAIL-ADDRESS', $subject, $message, $headers );
// Показать сообщение и скрыть форму
_e( 'Ваше письмо успешно отправлено! Спасибо за обратную связь.', 'your-text-domain' );
echo '<style>#contact-form{ display: none; }</style>';
}
?>
HTML разметка
<form action="" id="contact-form" method="post">
<div class="row">
<div class="form-group">
<div class="col-sm-6">
<input class="form-control text-uppercase" type="text" placeholder="<?php _e( 'Введите имя собаки', 'your-text-domain' ); ?>" name="dname" required>
<div class="col-sm-6">
<input class="form-control text-uppercase" type="text" placeholder="<?php _e( 'Введите имя владельца', 'your-text-domain' ); ?>" name="name" required>
</div>
</div>
</div>
<input type="submit" value="ОТПРАВИТЬ" />
<input type="hidden" name="button_pressed" value="1" />
</form>

Я проверил ваш код. Думаю, заголовок определен неправильно. Пожалуйста, проверьте код ниже:
$current_user = wp_get_current_user();
$name = sanitize_text_field($_POST["name"]);
$email_address = sanitize_email($_POST["email_address"]);
$detail = esc_textarea($_POST["detail"]);
$message = "Имя : " . $name . "\n";
$message .= "Email : " . $email_address . "\n";
$message .= "Детали : " . $detail . "\n";
$send_to = 'test@test.com';
$headers = 'From: ' . $current_user->user_firstname . ' ' . $current_user->user_lastname . ' <test@test.com>' . "\r\n";
if (wp_mail($send_to, $email_subject, $message, $headers)) {
wp_redirect(admin_url('admin.php?page=contact-page&msg=success'));
exit();
} else {
wp_redirect(admin_url('admin.php?page=contact-page&msg=failed'));
exit();
}
