Formulario simple que guarda en la base de datos

12 sept 2013, 19:55:40
Vistas: 27.8K
Votos: 4

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:

  1. Capture nombre, teléfono y correo electrónico enviado por el usuario final
  2. Guarde en la base de datos
  3. 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".

5
Comentarios

Lo siento, no entiendo exactamente lo que necesitas. ¿Podrías añadir más detalles?

s_ha_dum s_ha_dum
12 sept 2013 20:39:13

@s_ha_dum He editado mi publicación, espero que lo aclare un poco. Todo lo que necesito es un procesador de formularios que guarde en la base de datos de WordPress. Básicamente, colocar código HTML en cualquier página, el usuario envía datos, se guardan en la base de datos de WordPress en una tabla única.

Damainman Damainman
12 sept 2013 21:03:53

Si consideras guardarlos en la tabla de WordPress. Prueba este tutorial Se integra con el plugin contact form 7

Sisir Sisir
12 sept 2013 21:15:20

Kaiser, hasta ahora no he probado nada. La mayoría de los plugins de formularios generaban formularios con apariencia específica o enviaban los resultados por correo y yo quería algo que guardara en la base de datos con la capacidad de personalizar el formulario para que se vea como yo elija. Sisir, gracias por la sugerencia, le echaré un vistazo.

Damainman Damainman
12 sept 2013 21:32:30

Aquí puedes encontrar un tutorial para crear un formulario simple de suscripción a newsletter. Supongo que es muy pequeño, puedes aprender $wpdb para hacerlo funcionar según tus necesidades, http://www.kvcodes.com/2016/02/simple-subscribe-form-wordpress/

Kvvaradha Kvvaradha
7 feb 2016 08:22:39
Todas las respuestas a la pregunta 2
5

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:

12 sept 2013 21:20:41
Comentarios

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

Damainman Damainman
12 sept 2013 21:33:15

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.

Damainman Damainman
12 sept 2013 22:32:36

(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

gmazzap gmazzap
12 sept 2013 23:17:33

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 Damainman
13 sept 2013 00:23:36

@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.

gmazzap gmazzap
13 sept 2013 00:35:04
0

Una cosa a tener en cuenta, NAME es una palabra reservada de WordPress, si utilizas un campo llamado name, cuando envíes tu formulario, obtendrás un error 404 not found.

30 jul 2014 18:18:34