Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Using Contact Form 7

Situation

When a visitor fills out a form on the website, they enter:

  • Name
  • Email
  • Phone
  • Address (Street, City, State, Zip Code)
  • Message

I need to save this information to the database for future reference and I need to send an email to a central email address and to a specific email address, which changes depending upon the state of the visitor.

Basically, salespeople have territories and contacts from the website need to be sent to the main website email address as well as the person in charge of the territory.

Not all states have an assigned salesperson.

Steps Taken

I installed Contact Form DB to save all submissions to the database.

I am using the method described on the Contact Form 7 website to select the recipient - Selectable Recipient with Pipes. I am using the state name as the selectable dropdown and the salesperson's email address following the pipe.

[select* state 
"Alabama|john@example.com"
"Alaska"
"Arizona|john@example.com"
"Arkansas|mary@example.com"
"California|mary@example.com"
"Colorado"
]

I set up CF7's "Mail" to send to the website's central email address and to the salesperson's email address who operates in the selected state.

central@example.com,[state]

The Problems

When a visitor selects a state that has an assigned salesperson, the salesperson's email address is entered into the database, not the state.

When a visitor selects a state name that does not have a designated salesperson, the state name is entered into the database, but no email is sent.

I also tried setting up "Mail" to send to central@example.com and "Mail (2)" to send to [state] (salesperson's email address), however no email was sent to central@example.com when an email address was not provided for the state name in the dropdown.

Lastly, I tried entering the state name in this format - "Alaska|". In this case, nothing was entered into the database for state and no email was sent. I tested this using both of the "Mail" options listed above.

The Solution?

Now, I understand, I can simply enter central@example.com for all state names without a designated salesperson - and that's fine.

The problem with this - the email address is still entered into the database for state.

I imagine I need a way to take the state name ([_raw_state]) and pass it into a hidden CF7 field, so it can be saved to the database, but I cannot seem to figure out how.

share|improve this question

closed as off-topic by Pieter Goosen, birgire, Johannes Pille, s_ha_dum Oct 3 at 16:11

This question appears to be off-topic. The users who voted to close gave this specific reason:

If this question can be reworded to fit the rules in the help center, please edit the question.

1 Answer 1

up vote 2 down vote accepted

Thanks to Michael Simpson, from Contact Form DB. The solution is listed (kind of hidden) on the Contact Form DB website in the article - CF7 Menus with Pipes

Add to functions.php

function myFilter($formData) {
// Change $formData
return $formData; // be sure to return it
}

add_filter('cfdb_form_data', 'myFilter');

function location_form_handler($formData)
{
$formName = 'ExtendedContact'; // change this to your form's name
$fieldName = 'state'; // change this to your field's name
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) {
                // value|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');

This will create an entry in the database with the state name (field before the pipe) as state and a second field (email address after the pipe) with the associated email address as state_email.

Finally, update the form definition in Contact Form 7 thus: [state_email]

NOTE

I also want to mention, in case someone else comes across this situation -

In my form, visitors who fill out the form select the state they are located in, then the salesperson who is responsible for that state receives the email. As well, I needed the email to be sent to a central (corporate) email address.

However, not all states have an assigned salesperson, being the company focuses on the mid-west.

With Contact Form 7, if the email address after the pipe was empty, emails would not be sent at all. The method outlined by Michael actually allows an empty field after the pipe.

I set up "Mail" in the form to send to the central email and "Mail (2)" to send to the salesperson (if one exists).

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.