Sidney Sousa
Sidney Sousa

Reputation: 3604

Contact Form 7 filter is affecting all the forms on the site

I found a filter that allows me to customize the structure of contact form 7 emails via functions.php and the code looks like this:

add_filter('wpcf7_mail_components','my_custom_mail', 10,2);
function my_custom_mail($mail_component, $contact_form){
    $mail_component['subject']; //email subject
    $mail_component['sender']; //sender field (from)
    $mail_component['body']; //email body
    $mail_component['recipient']; //email recipient (to)
    $mail_component['additional_headers']; //email headers, cc:, bcc:, reply-to:
    $mail_component['attachments']; //file attachments if any

    $key_values = array();
    $tags = $contact_form->scan_form_tags(); //get your form tags
    foreach($tags as $tag){
        $field_name  = $tag['name'];
        if(isset($_POST[$field_name]) && !empty($_POST[$field_name])){
          //get all the submitted fields form your form
            $key_values[$field_name] = $_POST[$field_name]; 
        }
    }

    $body = "Dear \n" 
            . "First Name: {$key_values['first-name']} \n"
            . "Email: {$key_values['first-email']} \n"
            . "Phone Number: {$key_values['phone-number']} \n"
            . "Delivery Details: {$key_values['delivery-details']} \n"
            . "Suburb: {$key_values['suburb']} \n"
            . "Postal Code: {$key_values['post-code']} \n"
            . "State: {$key_values['state']} \n"
            . "Country: {$key_values['country']} \n"
            . "Wine Number: {$key_values['wine-member']} \n"
            . ($key_values['menu-324'] != 'Select wine' ? ($key_values['menu-324'] . ': ') : ' ') . $key_values['number-583'] . "\n"
            . ($key_values['menu-325'] != 'Select wine' ? ($key_values['menu-325'] . ': ') : ' ') . $key_values['number-584'] . "\n"
            . ($key_values['menu-326'] != 'Select wine' ? ($key_values['menu-326'] . ': ') : ' ') . $key_values['number-585'] . "\n"
            . ($key_values['menu-327'] != 'Select wine' ? ($key_values['menu-327'] . ': ') : ' ') . $key_values['number-586'] . "\n"
            . ($key_values['menu-328'] != 'Select wine' ? ($key_values['menu-328'] . ': ') : ' ') . $key_values['number-587'] . "\n"
            . ($key_values['menu-329'] != 'Select wine' ? ($key_values['menu-329'] . ': ') : ' ') . $key_values['number-588'] . "\n"
            . "Delivery Notes: {$key_values['delivery-notes']} \n";

    $mail_component['body'] = $body;
    return $mail_component;
}

However, whilst testing all the emails on the website, I noticed that the code from my functions affected all the forms. Is there a way I can perhaps add that filter for a specific form name or at least load the filter based on the page request url?

Upvotes: 0

Views: 1221

Answers (1)

Nick
Nick

Reputation: 356

This should work, although I couldn't test it at the time. I believe you can check the form ID in order to apply the filter or not. Just change the 1234 with the form id you want. If ID matches, $mail_component will be modified before being sent, if not, no modifications will be done.

add_filter('wpcf7_mail_components','my_custom_mail', 10,2);
function my_custom_mail($mail_component, $contact_form){
    if($wpcf7->id() == 1234){
        $mail_component['subject']; //email subject
        $mail_component['sender']; //sender field (from)
        $mail_component['body']; //email body
        $mail_component['recipient']; //email recipient (to)
        $mail_component['additional_headers']; //email headers, cc:, bcc:, reply-to:
        $mail_component['attachments']; //file attachments if any

        $key_values = array();
        $tags = $contact_form->scan_form_tags(); //get your form tags
        foreach($tags as $tag){
            $field_name  = $tag['name'];
            if(isset($_POST[$field_name]) && !empty($_POST[$field_name])){
              //get all the submitted fields form your form
                $key_values[$field_name] = $_POST[$field_name]; 
            }
        }

        $body = "Dear \n" 
                . "First Name: {$key_values['first-name']} \n"
                . "Email: {$key_values['first-email']} \n"
                . "Phone Number: {$key_values['phone-number']} \n"
                . "Delivery Details: {$key_values['delivery-details']} \n"
                . "Suburb: {$key_values['suburb']} \n"
                . "Postal Code: {$key_values['post-code']} \n"
                . "State: {$key_values['state']} \n"
                . "Country: {$key_values['country']} \n"
                . "Wine Number: {$key_values['wine-member']} \n"
                . ($key_values['menu-324'] != 'Select wine' ? ($key_values['menu-324'] . ': ') : ' ') . $key_values['number-583'] . "\n"
                . ($key_values['menu-325'] != 'Select wine' ? ($key_values['menu-325'] . ': ') : ' ') . $key_values['number-584'] . "\n"
                . ($key_values['menu-326'] != 'Select wine' ? ($key_values['menu-326'] . ': ') : ' ') . $key_values['number-585'] . "\n"
                . ($key_values['menu-327'] != 'Select wine' ? ($key_values['menu-327'] . ': ') : ' ') . $key_values['number-586'] . "\n"
                . ($key_values['menu-328'] != 'Select wine' ? ($key_values['menu-328'] . ': ') : ' ') . $key_values['number-587'] . "\n"
                . ($key_values['menu-329'] != 'Select wine' ? ($key_values['menu-329'] . ': ') : ' ') . $key_values['number-588'] . "\n"
                . "Delivery Notes: {$key_values['delivery-notes']} \n";

        $mail_component['body'] = $body;
    }
    return $mail_component;
}

Upvotes: 1

Related Questions