En un artículo anterior habíamos visto cómo crear un formulario de contacto sin plugins en WordPress, debido a las múltiples sugerencias, en este artículo vamos a ver cómo guardar esos datos, que se envían por correo, en la base de datos de WordPress.
Resultado final
Al final lo que queremos obtener son los mensajes de los usuarios en el backend del sitio, tal como se muestra en la siguiente imagen:

Custom Post Type Contacto
Para guardar los datos que se envían del formulario de contacto en la base de datos, usaremos un Custom Post Type (CPT).
En la creación de este CPT estamos quitando la opción de crear nuevos registros ya que sólo deberían usarse para mostrar registros agregados desde el formulario de contacto.
Modificando el código que procesa el formulario
Al código original del artículo agregaremos código para insertar un nuevo CPT cada vez que se envía un correo. Usaremos la función wp_insert_post() para insertar un nuevo CPT.
// Hooks admin-post
add_action( 'admin_post_nopriv_process_form', 'send_mail_data' );
add_action( 'admin_post_process_form', 'send_mail_data' );
// Funcion callback
function send_mail_data() {
$name = sanitize_text_field($_POST['name']);
$email = sanitize_email($_POST['email']);
$message = sanitize_textarea_field($_POST['message']);
$adminmail = "destino@dominio.com"; //email destino
$subject = 'Formulario de contacto'; //asunto
$headers = "Reply-to: " . $name . " <" . $email . ">";
//Cuerpo del mensaje
$msg = "Nombre: " . $name . "\n";
$msg .= "E-mail: " . $email . "\n\n";
$msg .= "Mensaje: \n\n" . $message . "\n";
$sendmail = wp_mail( $adminmail, $subject, $msg, $headers);
if ( $sendmail ){
wp_insert_post([
'post_title' =>'Mensaje de '. $name,
'post_type' =>'contactos_post_type',
'post_content' => $msg,
'post_status' => 'private',
]);
}
wp_redirect( home_url("/contacto/")."?sent=".$sendmail ); //asumiendo que existe esta url
}
Conclusión
Como hemos visto, podemos guardar diferentes tipos de contenido en la base de datos usando la funcionalidad de CPT de WordPress, en este caso lo hemos usado para guardar los datos enviados a través de un formulario de contacto.
Genial!!!
Muchas gracias!!!
Me sale este mensaje. Como solocionar ? https://vetoriano.com/contacto/
Not Acceptable
An appropriate representation of the requested resource could not be found on this server.
MUCHAS GRACIAS!!!
Hola, al parecer ese mensaje esta relacionado con alguna regla de seguridad de tu servidor, podrías probar en otro servidor si te es posible y verificar.
Saludos.
Buena explicación, amigo.
Tengo una consulta, si quiero enviar los registros a una base de datos diferente a la de WordPress, ¿Cómo debo a hacer en ese caso?, agradecería tu respuesta.
Hola, tendrías que realizar una conexión adicional y luego escribir en tu BD, revisa este artículo relaciondo: https://decodecms.com/leer-datos-desde-otra-base-de-datos-en-wordpress/
Hola, como puedo agregar la informacion en una base de datos externa?,de antemano muchas gracias
Hola, reemplaza la función wp_insert_post, en tu caso tendrás que hacer la conexión a tu BD y construir una función que inserte los datos.
Hola y gracias por compartir tus conocimientos.
Si solo deseo agregar los datos del formulario a una tabla denteo de la base de datos del mismo wordpress (o sea sin enviar correo) como deberia modificarlo. Gracias
Hola, ya no uses la variable $sendmail ni la función wp_mail(), puedes eliminar esa línea y también quitarla de la condicional.
Hola como puedo incluir datos adjuntos
Hola, si deseas adjuntos de correos lo haces en la función wp_mail(), si lo que deseas es guardarlo permanentemente en el servidor entonces hay que modificar el código para subida de archivos, evaluaré eso en un futuro artículo