CMS WordPress

Utilizar Gravity Forms como formulario de alta para nuevos usuarios

[titulo]Guardar respuestas de Gravity Forms en una base de datos[/titulo]

Gravity Forms es, junto a Contact Form 7 y Ninja Formsuno de los generadores de formularios más flexibles y potentes de WordPress.

Dispone de campos condicionales lógicos, paginación, estructuración por columnas, validación da campos avanzados… y es de pago. Aunque esto no debe ser un problema, ya que en el post «Usar Gravity Forms sin licencia – legal bypass license» te explicamos cómo saltarte este pequeño inconveniente.

Sin embargo, al ser de pago, hay muchas funcionalidades que Contact Form 7 solventa con otros plugins gratuitos, y que Gravity Forms no tiene o son también de pago.

Un ejemplo de ello es almacenar la información de un formulario cumplimentado, en una base de datos. Gravity Forms te envía esa información directamente al email, pero no la almacena.

Otro ejemplo es  utilizar Gravity Forms como formulario de alta de usuarios. Lo que implica no sólo almacenar sus datos en una BBDD, sino poder recoger y manipular esos datos.

A través de este post, vamos a mostrarte cómo puede hacer todo esto, y utilizar la potencia de este plugin para introducir datos en tu propio plugin personal.

 

[resumen]
  1. Los IDs de campos simples y compuestos en Gravity Forms
  2. Creando un script I: Recoger datos y almacenarlos en variables
  3. Creando un script II: Subida a base de datos
  4. Bonus: Crear usuarios automáticamente con Gravity Forms
[/resumen]

 

[titulo]Los IDs de campos simples y compuestos en Gravity Forms[/titulo]

Tenemos instalado y activado el plugin y estamos creando un formulario. ¿Qué debemos mirar antes de ponernos a programar?

El id del formulario, que nos lo dará la url. En la imagen de arriba es «1».

Y el id de los campos que queramos almacenar en una BBDD. Para verlo basta con pasar el ratón sobre ellos, y enseguida nos aparecerá. El id del campo «Nombre» es «11».

Sin embargo, hay un detalle muy a tener en cuenta: [subraya_verde]Existen campos, como el campo «Nombre», que son compuestos. Esto quiere decir que tienen 2 o más inputs, y por ello, el id de cada input será diferente al id del campo global.[/subraya_verde]

En el siguiente punto os indicamos cómo extraer los ids en estos casos.

 

[titulo]Creando un script I: Recoger datos y almacenarlos en variables[/titulo]

Nosotros siempre recomendamos colocar las funciones y/o modificaciones que creemos, no en el functions.php de nuestro tema activo, que sería donde habitualmente se colocan, sino en nuestro propio plugin.

De esa forma no se compromete la estabilidad de toda la web, y se pueden desactivar las modificaciones que hemos hecho, desactivando el plugin. Además, tampoco se perderán cuando actualicemos el tema.

 

Recordemos que para crear un plugin, debemos crear una carpeta en /wp-content/plugins/ y situar un archivo .php que contendrá la siguiente cabecera:

<?php 

/**
 * Plugin Name: Nombre del plugin que aparecerá en el listado de plugins de WordPress
 * Plugin URI: https://www.loopeando.com/
 * Description: La descripción que quieras para saber qué contiene
 * Version: 0.0.1
 * Author: Loopeando.com
 * Author URI: https://www.loopeando.com/
 * Requires at least: 4.9.2
 * Tested up to: 4.9.2
 *
 * Text Domain: wprincipiante-ejemplo
 * Domain Path: /languages/
 */
defined( 'ABSPATH' ) or die( '¡Sin trampas!' );
global $wpdb;

/* Y aquí ya agregamos las funciones que queramos */

?>

 

Vamos a usar el action [codigo]gform_after_submission[/codigo], que es el que se ejecutará tras el envío de cada formulario de Gravity Forms.

Por lo tanto nuestro hook será:

add_action('gform_after_submission', 'nombre_de_la_funcion', 10, 2);

Y nuestra función va a recibir, al menos, el parámetro [codigo]$entry[/codigo].

Este parámetro contendrá toda la información del último formulario enviado, por lo que podemos hacerle un [codigo]var_dump[/codigo] para ver todo lo que contiene.

Como decíamos en el punto anterior, los campos compuestos no muestran su id desde el administrador de WordPress, por lo que usar un [codigo]var_dump[/codigo] nos ayudará a conocerlo. Ej:

add_action('gform_after_submission', 'endo_add_entry_to_db', 10, 2);
function endo_add_entry_to_db($entry, $form) {

	  // Mostramos todo lo contenido en el formulario
	  echo '<pre>';
	  var_dump($entry);
	  echo '</pre>';
}

 

Una vez tenemos claro todo lo que recibimos y cuáles son sus identificadores, comentamos a extraer la información que nos interesa y asignarlas a variables PHP:

add_action('gform_after_submission', 'endo_add_entry_to_db', 10, 2);
function endo_add_entry_to_db($entry, $form) {

	  //echo '<pre>';
	  //var_dump($entry);
	  //echo '</pre>';
          
          //url desde donde viene el formulario
          $source = $entry['source_url'];
  
          //Id del formulario: Por si tenemos varios activos
	  $form_id = 	$entry['form_id'];

          //Fecha en la que se ha enviado
	  $date_created = $entry['date_created'];
	  
	 //En este ejemplo, vamos a recoger la info sólo del formulario cuya id sea 1
	 if ($form_id = 1){

                //Como hemos visto gracias al var_dump(), el campo nombre asigna nombre al id 11.3 y el apellido al 11.6.
                //Estos campos compuestos, tienen una id no numérica, por lo que se ponen entre comillas.
		$nombre = 	$entry["11.3"]." ".$entry["11.6"];

                //El resto de campos simples, se operan con normalidad.
		$email = 	$entry[13];
		$edad = 	$entry[24];
		$peso = 	$entry[66];
		$peso = str_replace(',', '.', $peso);
		
                $altura = 	$entry[65];
		$altura = str_replace(',', '.', $altura);
		
                $sexo = 	$entry[68];
		if($sexo == "Hombre"){
			$sexo2 = 0;
		}
		if($sexo == "Mujer"){
			$sexo2 = 1;
		}
	
	  } //Fin formulario id 1

 

[titulo]Creando un script II: Subida a base de datos[/titulo]

El siguiente paso será almacenar los datos en una BBDD para tener un registro.

Nosotros no vamos a crear una tabla nueva en la base de datos, ya que queremos que esos datos estén disponibles como posts de tipo personalizado. Pero recomendamos que, sobretodo si es tu primera vez, lo hagas aparte.

Para subir datos, debes asegurarte de incluir la llamada [codigo]global $wpdb[codigo] y el comando:

$wpdb->insert(
     'nombre de la tabla',
     array(
       'dato1' => $dato1,
       'dato2' => $dato2,
       'dato3' => $dato3
     )
);

 

Quedando por tanto, dentro de la misma función que hemos descrito en el «Creando un Script I»:

global $wpdb;
  
  	// wp_postmeta es la tabla donde se almacena la info de los posts en WordPress
        //Tiene 3 parámetros: El id del post, que debe ser para todos los datos igual. 
        //El identificador de campo o meta_key
        //El valor o contenido del campo, llamado meta_value
        //Pero insistimos, esto es porque vamos a insertarlo en una tabla de WordPress ya existente y debe cumplir su estructura. Si creamos la nuestra, habrá se seguir nuestra propia estructura. 
	$wpdb->insert(
	    'wp_postmeta',
	    array(		  
		  'post_id' => $id_sube,
	          'meta_key' => 'event_nombre',
		  'meta_value' => $nombre
		)
	);
	
	$wpdb->insert(
	    'wp_postmeta',
	    array(		  
		  'post_id' => $id_sube,
	      'meta_key' => 'event_sexo',
		  'meta_value' => $sexo2
		)
	);
	
	$wpdb->insert(
	    'wp_postmeta',
	    array(		  
		  'post_id' => $id_sube,
	          'meta_key' => 'event_edad',
		  'meta_value' => $edad
		)
	);
	
	$wpdb->insert(
	    'wp_postmeta',
	    array(		  
		  'post_id' => $id_sube,
	          'meta_key' => 'event_peso',
		  'meta_value' => $peso
		)
	);
	
	$wpdb->insert(
	    'wp_postmeta',
	    array(		  
		  'post_id' => $id_sube,
	          'meta_key' => 'event_altura',
		  'meta_value' => $altura
		)
	);
	
	$wpdb->insert(
	    'wp_postmeta',
	    array(		  
		  'post_id' => $id_sube,
	      'meta_key' => 'event_peso_graso',
		  'meta_value' => $peso_graso
		)
	);
	
	$wpdb->insert(
	    'wp_postmeta',
	    array(		  
		  'post_id' => $id_sube,
	      'meta_key' => 'event_grasa',
		  'meta_value' => $grasa_corporal
		)
	);
	
	$wpdb->insert(
	    'wp_postmeta',
	    array(		  
		  'post_id' => $id_sube,
	      'meta_key' => 'event_imc',
		  'meta_value' => $imc
		)
	);

	
        //Y en el caso de que desees ponerlo como un post, hay que añadir todos estos datos:
	$wpdb->insert(
	    'wp_posts',
	    array(		  
		  'ID' => $id_sube,
	          'post_author' => '2',
		  'post_date' => date('Y-m-d H:i:s'),
		  'post_date_gmt' => date('Y-m-d H:i:s'),
		  'post_title' => $nombre,
		  'comment_status' => 'closed',
		  'post_status' => 'publish',
		  'ping_status' => 'closed',
		  'post_name' => sanitize_title($nombre),
		  'post_modified' => date('Y-m-d H:i:s'),
		  'post_modified_gmt' => date('Y-m-d H:i:s'),
		  'post_parent' => '0',
		  'menu_order' => '0',
		  'post_type' => 'cliente',
		  'comment_count' => '0'
		)
	);

 

[titulo]Bonus: Crear usuarios automáticamente con Gravity Forms[/titulo]

¿Y qué se puede hacer con toda la información recogida arriba? Pues podemos, ya que estamos, crear un usuario nuevo para que pueda acceder y editar sus propios datos.

Para ello, añadimos a la función de arriba lo siguiente:

///////////////////////////////////////////
/////////// CREAMOS UN USUARIO NUEVO /////
//////////////////////////////////////////

    //Creamos su nombre de usuario a partir del nombre.
    //Como el nickname no puede tener espacios, ni tildes, etc Le damos formato:
    $username = str_replace(array( '(', ')',' ' ), '', esc_attr($nombre));
    $username = strtolower($username); 

    $email_address = $email;
    	

    //Comprobamos si el email ya está registrado, ya que el login se va a realizar por este campo y debe ser único
    if( null == username_exists( $email_address ) ) {

        //Generamos una contraseña
        $password = wp_generate_password( 12, false );
  
        //Creamos el usuario
        $user_id = wp_create_user( $email_address, $password, $email_address );

       //Añadimos información complementaria
       wp_update_user(
         array(
           'ID'  =>    $user_id,
	  'first_name'  =>    $entry["11.3"],
	  'last_name'  =>    $entry["11.6"],
	  'display_name'  =>   $entry["11.3"]." ".$entry["11.6"],
          'nickname'  =>    $email_address
        )
      );

      //Le asignamos un rol al nuevo usuario. Por ejemplo, suscriptor.
     $user = new WP_User( $user_id );
     $user->set_role( 'subscriber' );

     //Y le hacemos llegar un email de bienvenida con su contraseña.
     $to = $email_address;
     $subject = '¡Enhorabuena! Acabas de dar el primer paso para mejorar tu vida';
     $body = 'Ahora nuestro equipo de expertos valorará tu formulario inicial para poder adaptarse a tus necesidades de la manera más eficaz posible.<br><br> Si has solicitado una cita telefónica, te haremos llegar un recordatorio tan pronto como se confirme y, entre tanto, puedes ir accediento a tu plataforma con los siguientes datos:<br><br> Acceso: <br> Correo electrónico: '.$email_address.'<br>Contraseña: ' . $password.'<br>';
     $headers = array('Content-Type: text/html; charset=UTF-8');

     wp_mail( $to, $subject, $body, $headers );

 
} // Aquí cerraríamos la función y el if form id = 1, en caso de haberlo usado

 

Si quisiésemos que los datos personalizados no estuviesen ni en una tabla aparte, ni como post (tal y como se ha visto en este ejemplo), sino que prefiriésemos asignarlos a su perfil de usuario, os recomendamos leer este post:

Añadir campos personalizados al formulario de registro de WordPress

 

 

¿Tienes dudas? ¿Has conseguido vincular tu Gravity Forms a una base de datos? ¿Te has atascado en algún punto? ¡Te ayudamos en los comentarios!

Cristian Sarabia Martínez

Desde que a principios de los 90 mi padre desempolvó su Spectrum, no he dejado de probar y experimentar con la tecnología.

Enamorado del mundo web, Full Stack Developer de profesión y diseñador por devoción.

Ahora hago mis pinitos en esto del blogging para compartir con vosotros un poquito de todo lo que la comunidad me ha dado.

Escribir comentario

Haz clic aquí para dejar tu comentario