Validamos que un formulario de Elementor con Piotnet no registre la información del formulario si es que el nombre ya se encuentra en la base de datos de Elementor.

// ***********************************************
/* VALIDACION DE UN LEAD POR FORM Y CORREO */
// ***********************************************
add_action( 'elementor_pro/forms/validation/text', 'graphica_form_validate_one_lead_per_name', 10, 3 );
function graphica_form_validate_one_lead_per_name( $field, $record, $ajax_handler ) {
// Validamos solo el campo con ID 'form-field-nombres'
if ( $field['id'] !== 'nombres' ) {
return;
}
$name = $field['value']; // Obtenemos el valor del campo de texto
$form_id = $record->get_form_settings('id'); // ID del formulario actual
// Comprobamos si ya existe este nombre en las entradas del formulario
$leads_count = graphica_verify_names_in_form_db($name, $form_id);
if ($leads_count > 0) {
$ajax_handler->add_error( $field['id'] );
$ajax_handler->add_error_message( __('Ya has enviado tu confirmación. Si necesitas más ayuda, por favor ponte en contacto por WhatsApp.', 'graphica') );
$ajax_handler->is_success = false;
return;
}
}
function graphica_verify_names_in_form_db($name, $form_id) {
$elementor_submission_query = ElementorPro\Modules\Forms\Submissions\Database\Query::get_instance();
// Consulta para buscar nombres existentes
$q = "
SELECT COUNT(wpv.submission_id) AS submission_count
FROM " . $elementor_submission_query->get_table_submissions() . " ws
JOIN " . $elementor_submission_query->get_table_submissions_values() . " wpv
ON ws.id = wpv.submission_id
WHERE ws.element_id = %s AND wpv.value = %s
";
global $wpdb;
// Ejecutamos la consulta
$result = $wpdb->get_var( $wpdb->prepare( $q, $form_id, $name ) );
return (int) $result;
}
/**
* Validación al entrar a la página
* Piotnet no valida el form con el backend, lo hace desde el front.
* Así que debemos validar al cargar la página y detach el evento de piotnet
* en el front.
*/
add_action('wp_ajax_graphica_validate_lead', 'graphica_validate_lead_callback');
add_action('wp_ajax_nopriv_graphica_validate_lead', 'graphica_validate_lead_callback');
function graphica_validate_lead_callback() {
$name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : '';
$form_id = isset($_POST['form_id']) ? sanitize_text_field($_POST['form_id']) : '';
if (empty($name) || empty($form_id)) {
wp_send_json_error(['message' => 'Error en validación']);
wp_die();
}
$leads_count = graphica_verify_names_in_form_db($name, $form_id);
if ($leads_count > 0) {
wp_send_json_error(['message' => 'Ya has enviado tu confirmación.']);
} else {
wp_send_json_success(['message' => 'Nombre válido.']);
}
wp_die();
}