¿Cómo verifico si mi $wpdb->insert() fue exitoso?
Estoy intentando escribir un pequeño script dentro de mi footer.php
(que luego convertiré en un plugin) que envía dos campos de formulario a una tabla personalizada (wp_newsletter
). Ya estoy enviando el formulario y escribiendo en la tabla correctamente, pero no sé cómo puedo enviar un mensaje de éxito o falla al usuario. Mi código actual es el siguiente:
<form method="post">
<input type="text" name="user_name">Nombre
<input type="text" name="user_email">Email
<input type="submit">
<?php echo $message; ?>
</form>
<?php
global $wpdb;
$table = $wpdb->prefix . "newsletter";
$name = sanitize_text_field( $_POST["user_name"] );
$email = sanitize_email( $_POST["user_email"] );
$message = "";
if( isset($_POST["submit"]) ) {
if ( is_email($email) && isset($name)) {
if ( $wpdb->insert( $table, array("name" => $name, "email" => $email)) != false ) {
$message = "Tu suscripción fue enviada.";
}
}
else {
if ( !is_email($email) ) {
$message = "Dirección de email inválida.";
} elseif ( !isset($name) ) {
$message = "El campo nombre es obligatorio.";
} else {
$message = "Ambos campos, nombre y email, son obligatorios.";
}
}
} else {
$message = "Por favor, inténtalo de nuevo más tarde.";
}
?>
<?php wp_footer(); ?>
</body>
</html>
Creo que lo estoy probando correctamente, según la documentación de $wpdb que dice:
Esta función devuelve false si la fila no pudo ser insertada. De lo contrario, devuelve el número de filas afectadas (que siempre será 1).

Devuelve el número de filas insertadas o false en caso de error.
Puedes obtener el ID del registro insertado o false si la inserción falla:
enlace de referencia: https://developer.wordpress.org/reference/classes/wpdb/insert/#return
Así que puedes verificar de la siguiente manera:
$result_check = $wpdb->insert( $table, array("name" => $name, "email" => $email));
if($result_check){
//inserción exitosa.
}else{
//algo salió mal
}

Cuando me di cuenta de que PHP es un acrónimo de "PHP Hypertext Preprocessor" —con énfasis en "preprocessor"— finalmente entendí que no puedo mezclar PHP y HTML y esperar algún tipo de interactividad con el usuario. Cuando se sirve una página web, el PHP crea el HTML y luego el navegador muestra el HTML. Si el usuario hace algo a lo que el PHP debe responder, debe activar una nueva página PHP/HTML para proporcionar algún tipo de respuesta. (Una alternativa sería usar AJAX para enviar datos de ida y vuelta sin cargar una nueva página. WordPress funciona bien con AJAX y hay tutoriales a un buscador de distancia).
Para un formulario simple como el tuyo, usaría javascript para la verificación de errores. Si el formulario no está completo, previene el envío del formulario con JS. Si el formulario está completo, la acción del formulario puede ser un archivo .php que realiza la inserción en la base de datos y muestra el mensaje de éxito/fracaso en HTML.

Gracias por el consejo, Scott. ¿Cómo podría crear un archivo .php
que muestre el mensaje de éxito/fallo al usuario?

Disculpa la demora en responder. En un entorno web, haría que el action del formulario apunte a un archivo .php. Los datos se envían mediante GET al archivo destino. Luego se analizan los datos y se insertan en la base de datos. Finalmente, el archivo .php genera HTML en un nuevo documento web que indica éxito o fallo. Ten en cuenta que esto no le da al usuario muchas oportunidades de corregir errores para lograr un mejor resultado una vez que se carga la nueva página web.

Sin embargo, en WordPress, consideraría intentar con AJAX. Hay muchos buenos tutoriales, y también buscaría en el Codex, pero aquí hay dos que me funcionaron: https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/ y https://premium.wpmudev.org/blog/using-ajax-with-wordpress/
AJAX permite acceder a la base de datos sin cargar una nueva página web. Así que tendrías un elemento que no tiene contenido HTML hasta que AJAX devuelva éxito/fallo:
document.getElementById("results-div").innerHTML = content.result;

La lógica que maneja el formulario está dentro del mismo archivo del formulario: el footer.php
. Solo estoy tratando de que funcione de esta manera, luego puedo separarlo mejor cuando termine con las pruebas. A pesar de esto, no quiero enviar los datos de mi formulario a través de un GET.

Mi error. Puedes usar POST. Parece que quieres hacer AJAX dentro de footer.php para que no recargue la página. Tendrás que usar JavaScript para enviar/recibir los datos AJAX, pero puedes crear un nuevo archivo .php para manejar la llamada AJAX. (Yo coloco mis archivos .php dentro de un plugin para que todas las dependencias sean manejadas por el sistema de WP.)
