Come scegliere il destinatario email in Contact Form 7 in base allo stato inserito nel form e salvare nel database
Situazione
Quando un visitatore compila un modulo sul sito web, inserisce:
- Nome
- Telefono
- Indirizzo (Via, Città, Stato, CAP)
- Messaggio
Ho bisogno di salvare queste informazioni nel database per riferimento futuro e devo inviare un'email sia a un indirizzo email centrale che a un indirizzo email specifico, che cambia a seconda dello stato del visitatore.
In pratica, i venditori hanno territori e i contatti dal sito web devono essere inviati sia all'indirizzo email principale del sito che alla persona responsabile del territorio.
Non tutti gli stati hanno un venditore assegnato.
Passaggi Effettuati
Ho installato Contact Form DB per salvare tutte le richieste nel database.
Sto utilizzando il metodo descritto sul sito di Contact Form 7 per selezionare il destinatario - Destinatario Selezionabile con Pipes. Sto usando il nome dello stato come menu a tendina selezionabile e l'indirizzo email del venditore dopo il pipe.
[select* state
"Alabama|john@example.com"
"Alaska"
"Arizona|john@example.com"
"Arkansas|mary@example.com"
"California|mary@example.com"
"Colorado"
]
Ho configurato "Mail" di CF7 per inviare all'indirizzo email centrale del sito web e all'indirizzo email del venditore che opera nello stato selezionato.
central@example.com,[state]
I Problemi
Quando un visitatore seleziona uno stato che ha un venditore assegnato, l'indirizzo email del venditore viene inserito nel database, non lo stato.
Quando un visitatore seleziona il nome di uno stato che non ha un venditore designato, il nome dello stato viene inserito nel database, ma non viene inviata alcuna email.
Ho anche provato a configurare "Mail" per inviare a central@example.com
e "Mail (2)" per inviare a [state]
(indirizzo email del venditore), tuttavia non è stata inviata alcuna email a central@example.com
quando non era fornito un indirizzo email per il nome dello stato nel menu a tendina.
Infine, ho provato a inserire il nome dello stato in questo formato - "Alaska|"
. In questo caso, nulla è stato inserito nel database per state
e non è stata inviata alcuna email. Ho testato questo utilizzando entrambe le opzioni "Mail" elencate sopra.
La Soluzione?
Ora, capisco che posso semplicemente inserire central@example.com
per tutti i nomi di stato senza un venditore designato - e va bene così.
Il problema con questo - l'indirizzo email viene comunque inserito nel database per state
.
Immagino di aver bisogno di un modo per prendere il nome dello stato ([_raw_state]) e passarlo in un campo nascosto di CF7, in modo che possa essere salvato nel database, ma non riesco a capire come fare.

Grazie a Michael Simpson, di Contact Form DB. La soluzione è elencata (in modo un po' nascosto) sul sito web di Contact Form DB nell'articolo - Menu CF7 con Pipes
Aggiungi al file functions.php
function myFilter($formData) {
// Modifica $formData
return $formData; // assicurati di restituirla
}
add_filter('cfdb_form_data', 'myFilter');
function location_form_handler($formData)
{
$formName = 'ExtendedContact'; // cambia questo con il nome del tuo form
$fieldName = 'state'; // cambia questo con il nome del tuo 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) {
// valore|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');
Questo creerà una voce nel database con il nome dello stato (campo prima della pipe) come state
e un secondo campo (indirizzo email dopo la pipe) con l'email associata come state_email
.
Infine, aggiorna la definizione del form in Contact Form 7 così: [state_email]
NOTA
Voglio anche menzionare, nel caso qualcun altro si trovi in questa situazione -
Nel mio form, i visitatori che compilano il modulo selezionano lo stato in cui si trovano, poi il venditore responsabile di quello stato riceve l'email. Inoltre, avevo bisogno che l'email fosse inviata anche a un indirizzo email centrale (aziendale).
Tuttavia, non tutti gli stati hanno un venditore assegnato, dato che l'azienda si concentra sul Midwest.
Con Contact Form 7, se l'indirizzo email dopo la pipe era vuoto, le email non venivano inviate affatto. Il metodo descritto da Michael permette invece di avere un campo vuoto dopo la pipe.
Ho impostato "Mail" nel form per inviare all'email centrale e "Mail (2)" per inviare al venditore (se esiste).
