How to hook into Contact Form 7 Before Send
I had to do this to prevent Email from being sent. Hope it helps.
/*
Prevent the email sending step for specific form
*/
add_action("wpcf7_before_send_mail", "wpcf7_do_something_else");
function wpcf7_do_something_else($cf7) {
// get the contact form object
$wpcf = WPCF7_ContactForm::get_current();
// if you wanna check the ID of the Form $wpcf->id
if (/*Perform check here*/) {
// If you want to skip mailing the data, you can do it...
$wpcf->skip_mail = true;
}
return $wpcf;
}
This code assumes that you are running the latest version of CF7 your code above used to work until a couple months ago when they went and did some refactoring of the code. [Apr 28 '15]
Since WPCF7 5.2 the wpcf7_before_send_mail
hook has changed quite a lot. For reference, here is how to work with this hook in 5.2+
Skip mail
function my_skip_mail() {
return true; // true skips sending the email
}
add_filter('wpcf7_skip_mail','my_skip_mail');
Or add skip_mail
to the Additional Settings tab on your form in the admin area.
Getting the Form ID or Post ID
function wpcf7_before_send_mail_function( $contact_form, $abort, $submission ) {
$post_id = $submission->get_meta('container_post_id');
$form_id = $contact_form->id();
// do something
return $contact_form;
}
add_filter( 'wpcf7_before_send_mail', 'wpcf7_before_send_mail_function', 10, 3 );
Get user inputted data
function wpcf7_before_send_mail_function( $contact_form, $abort, $submission ) {
$your_name = $submission->get_posted_data('your-field-name');
// do something
return $contact_form;
}
add_filter( 'wpcf7_before_send_mail', 'wpcf7_before_send_mail_function', 10, 3 );
Send the email to a dynamic recipient
function wpcf7_before_send_mail_function( $contact_form, $abort, $submission ) {
$dynamic_email = '[email protected]'; // get your email address...
$properties = $contact_form->get_properties();
$properties['mail']['recipient'] = $dynamic_email;
$contact_form->set_properties($properties);
return $contact_form;
}
add_filter( 'wpcf7_before_send_mail', 'wpcf7_before_send_mail_function', 10, 3 );
I'd like to add that you could just use the wpcf7_skip_mail
filter:
add_filter( 'wpcf7_skip_mail', 'maybe_skip_mail', 10, 2 );
function maybe_skip_mail( $skip_mail, $contact_form ) {
if( /* your condition */ )
$skip_mail = true;
return $skip_mail;
}