Для многих проектов на WordPress возникает необходимость принимать данные через POST-запросы и отправлять на их основе email-письма. Стандартные формы и плагины не всегда подходят под специфические задачи, и тогда стоит реализовать собственный POST функционал с обработкой данных и отправкой почты.
Почему стоит создавать собственный POST обработчик в WordPress
В отличие от стандартных форм, кастомный POST функционал позволяет гибко обрабатывать любые данные, валидировать и фильтровать их по своим правилам, а также интегрироваться с любыми почтовыми сервисами через API. Это даёт полный контроль над процессом и повышает безопасность.
Также собственный обработчик можно защитить от CSRF-атак, настроить логирование ошибок и легко масштабировать под новые задачи.
Ниже рассмотрим поэтапно, как создать такой функционал с разбором кода.
Создание POST обработчика через REST API WordPress
Самый современный и рекомендуемый способ — использовать REST API для приёма POST-запросов.
Регистрация собственного REST маршрута
Добавим в файл functions.php вашей темы или в функционал плагина следующий код:
add_action('rest_api_init', function() {
register_rest_route('wpmail/v1', '/send-email', [
'methods' => 'POST',
'callback' => 'wpmail_send_email_handler',
'permission_callback' => '__return_true', // Для примера, позже о безопасности
]);
});Здесь мы регистрируем маршрут /wp-json/wpmail/v1/send-email, который будет принимать POST-запросы.
Обработка данных и отправка письма
Теперь создадим функцию-обработчик wpmail_send_email_handler:
function wpmail_send_email_handler(WP_REST_Request $request) {
$params = $request->get_json_params();
// Проверка обязательных полей
if (empty($params['email']) || empty($params['subject']) || empty($params['message'])) {
return new WP_REST_Response(['error' => 'Не указаны обязательные поля'], 400);
}
$email = sanitize_email($params['email']);
$subject = sanitize_text_field($params['subject']);
$message = sanitize_textarea_field($params['message']);
if (!is_email($email)) {
return new WP_REST_Response(['error' => 'Некорректный email'], 400);
}
$headers = ['Content-Type: text/html; charset=UTF-8'];
$sent = wp_mail($email, $subject, nl2br($message), $headers);
if (!$sent) {
return new WP_REST_Response(['error' => 'Ошибка отправки письма'], 500);
}
return ['success' => true, 'message' => 'Письмо успешно отправлено'];
}В этой функции мы получаем JSON из POST, валидируем и очищаем данные, отправляем письмо стандартным методом WordPress wp_mail. Это простейшая реализация для старта.
Как защитить POST обработчик от злоупотреблений
Важно не открывать точку приема POST-запросов всем подряд, иначе спам и атаки обеспечены. Вот несколько советов:
- Добавьте проверку nonce или API ключа в заголовках.
- Ограничьте количество запросов с одного IP через плагин типа Clearfy Pro или Rate Limiting сервисы.
- Используйте фильтры для валидации и очистки данных.
Пример добавления проверки API ключа
function wpmail_permission_callback(WP_REST_Request $request) {
$headers = $request->get_headers();
if (empty($headers['x-api-key'][0]) || $headers['x-api-key'][0] !== 'ваш_секретный_ключ') {
return new WP_Error('forbidden', 'Недостаточно прав', ['status' => 403]);
}
return true;
}
// В регистрации маршрута замените permission_callback
// 'permission_callback' => 'wpmail_permission_callback',Это простой способ защитить API от неавторизованных вызовов.
Использование плагинов для расширения функционала отправки почты
Если вам нужно интегрировать более продвинутые почтовые сервисы, например, SendGrid, Mailgun или Postmark, можно использовать соответствующие плагины из WPShop и изменить в функции wpmail_send_email_handler вызов wp_mail на отправку через API выбранного сервиса.
Например, для Mailgun можно использовать плагин Mailgun, который заменит стандартный wp_mail на вызовы API с поддержкой логирования и отслеживания.
Тестирование POST функционала с помощью curl и Postman
Для проверки работы вашего API можно использовать утилиту curl или Postman.
Пример запроса curl:
curl -X POST https://ваш-сайт.ru/wp-json/wpmail/v1/send-email \
-H "Content-Type: application/json" \
-H "X-API-Key: ваш_секретный_ключ" \
-d '{"email":"test@example.com","subject":"Тест","message":"Привет! Это тестовое письмо."}'Если всё настроено правильно, вы получите ответ с подтверждением отправки.
Логирование и отладка ошибок отправки писем
Для контроля работы полезно добавить логирование. Можно использовать встроенный PHP error_log или плагины, например Clearfy Pro с расширенным логированием.
Добавим в обработчик пример логирования ошибок:
if (!$sent) {
error_log('WP Mail Error: Не удалось отправить письмо на ' . $email);
return new WP_REST_Response(['error' => 'Ошибка отправки письма'], 500);
}Это поможет быстро выявлять проблемы в продакшене.
Итоговые рекомендации по созданию собственного POST функционала для email в WordPress
1. Используйте REST API для гибкости и стандартов.
2. Обязательно валидируйте и очищайте все входящие данные.
3. Защищайте API ключами или nonce.
4. Интегрируйте с почтовыми сервисами через плагины для надежности.
5. Тестируйте API с помощью curl/Postman.
6. Ведите логи ошибок для отладки.
7. При необходимости расширяйте функционал, добавляя очереди отправки и повторные попытки.
Такой подход позволит создать надежный и масштабируемый механизм отправки писем через собственный POST функционал в WordPress, идеально подходящий под уникальные задачи проекта.