Работа с AJAX в WordPress — это фундамент современного подхода к разработке интерактивных форм. Сегодня разберём, как с помощью AJAX отправлять письма через wp_mail(), передавать скрытые данные (например, цену, локацию, ID объекта) и обрабатывать их безопасно на сервере. Всё это — без сторонних плагинов, только средствами ядра WordPress.
- 1. Отправка Email через wp_mail()
- 2. Отправка двух писем — клиенту и админу
- 3. Передача скрытых данных (hidden inputs)
- 4. Передача данных в AJAX-запросе
- 5. Обработка данных на сервере
- 6. Как передать данные из метабоксов и таксономий
- 7. Многоязычные сайты и передача переведённых данных
- 8. Безопасность и защита от XSS
- 9. Заключение
1. Отправка Email через wp_mail()
WordPress предоставляет встроенную функцию wp_mail(), аналог стандартной mail() из PHP, но с дополнительными преимуществами: она поддерживает фильтры, хуки и интеграцию с SMTP-плагинами.
Пример базового использования:
wp_mail( $to, $subject, $message );
Где:
$to— email получателя (например, адрес клиента);$subject— тема письма;$message— текст письма (можно использовать HTML).
2. Отправка двух писем — клиенту и админу
Типовой сценарий формы бронирования или обратной связи требует отправки:
- уведомления клиенту (о том, что заявка получена);
- уведомления администратору (о новой заявке).
Пример логики:
$client_email = sanitize_email( $_POST['email'] );
$admin_email = get_option( 'admin_email' );
// Письмо клиенту
wp_mail(
$client_email,
'Ваше бронирование получено',
'Спасибо! Мы свяжемся с вами в ближайшее время.'
);
// Письмо админу
$message = "Новая заявка:\n";
$message .= "Имя: " . sanitize_text_field( $_POST['name'] ) . "\n";
$message .= "Телефон: " . sanitize_text_field( $_POST['phone'] ) . "\n";
$message .= "Цена: " . esc_html( $_POST['price'] ) . "\n";
$message .= "Локация: " . esc_html( $_POST['location'] );
wp_mail( $admin_email, 'Новое бронирование', $message );
Чтобы убедиться, что письмо отправилось без ошибок, wp_mail() возвращает true при успешной отправке:
if ( wp_mail( $admin_email, 'Новое бронирование', $message ) ) {
echo 'ok';
} else {
echo 'error';
}
3. Передача скрытых данных (hidden inputs)
Чтобы вместе с формой передавать дополнительные параметры — например, цену (price), местоположение (location) или ID объекта — достаточно добавить скрытые поля (input type="hidden") в разметку формы.
<input type="hidden" name="price" value="<?php echo esc_attr( $price ); ?>">
<input type="hidden" name="location" value="<?php echo esc_attr( $location ); ?>">
Эти данные можно сгенерировать динамически прямо в шорткоде WordPress. Например, если вы используете кастомный метабокс:
$price = get_post_meta( get_the_ID(), 'price', true );
$location = get_the_terms( get_the_ID(), 'location' )[0]->name;
echo '<form id="booking-form">';
echo '<input type="hidden" name="price" value="' . esc_attr( $price ) . '">';
echo '<input type="hidden" name="location" value="' . esc_attr( $location ) . '">';
echo '<input type="text" name="name" placeholder="Ваше имя">';
echo '<input type="email" name="email" placeholder="Ваш email">';
echo '<input type="tel" name="phone" placeholder="Телефон">';
echo '<button type="submit">Забронировать</button>';
echo '</form>';
4. Передача данных в AJAX-запросе
На стороне JavaScript можно собрать данные из формы и отправить их через wp.ajax.post() или стандартный fetch:
jQuery('#booking-form').on('submit', function(e) {
e.preventDefault();
const formData = jQuery(this).serialize();
jQuery.post({
url: ajaxurl,
data: {
action: 'send_booking',
...Object.fromEntries(new URLSearchParams(formData))
},
success: function(response) {
alert('Ваш запрос отправлен!');
},
error: function() {
alert('Ошибка при отправке формы');
}
});
});
5. Обработка данных на сервере
В PHP-регистрации AJAX-обработчика важно учитывать безопасность: использовать wp_verify_nonce(), sanitize_* функции и фильтрацию данных.
add_action( 'wp_ajax_send_booking', 'send_booking' );
add_action( 'wp_ajax_nopriv_send_booking', 'send_booking' );
function send_booking() {
check_ajax_referer( 'booking_nonce', 'nonce' );
$name = sanitize_text_field( $_POST['name'] );
$email = sanitize_email( $_POST['email'] );
$phone = sanitize_text_field( $_POST['phone'] );
$price = esc_html( $_POST['price'] );
$location = esc_html( $_POST['location'] );
$admin_email = get_option( 'admin_email' );
$message = "Имя: $name\nEmail: $email\nТелефон: $phone\nЦена: $price\nЛокация: $location";
$subject = 'Новое бронирование';
if ( wp_mail( $admin_email, $subject, $message ) ) {
wp_send_json_success( 'ok' );
} else {
wp_send_json_error( 'mail_failed' );
}
}
6. Как передать данные из метабоксов и таксономий
Иногда нужно добавить в форму значения не только из метаполей, но и из таксономий или связанных постов (например, “агент”, “страна”, “город”).
Для этого:
- получаем данные из
get_post_meta()илиget_the_terms(); - формируем строку и передаём её как значение в
input type="hidden".
$agent = get_the_terms( get_the_ID(), 'agent' );
$agent_name = $agent ? $agent[0]->name : '';
echo '<input type="hidden" name="agent" value="' . esc_attr( $agent_name ) . '">';
7. Многоязычные сайты и передача переведённых данных
Если сайт многоязычный (WPML, Polylang), можно передавать переводы прямо через параметры AJAX-запроса. Например, заголовок письма или текст уведомления берётся из текущей языковой версии:
$subject = __( 'Новое бронирование', 'theme-textdomain' );
8. Безопасность и защита от XSS
Даже при работе с собственным сайтом не стоит пренебрегать экранированием и валидацией данных:
- используйте
sanitize_text_field(),sanitize_email(),esc_html()для очистки входных данных; - не выводите данные без
esc_html()илиesc_attr(); - добавляйте nonce для каждого AJAX-запроса.
9. Заключение
Используя AJAX-формы в WordPress, можно организовать удобный обмен данными между фронтендом и сервером — без перезагрузки страницы и с высокой степенью безопасности. Функция wp_mail() обеспечивает корректную отправку писем как клиенту, так и администратору, а скрытые поля позволяют гибко передавать любые параметры: цену, локацию, ID агента и т.д.
Такой подход особенно полезен в проектах с бронированием, заказами или динамическими формами обратной связи — когда важна скорость, удобство и точность обработки данных.