Cómo elegir el destinatario de correo en Contact Form 7 según el estado de la dirección y guardar en la base de datos
Situación
Cuando un visitante completa un formulario en el sitio web, ingresa:
- Nombre
- Teléfono
- Dirección (Calle, Ciudad, Estado, Código Postal)
- Mensaje
Necesito guardar esta información en la base de datos para referencia futura y necesito enviar un correo electrónico a una dirección central y a una dirección específica, que cambia según el estado del visitante.
Básicamente, los vendedores tienen territorios y los contactos del sitio web deben enviarse a la dirección de correo principal del sitio web, así como a la persona a cargo del territorio.
No todos los estados tienen un vendedor asignado.
Pasos Realizados
Instalé Contact Form DB para guardar todos los envíos en la base de datos.
Estoy usando el método descrito en el sitio web de Contact Form 7 para seleccionar el destinatario - Destinatario Seleccionable con Tuberías. Estoy usando el nombre del estado como menú desplegable seleccionable y la dirección de correo del vendedor después de la tubería.
[select* state
"Alabama|john@example.com"
"Alaska"
"Arizona|john@example.com"
"Arkansas|mary@example.com"
"California|mary@example.com"
"Colorado"
]
Configuré el "Mail" de CF7 para enviar a la dirección de correo central del sitio web y a la dirección del vendedor que opera en el estado seleccionado.
central@example.com,[state]
Los Problemas
Cuando un visitante selecciona un estado que tiene un vendedor asignado, la dirección de correo del vendedor se ingresa en la base de datos, no el estado.
Cuando un visitante selecciona un nombre de estado que no tiene un vendedor designado, el nombre del estado se ingresa en la base de datos, pero no se envía ningún correo.
También intenté configurar "Mail" para enviar a central@example.com
y "Mail (2)" para enviar a [state]
(dirección de correo del vendedor), sin embargo, no se envió ningún correo a central@example.com
cuando no se proporcionó una dirección de correo para el nombre del estado en el menú desplegable.
Por último, intenté ingresar el nombre del estado en este formato - "Alaska|"
. En este caso, no se ingresó nada en la base de datos para state
y no se envió ningún correo. Probé esto usando ambas opciones de "Mail" mencionadas anteriormente.
¿La Solución?
Ahora entiendo que simplemente puedo ingresar central@example.com
para todos los nombres de estados sin un vendedor designado - y eso está bien.
El problema con esto - la dirección de correo todavía se ingresa en la base de datos para state
.
Me imagino que necesito una forma de tomar el nombre del estado ([_raw_state]) y pasarlo a un campo oculto de CF7, para que pueda guardarse en la base de datos, pero no logro descubrir cómo.

Gracias a Michael Simpson, de Contact Form DB. La solución está listada (algo oculta) en el sitio web de Contact Form DB en el artículo - CF7 Menús con Pipes
Añade a functions.php
function myFilter($formData) {
// Cambia $formData
return $formData; // asegúrate de devolverlo
}
add_filter('cfdb_form_data', 'myFilter');
function location_form_handler($formData)
{
$formName = 'ExtendedContact'; // cambia esto por el nombre de tu formulario
$fieldName = 'state'; // cambia esto por el nombre de tu campo
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) {
// valor|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');
Esto creará una entrada en la base de datos con el nombre del estado (campo antes del pipe) como state
y un segundo campo (dirección de email después del pipe) con la dirección de email asociada como state_email
.
Finalmente, actualiza la definición del formulario en Contact Form 7 así: [state_email]
NOTA
También quiero mencionar, por si alguien más se encuentra con esta situación -
En mi formulario, los visitantes que lo completan seleccionan el estado en el que se encuentran, luego el vendedor responsable de ese estado recibe el email. Además, necesitaba que el email se enviara a una dirección de email central (corporativa).
Sin embargo, no todos los estados tienen un vendedor asignado, ya que la empresa se enfoca en el medio oeste.
Con Contact Form 7, si la dirección de email después del pipe estaba vacía, los emails no se enviaban en absoluto. El método descrito por Michael en realidad permite un campo vacío después del pipe.
Configuré "Mail" en el formulario para enviar al email central y "Mail (2)" para enviar al vendedor (si existe uno).
