Зачем
Обычная отправка формы в WordPress — это один вызов wp_mail(). Если почта в этот момент не ушла, заявка пропала, и никто об этом не узнал. ACH Mail сначала сохраняет заявку в журнал, потом отправляет её письмом и в группу Telegram, а если доставка сорвалась — повторяет сам. Тема передаёт заявку одной функцией, всё остальное делает плагин.
Плагин для разработчиков тем: формы остаются вашими, плагину нужен только вызов ach_mail_send() в обработчике формы.
Возможности
- Журнал заявок в админке: поиск, фильтры, карточка заявки, итог доставки по каждому каналу, повтор отправки, выгрузка в CSV.
- Письмо по аккуратному шаблону: поля таблицей, телефон и почта ссылками, состав корзины с итогом и доставкой, цвета под сайт.
- Получатели общие и отдельные для каждой формы, тема письма по шаблону, отправитель, SMTP.
- Telegram: бот подключается из админки — токен, поиск группы, тестовое сообщение. Заявка приходит с нажимаемым телефоном, корзиной списком и ссылкой на страницу.
- Повтор доставки с нарастающей паузой: через минуту, пять минут, полчаса и дальше. Ничего не теряется, даже если почта или Telegram недоступны.
- Защита форм без капчи и без токена в разметке: поле-ловушка, время на странице, лимит заявок с одного адреса. Работает и под кэшем страниц.
- Склейка дублей: двойной клик или повторная отправка — одна заявка.
- Срок хранения заявок: старые удаляются сами, персональные данные не копятся годами.
Как выглядит письмо
Пример
$r = ach_mail_send('order', [
'title' => 'Заказ из корзины',
'fields' => ['Имя' => $name, 'Телефон' => $phone],
'cart' => $cart,
'page' => $pageUrl,
]);
Telegram — по ключу
Почта, журнал и защита форм работают без ключа. Отправка заявок в Telegram включается ключом. Ключ выдаётся на один домен — напишите мне, и я пришлю его.
Условия ключа
- Ключ действует на одном сайте (домене). Тестовые копии сайта на своих поддоменах проверяются отдельно и место не занимают.
- Модуль Telegram не входит в архив плагина: он загружается с сервера лицензий после ввода ключа, собирается под конкретный ключ и проверяется подписью.
- Если ключ отозван, срок ключа истёк или модуль перенесён на другой сайт, модуль Telegram удаляется с сайта автоматически. Журнал заявок, настройки и почта при этом не затрагиваются.
- Копирование модуля на другие сайты запрещено. Копия сообщает о себе, ключ, с которого она сделана, может быть отозван.
Как работает плагин
Тема принимает форму как раньше: проверяет поля, показывает ошибки. Когда заявка готова, тема передаёт её в ach_mail_send(). Дальше плагин:
- проверяет защиту от роботов и лимит заявок с адреса посетителя;
- записывает заявку в журнал — с этого момента она не потеряется;
- отправляет письмо через
wp_mail()и, если подключён, сообщение в Telegram; - если канал не ответил, ставит повтор и доставляет заявку позже сам.
Вызов
if (function_exists('ach_mail_send')) {
$r = ach_mail_send('cart', [
'title' => 'Заказ из корзины',
'fields' => [
'Имя' => $name,
'Телефон' => $phone,
'E-mail' => $email,
],
'cart' => [
'items' => [
['name' => 'Товар', 'options' => 'Вариант', 'qty' => 2,
'price' => '1 500 ₽', 'sum' => '3 000 ₽', 'url' => $productUrl],
],
'total' => '3 000 ₽',
'delivery' => 'Самовывоз',
],
'page' => $pageUrl,
'source' => $utmSource,
]);
if (empty($r['ok'])) {
// показать посетителю $r['error']
}
}
Параметры
- Первый аргумент — код формы: латиница, цифры,
_и-. По нему в настройках задаются свои получатели формы и фильтруется журнал. title— заголовок заявки: тема письма ({form}в шаблоне темы) и первая строка сообщения в Telegram.fields— поля. Коротко['Подпись' => 'значение']или подробно[['label' => …, 'value' => …, 'type' => 'phone']]. Типphone,email,url,textareaилиtext; если не указан, плагин определит сам. Пустые значения пропускаются.cart— состав заказа: позиции (name,options,qty,price,sum,url),totalиdelivery. Суммы передаются готовыми строками — как их показывает сайт.page— адрес страницы, с которой ушла заявка.source— источник рекламы или любая метка кампании.files— адреса приложенных файлов.recipients— адреса от темы. Используются, только если в настройках плагина получатели не заданы.guard— проверять ли защиту от роботов, по умолчанию да. Для заявок, которые создаёт сам сервер, передайтеfalse.
Ответ
['ok' => true, 'id' => 15]— заявка принята и сохранена. Доставка могла уйти в повтор — это видно в журнале.['ok' => true, 'duplicate' => true, 'id' => 15]— та же заявка уже пришла недавно, второй раз не отправляется.['ok' => true, 'spam' => true]— заявку отправил робот. Отвечаем «успешно», чтобы робот не подбирал обход, и ничего не сохраняем.['ok' => false, 'error' => '…']— слишком много заявок с одного адреса. Текст можно показать посетителю.
Защита от роботов
Токен в разметке формы ломается под кэшем страниц: страница живёт в кэше дольше, чем токен, и настоящий посетитель получает отказ. Поэтому плагин опирается на то, что считает браузер.
ach_t— секунды от загрузки страницы до отправки. Человек тратит на форму больше нескольких секунд, робот отправляет сразу. Добавьте поле при отправке формы:formData.append('ach_t', (performance.now() / 1000).toFixed(1));ach_hp— поле-ловушка, скрытое от людей. Заполнено — значит, робот.- Лимит заявок в час с одного адреса — в настройках, по умолчанию 10.
Когда тема присылает ach_t во всех формах, включите в настройках «отклонять заявки без поля ach_t» — так отсекаются роботы, которые шлют запрос в обход страницы. Включайте через сутки после выката: у посетителей с открытой старой страницей поля ещё нет.
Хук для своих интеграций
После сохранения заявки срабатывает действие ach_mail_lead_saved — удобно отправить заявку в CRM или учётную систему.
add_action('ach_mail_lead_saved', function ($id, $form, $data, $args) {
// $data['fields'], $data['cart'], $data['page']
}, 10, 4);
Фильтр ach_mail_lead_data позволяет поправить данные заявки до сохранения.
Если плагин выключат
Проверка function_exists('ach_mail_send') оставляет теме запасной путь: простое письмо администратору сайта. Заявка не потеряется, а в админке стоит повесить предупреждение «включите ACH Mail».
Требования
- PHP 8.1 или новее, WordPress 6.0 или новее.
- Работающая почта сайта:
mail()хостинга или SMTP-сервер (настраивается в плагине). - WP-Cron или системный крон — через него идут повторы доставки и удаление старых заявок.
- Для Telegram — доступ сервера к
api.telegram.org. Если хостинг его не открывает, в настройках есть поле прокси.
Установка
- Загрузите архив в «Плагины → Добавить новый → Загрузить плагин» и активируйте. Обновления приходят в админку сами.
- Откройте «Заявки → Почта»: укажите получателей, отправителя на домене сайта и при необходимости SMTP. Отправьте тестовое письмо.
- Добавьте вызов
ach_mail_send()в обработчик форм темы — см. вкладку «Использование».
Подключение Telegram
- Создайте бота у @BotFather командой
/newbot— он пришлёт токен. - Введите ключ во вкладке «Лицензия» — модуль Telegram загрузится сам (на вкладке «Telegram» появится «Модуль Telegram: подключён»). Затем введите токен бота.
- Добавьте бота в группу заявок и напишите в группе
/start@имя_бота. Обычные сообщения в группе бот не видит, команду видит всегда. - Нажмите «Найти группы», выберите группу и отправьте тестовое сообщение.
Что хранит плагин
Заявки — в своей таблице {prefix}ach_mail_leads, настройки — в опции ach_mail_settings. При выключении плагина ничего не удаляется: включили снова — журнал и настройки на месте.
-
v1.1.1 последняя
Исправлено 1
- Собственная проверка модуля Telegram при загрузке выполнялась не всегда: функции модуля теперь объявляются только после неё. Признак «модуль подключён» — по константе, которую модуль ставит сам после проверки.
-
v1.1.0
Новое 1
- Состояние модуля и кнопка «Загрузить модуль» на вкладке Telegram.
Изменено 3
- Отправка в Telegram вынесена в модуль, который выдаётся сервером лицензий по ключу и только для этого сайта. В публичном архиве кода Telegram нет.
- Модуль проверяется подписью и контрольными суммами, подключается только при действующем ключе.
- Без права на модуль (нет ключа, ключ отозван или истёк, модуль скопирован на другой сайт, сервер не подтверждал ключ 30 дней) модуль удаляется. Журнал, настройки и почта не затрагиваются.
-
v1.0.1
Новое 3
- Имя бота на вкладке Telegram (проверка токена при сохранении), поле для ручного ввода ID группы.
- В инструкции — команда /start@бот: обычные сообщения в группе бот не видит, а команду видит всегда.
- Ссылка «Настройки» в списке плагинов; разовый перенос получателей и отправителя из настроек темы.
Исправлено 1
- Telegram на хостинге с неровной связью: соединение ждём 4 с и повторяем до 3 раз для кнопок в админке; раньше один зависший запрос (10 с) ронял «Найти группы» и тестовое сообщение.
-
v1.0.0
Новое 6
- Журнал заявок с итогом доставки по каналам, повтор, удаление, выгрузка CSV, срок хранения.
- Письмо по своему шаблону: получатели общие и по формам, тема, отправитель, SMTP, цвета.
- Telegram: подключение бота из админки, поиск групп, тестовое сообщение, корзина списком.
- Защита форм: ловушка, время заполнения, лимит с IP; склейка дублей.
- Совместимость с кодом тем под Async Mailer.
- Лицензия на платные каналы, обновления с alekseychikun.ru.