I think this can be achieved.
My first thought was just to use endpoints and modify the recipient email based on the query string. But looking at formidable hooks, the only one I see suitable for this is the frm_to_email
filter. which is applied just after send (where our query string are not longer available).
But we can still work around that issue by using the $_POST
variable and it’s _wp_http_referer
key.
We would still need to add an endpoint to WP, if not we would get 404 errors because WP wouldn’t know what to do with the dynamic URL.
Assuming the following,
- Your form is on a page called form
- We will use an endpoint referer to identify the incoming request so we would have a relative URL looking like /form/referer/bob, where bob is the variable part of the incoming URL
so first let’s add our endpoint
add_action( 'init', 'wpse_235869_add_endpoint');
function wpse_235869_add_endpoint() {
add_rewrite_endpoint( 'referer', EP_PAGES ); // EP_PAGES is mask telling to listen for the referer endpoint on all PAGES
}
this added an endpoint which would translate in a query string like /form?referer=bob
Then we need to tell WP to listen for our new query string referer
add_filter( 'query_vars', 'wpse_235869_add_queryvars' );
function wpse_235869_add_queryvars( $query_vars ) {
$query_vars[] = 'referer';
return $query_vars;
}
Once this is done, we can move on to write our formidable form filter.
Upon sending of the form, a $_POST
variable is created with a our _wp_http_referer
key, which, in this example, would be [_wp_http_referer] => /form/referer/bob/
so our formidable filter would look something like this
add_filter('frm_to_email', 'custom_set_email_value', 10, 4);
function custom_set_email_value($recipients, $values, $form_id, $args){
if( isset($_POST['_wp_http_referer']) ) {
preg_match( '#/form/referer/#', $_POST['_wp_http_referer'], $matches ); // check for our endpoint pattern so we don't try to modify recipients on regular forms.
if ( $matches[0] != '/form/referer/') // If the _wp_http_referer does not match our endpoint, bail out.
return $recipients;
$referer = explode( '/form/referer', $_POST['_wp_http_referer'] )[1]; // get our recipient from the referer.
$recipient = str_replace( "https://wordpress.stackexchange.com/", '' , $referer ); // remove forward slashes from $rerefer so we can use in email address.
$recipients[0] = $recipient . '@example.com'; // rebuild our recipients array before sending. This, in our example, would be [email protected]
}
return $recipients;
}