Elementor dynamic email issue
April 25, 2025 Β· AI Conversations
$form_name = $record->get_form_settings('form_name');
if ('Home Form' !== $form_name) {
return;
}
$raw_fields = $record->get('fields');
$department = '';
foreach ($raw_fields as $id => $field) {
if ($id === 'field_17e133f') {
$department = $field['value'];
break;
}
}
$email_map = [
'neustadt' => 'neeraj.tiwari@nethues.com',
'oldenburg' => 'Oldenburg@auto-lange.de',
'wismar' => 'wismar@auto-lange.de',
];
update_option('elementor_cf', $email_map[$department]);
if (array_key_exists($department, $email_map)) {
update_option('elementor_cf_mail', $email_map[$department]);
$email_to = $email_map[$department];
// Set the form's email recipient dynamically
$form_settings = $record->get_form_settings(null);
// Make sure the form has 'email' action
if (!empty($form_settings['email'])) {
$form_settings['email']['to'] = $email_to;
$record->update_form_settings($form_settings);
}
}
}, 10, 2);
MAIL NOT going here but defult mail set to elementor is received email
### π Why this happens
– `elementor_pro/forms/new_record` runs **after the form submission is processed**, including email sending.
– So, updating the `email.to` setting at this point has no effect.
—
### β Working Solution: Use `elementor_pro/forms/validation` filter
Use the `elementor_pro/forms/validation` filter instead, which runs **before** the email is sent. Here's how you can dynamically change the recipient:
add_filter('elementor_pro/forms/validation', function($record, $ajax_handler) {
$form_name = $record->get_form_settings('form_name');
if ('Home Form' !== $form_name) {
return;
}
$raw_fields = $record->get('fields');
$department = '';
foreach ($raw_fields as $id => $field) {
if ($id === 'field_17e133f') {
$department = $field['value'];
break;
}
}
$email_map = [
'neustadt' => 'neeraj.tiwari@nethues.com',
'oldenburg' => 'Oldenburg@auto-lange.de',
'wismar' => 'wismar@auto-lange.de',
];
if (array_key_exists($department, $email_map)) {
update_option('elementor_cf_mail', $email_map[$department]);
$form_settings = $record->get_form_settings();
$form_settings['email']['to'] = $email_map[$department];
$record->update_form_settings($form_settings);
}
}, 10, 2);
—
### β
Things to Double Check
– Ensure `field_17e133f` is the correct **ID** of your department field (not the label).
– Elementor email **"Actions After Submit"** β ensure **Email** is enabled and not overridden by another custom handler.
– Clear any Elementor cache or plugin cache if enabled.
Let me know if you want to log debug output or check actual values being captured.
—
### β
Step 1: Enable WP Debug Mode (temporarily)
Edit your `wp-config.php` and enable debugging:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false); // Keeps the error hidden on frontend
Then, check the log in:
/wp-content/debug.log
—
### β Step 2: Common Error Fixes
Here's a refined and **safe version** of your code with error prevention:
add_filter('elementor_pro/forms/validation', function($record, $ajax_handler) {
try {
$form_name = $record->get_form_settings('form_name');
if ('Home Form' !== $form_name) {
return;
}
$raw_fields = $record->get('fields');
$department = '';
foreach ($raw_fields as $id => $field) {
if ($id === 'field_17e133f') {
$department = $field['value'];
break;
}
}
$email_map = [
'neustadt' => 'neeraj.tiwari@nethues.com',
'oldenburg' => 'Oldenburg@auto-lange.de',
'wismar' => 'wismar@auto-lange.de',
];
if (!empty($department) && isset($email_map[$department])) {
$email_to = $email_map[$department];
update_option('elementor_cf_mail', $email_to);
$form_settings = $record->get_form_settings();
if (isset($form_settings['email']) && is_array($form_settings['email'])) {
$form_settings['email']['to'] = $email_to;
$record->update_form_settings($form_settings);
}
}
} catch (Throwable $e) {
error_log('Elementor form error: ' . $e->getMessage());
}
}, 10, 2);
—
### β
Step 3: Things to Check
1. β
Is `'field_17e133f'` the correct field ID? If unsure, log or `var_dump($raw_fields);` and submit the form.
2. β
Did you leave out a semicolon or bracket in your PHP?
3. β
Are you sure `email` is defined in the form settings?
—
### β
Optional: Log debug info
You can add:
error_log(print_r($form_settings, true));
error_log(print_r($raw_fields, true));
To verify what data youβre getting from Elementor.
—
Once debug log gives an error trace, you can share it here and Iβll pinpoint the exact cause.
Want me to help you find the correct field ID from your form data?
> `Too few arguments to function get_form_settings(), 0 passed … and exactly 1 expected`
—
### π§ **The Fix**
You're using this line:
$form_settings = $record->get_form_settings();
But as per the error, **`get_form_settings()` expects 1 argument**, which is usually the full settings array (or `null` is not acceptable in your Elementor version).
Replace:
$form_settings = $record->get_form_settings();
With:
$form_settings = $record->get_form_settings( $record->get( 'form_settings' ) );
—
### β
Final Working Code
Here's the corrected version:
add_filter('elementor_pro/forms/validation', function($record, $ajax_handler) {
try {
$form_name = $record->get_form_settings('form_name');
if ('Home Form' !== $form_name) {
return;
}
$raw_fields = $record->get('fields');
$department = '';
foreach ($raw_fields as $id => $field) {
if ($id === 'field_17e133f') {
$department = $field['value'];
break;
}
}
$email_map = [
'neustadt' => 'neeraj.tiwari@nethues.com',
'oldenburg' => 'Oldenburg@auto-lange.de',
'wismar' => 'wismar@auto-lange.de',
];
if (!empty($department) && isset($email_map[$department])) {
$email_to = $email_map[$department];
update_option('elementor_cf_mail', $email_to);
$form_settings = $record->get_form_settings($record->get('form_settings'));
if (isset($form_settings['email']) && is_array($form_settings['email'])) {
$form_settings['email']['to'] = $email_to;
$record->update_form_settings($form_settings);
}
}
} catch (Throwable $e) {
error_log('Elementor form error: ' . $e->getMessage());
}
}, 10, 2);
—
Try this and test the form β let me know if the emails are now sent to the dynamic recipients based on the department field.
> **"Cannot access offset of type array in isset or empty"**
—
### β
Fix
First, confirm `$form_settings` is an array **before** accessing keys like `['email']`.
Update this block:
if (isset($form_settings['email']) && is_array($form_settings['email'])) {
to:
if (is_array($form_settings) && isset($form_settings['email']) && is_array($form_settings['email'])) {
—
### β Updated Full Code (Safe for PHP 8+)
add_filter('elementor_pro/forms/validation', function($record, $ajax_handler) {
try {
$form_name = $record->get_form_settings('form_name');
if ('Home Form' !== $form_name) {
return;
}
$raw_fields = $record->get('fields');
$department = '';
foreach ($raw_fields as $id => $field) {
if ($id === 'field_17e133f') {
$department = $field['value'];
break;
}
}
$email_map = [
'neustadt' => 'neeraj.tiwari@nethues.com',
'oldenburg' => 'Oldenburg@auto-lange.de',
'wismar' => 'wismar@auto-lange.de',
];
if (!empty($department) && isset($email_map[$department])) {
$email_to = $email_map[$department];
update_option('elementor_cf_mail', $email_to);
$form_settings = $record->get_form_settings($record->get('form_settings'));
if (is_array($form_settings) && isset($form_settings['email']) && is_array($form_settings['email'])) {
$form_settings['email']['to'] = $email_to;
$record->update_form_settings($form_settings);
}
}
} catch (Throwable $e) {
error_log('Elementor form error: ' . $e->getMessage());
}
}, 10, 2);
—
Try submitting the form again. If the issue persists or you're unsure about the `field_17e133f`, I can help log or verify its value too. Want help with that?
Letβs **log the actual value of `$form_settings`** to be sure, then safely handle it.
—
### β Step 1: Add Debug Logging
Right before the `if` block, insert:
error_log('Form settings: ' . print_r($form_settings, true));
—
### β Step 2: Add Full Type-Safe Check
Letβs fully guard that section against any invalid structure:
if (
is_array($form_settings) &&
array_key_exists('email', $form_settings) &&
is_array($form_settings['email']) &&
array_key_exists('to', $form_settings['email'])
) {
$form_settings['email']['to'] = $email_to;
$record->update_form_settings($form_settings);
}
—
### β Final Safe Version
add_filter('elementor_pro/forms/validation', function($record, $ajax_handler) {
try {
$form_name = $record->get_form_settings('form_name');
if ('Home Form' !== $form_name) {
return;
}
$raw_fields = $record->get('fields');
$department = '';
foreach ($raw_fields as $id => $field) {
if ($id === 'field_17e133f') {
$department = $field['value'];
break;
}
}
$email_map = [
'neustadt' => 'neeraj.tiwari@nethues.com',
'oldenburg' => 'Oldenburg@auto-lange.de',
'wismar' => 'wismar@auto-lange.de',
];
if (!empty($department) && isset($email_map[$department])) {
$email_to = $email_map[$department];
update_option('elementor_cf_mail', $email_to);
$form_settings = $record->get_form_settings($record->get('form_settings'));
error_log('Form settings: ' . print_r($form_settings, true)); // debug
if (
is_array($form_settings) &&
array_key_exists('email', $form_settings) &&
is_array($form_settings['email'])
) {
$form_settings['email']['to'] = $email_to;
$record->update_form_settings($form_settings);
}
}
} catch (Throwable $e) {
error_log('Elementor form error: ' . $e->getMessage());
}
}, 10, 2);
—
Once you test this version:
– β
Check if the form is sent to the correct email.
– π Check `/wp-content/debug.log` β it will show what `$form_settings` looks like.
Want help analyzing the log output next? Just paste what shows.