Как выбрать получателя email в Contact Form 7 на основе поля выбора штата и сохранить в базу данных
Ситуация
Когда посетитель заполняет форму на сайте, он вводит:
- Имя
- Телефон
- Адрес (Улица, Город, Штат, Почтовый индекс)
- Сообщение
Мне нужно сохранить эту информацию в базе данных для дальнейшего использования и отправить email на центральный адрес электронной почты, а также на определенный email-адрес, который меняется в зависимости от штата посетителя.
По сути, у продавцов есть территории, и контакты с веб-сайта должны отправляться как на основной email сайта, так и человеку, ответственному за территорию.
Не все штаты имеют назначенного продавца.
Предпринятые шаги
Я установил Contact Form DB для сохранения всех отправленных форм в базу данных.
Я использую метод, описанный на сайте Contact Form 7 для выбора получателя - Выбираемый получатель с использованием символа '|'. Я использую название штата как выпадающий список и email продавца после символа '|'.
[select* state
"Alabama|john@example.com"
"Alaska"
"Arizona|john@example.com"
"Arkansas|mary@example.com"
"California|mary@example.com"
"Colorado"
]
Я настроил "Mail" в CF7 для отправки на центральный email сайта и на email продавца, работающего в выбранном штате.
central@example.com,[state]
Проблемы
Когда посетитель выбирает штат с назначенным продавцом, email продавца сохраняется в базе данных вместо названия штата.
Когда посетитель выбирает штат, у которого нет назначенного продавца, название штата сохраняется в базе данных, но email не отправляется.
Я также пробовал настроить "Mail" для отправки на central@example.com
и "Mail (2)" для отправки на [state]
(email продавца), однако письмо не отправлялось на central@example.com
, когда для названия штата в выпадающем списке не был указан email.
Наконец, я попробовал ввести название штата в формате - "Alaska|"
. В этом случае ничего не сохранялось в базе данных для поля state
и email не отправлялся. Я тестировал это, используя оба варианта настройки "Mail", описанных выше.
Решение?
Теперь я понимаю, что могу просто ввести central@example.com
для всех названий штатов без назначенного продавца - и это нормально.
Проблема в том, что email-адрес все равно сохраняется в базе данных для поля state
.
Полагаю, мне нужен способ взять название штата ([_raw_state]) и передать его в скрытое поле CF7, чтобы оно могло быть сохранено в базе данных, но я не могу понять, как это сделать.

Благодарность Майклу Симпсону из Contact Form DB. Решение (довольно скрыто) представлено на сайте Contact Form DB в статье - CF7 Меню с разделителями |
Добавьте в functions.php:
function myFilter($formData) {
// Изменяем $formData
return $formData; // обязательно возвращаем данные
}
add_filter('cfdb_form_data', 'myFilter');
function location_form_handler($formData)
{
$formName = 'ExtendedContact'; // измените на название вашей формы
$fieldName = 'state'; // измените на название вашего поля
if ($formData && $formName == $formData->title && $formData->scanned_form_tags) {
$emailSelected = $formData->posted_data[$fieldName];
$valueSelected = null;
foreach ($formData->scanned_form_tags as $tag) {
if ($tag['name'] == $fieldName) {
foreach ($tag['raw_values'] as $rawValue) {
// значение|email
$valuesArray = explode('|', $rawValue);
if (count($valuesArray) == 2 && $valuesArray[1] == $emailSelected) {
$valueSelected = $valuesArray[0];
break;
}
}
}
if ($valueSelected != null) {
break;
}
}
if ($valueSelected != null) {
$formData->posted_data[$fieldName] = $valueSelected;
$formData->posted_data[$fieldName . '_email'] = $emailSelected;
}
}
return $formData;
}
add_filter('cfdb_form_data', 'location_form_handler');
Это создаст запись в базе данных с названием штата (значение до символа |) в поле state
и второе поле (email после символа |) с соответствующим email-адресом в поле state_email
.
Наконец, обновите определение формы в Contact Form 7 следующим образом: [state_email]
ПРИМЕЧАНИЕ
Также хочу упомянуть на случай, если кто-то столкнётся с подобной ситуацией:
В моей форме посетители выбирают штат, в котором находятся, после чего письмо отправляется ответственному за этот штат продавцу. Кроме того, мне нужно было, чтобы письмо отправлялось на центральный (корпоративный) email-адрес.
Однако не все штаты имеют назначенного продавца, так как компания сосредоточена на среднем западе.
В Contact Form 7, если поле email после символа | было пустым, письма вообще не отправлялись. Метод, предложенный Майклом, фактически позволяет оставлять поле после | пустым.
Я настроил "Почту" в форме для отправки на центральный email и "Почту (2)" для отправки продавцу (если он существует).
