X

Guardar datos de formulario de contacto sin plugins

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.

Puedes colocar directamente este código en el archivo functions.php de tu theme o en un archivo separado e incluirlo en el functions.php.

 

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.

 

Categorías: Themes
Etiquetas: funcionalidad

Ver comentarios (12)

    • 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, 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, 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

  • Gracias por este artículo y el anterior.
    El mensaje recogido en el formulario se salva como una pequeña entradita, lo cual es bastante cómodo para editar la entradita deseada en la lista de contactos del panel de control administrativo.
    No sé si es posible exponer cómo incluir a modo de campos individuales personalizados de la entrada del mensaje en la lista de contactos, los ítems de éste (nombre, correo, mensaje).
    Y ver la forma de usar el hecho de que el tipo de entrada de contacto está ya habilitado para exportarse, de modo que el usuario pueda, con el toque de un botón, exportar una, varias o todas las entradas.
    De nuevo, muchas gracias.