Formulario simple que guarda en la base de datos
Estoy usando un servicio de terceros que revisa mi base de datos buscando nuevas entradas dentro de una tabla específica. Sin embargo, no he podido encontrar un plugin de formulario simple que envíe datos a la base de datos de WordPress dentro de una tabla sin afectar ninguna de las funcionalidades de WordPress. La razón es que mi proveedor de hosting solo me permite una base de datos.
Necesito usar un formulario en WordPress que:
- Capture nombre, teléfono y correo electrónico enviado por el usuario final
- Guarde en la base de datos
- Redirija al usuario a una página de confirmación.
Realmente no es nada elaborado y aunque sería excelente ver los resultados en la administración de WordPress, no es necesariamente un requisito ya que puedo usar phpMyAdmin.
En resumen:
Necesito un formulario simple en HTML/PHP, donde pueda simplemente pegar el código HTML del formulario en una página a través de la administración de WordPress mediante la vista HTML/código para páginas. Cuando un usuario envía el formulario, este lo guarda en la base de datos de WordPress y luego redirige al usuario a una página de "gracias".

Por lo que puedo entender, ya tienes la tabla en tu base de datos.
No sé cómo la has nombrado, pero una buena práctica (para mí una práctica obligatoria) es nombrarla con el mismo prefijo de tabla de WordPress, el que está configurado en wp-config.php
.
Tampoco mencionas cómo está estructurada esta tabla, pero supongo que es algo como:
ID (entero, primaria, autoincremento) | nombre (varchar) | teléfono (varchar) | email (varchar)
Puedes añadir un shortcode que muestre el formulario. En tu functions.php
añade:
add_action('init', function() {
add_shortcode('userform', 'print_user_form');
});
function print_user_form() {
echo '<form method="POST">';
wp_nonce_field('user_info', 'user_info_nonce', true, true);
?>
Todos los campos de tu formulario (nombre, email, teléfono) van aquí.
<?php
submit_button('Enviar Datos');
echo '</form>';
}
Ahora simplemente crea una entrada o página en el panel de WordPress y añade [userform]
: el formulario aparecerá mágicamente en la página.
Como puedes ver, no he añadido el atributo action al formulario, de esta manera el formulario envía los datos POST a la misma página.
Ahora tienes que guardar los datos. Añade una acción en un hook temprano, busca el $_POST
, verifica el nonce y guarda tus datos:
add_action('template_redirect', function() {
if ( ( is_single() || is_page() ) &&
isset($_POST[user_info_nonce]) &&
wp_verify_nonce($_POST[user_info_nonce], 'user_info')
) {
// Deberías hacer la validación antes de guardar los datos en la db.
// No escribiré la función de validación, está fuera del alcance de esta respuesta
$pass_validation = validate_user_data($_POST);
if ( $pass_validation ) {
$data = array(
'name' => $_POST['name'],
'email' => $_POST['email'],
'phone' => $_POST['phone'],
);
global $wpdb;
// si has seguido mi sugerencia de nombrar tu tabla usando el prefijo de WordPress
$table_name = $wpdb->prefix . 'my_custom_table';
// la siguiente línea insertará los datos
$wpdb->insert($table_name, $data, '%s');
// si quieres recuperar el valor ID de la fila recién insertada usa
$rowid = $wpdb->insert_id;
// después de insertar tenemos que redirigir al usuario
// te sugiero crear otra página y titularla "Gracias"
// si lo haces:
$redirect_page = get_page_by_title('Gracias') ? : get_queried_object();
// la línea anterior si la página titulada 'Gracias' no se encuentra, establece la página actual
// como la página de redirección. La siguiente línea obtiene la url de la página de redirección:
$redirect_url = get_permalink( $redirect_page );
// ahora redirige
wp_safe_redirect( $redirect_url );
// y detén php
exit();
}
}
});
El código es básico, pero debería ser un punto de partida válido. Los comentarios en línea deberían ayudarte a entender el flujo de trabajo.
Asegúrate de leer la documentación:

Gracias por la respuesta tan detallada y extensa. Es mucha información para digerir, te mantendré al tanto de mis resultados y nuevamente gracias.

Preguntas rápidas: 1. Si necesitara más de un formulario, ¿hay alguna manera de agregar un nombre al shortcode como [userform:FormA] o [userform:Contact] que agregaría FormA a la clase ID del campo de formulario html y también colocaría FormA en un campo oculto del formulario? 2. Para tu segundo bloque de código, ¿eso también se pondría en el archivo functions.php? 3. ¿Qué parte del segundo ejemplo de código hace que WordPress sepa que solo debe ejecutar esa funcionalidad en formularios creados con este método? No veo una forma de verificar que el envío del formulario provenga del formulario creado mediante el shortcode.

(1) lo que necesitas son los shortcode atts usándolos puedes personalizar el formulario como quieras, mira la documentación de add_shortcode
vinculada en la respuesta. (2) Sí. El código que comienza con add_filter
o add_action
tienes que crear un plugin para contenerlo o ponerlo en functions.php
: depende si quieres/puedes perder esa funcionalidad al cambiar de tema. (3) la razón de ser de wp_verify_nonce
es precisamente eso. Verifica una variable $_POST
(creada por wp_nonce_field
) que contiene un valor encriptado creado a partir de una cadena de texto, en este caso 'user_info'. Nuevamente, consulta los enlaces de documentación al final de la respuesta. @Damainman

pregunta rápida, tienes una etiqueta de cierre php arriba y una etiqueta de apertura php hacia el final de tu función de shortcode. ¿Puedes verificar por qué está configurado así?

@Damainman "Todos los inputs de tu formulario (nombre, email, teléfono) van aquí." está destinado a ser un marcador de posición para el código html del formulario, así que cierro las etiquetas php antes y las vuelvo a abrir después para evitar una sucesión larga y fea de echo
. Simplemente escribe html allí como lo harías normalmente.
