Cómo obtener el ID de entrada de Gravityform de la presentación del formulario del usuario actual
Caso: Cuando un usuario envía un formulario (Gravity), el plugin genera automáticamente un ID de entrada único para ese formulario específico. En mi caso, la configuración del formulario solo permite que el usuario lo envíe una vez, y solo si está registrado. Cuando el usuario envía el formulario, se crea una página con el contenido del formulario. La URL de esa página se genera dinámicamente y se basa en el ID de entrada (www.example.com/entry-ID).
Pregunta: Después de que el usuario haya enviado un formulario y haya iniciado sesión, quiero mostrar un enlace a la página que fue creada por el usuario. No solo justo después del envío, sino cada vez que el usuario inicie sesión nuevamente. Pero ¿cómo obtener y mostrar el ID de entrada de ese usuario en una página si ese usuario ha iniciado sesión?
Tengo este código en page.php para identificar al usuario y determinar qué mostrar:
<?php if ( is_user_logged_in() ) { ?>
<?php global $wpdb;
$user = wp_get_current_user();
$where = get_posts_by_author_sql( 'page', true, $user->ID );
$count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );
if ( $count >= 1 ) { ?>
// Esto es lo que el usuario ve si el formulario está enviado, donde '{entry-ID}' debe ser reemplazado por el ID de entrada del usuario
<h2>Hola <?php echo $current_user->display_name ?>, gracias por enviar el formulario. Visita tu página aquí: www.example.com/{entry-ID}</h2>
<?php } else { ?>
// Si el usuario no ha enviado un formulario, se muestra la información siguiente con el formulario para enviar
<h2>Hola <?php echo $current_user->display_name ?>, Gracias por unirte. Para crear una página, por favor envía el formulario a continuación:</h2><?php echo do_shortcode('[gravityform id="2" name="solo un formulario" title="false" description="false"]'); ?>
<?php } } else { ?>
// si el usuario no ha iniciado sesión, se le insta a iniciar sesión para enviar el formulario
<h2><Por favor inicia sesión para crear una página <?php do_action( 'wordpress_social_login' ); ?></h2>
<?php } ?>
Esta es la función que uso para hacer que el formulario (ID=2) cree una 'página':
add_filter("gform_post_data", "change_post_type", 10, 2);
function change_post_type($post_data, $form){
//solo cambiar el tipo de publicación en el formulario id 1
if($form["id"] != 2)
return $post_data;
$post_data["post_type"] = "page";
return $post_data;
}

Puedes usar el gform_after_submission
hook[1] para agregar el ID de la entrada (y probablemente el ID del formulario para minimizar confusión si tienes múltiples formularios) a la información meta del usuario usando add_user_meta()
.
<?php
add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
// para vincularlo a un formulario específico, usa el formato siguiente,
// reemplazando '{$form_id}' con el ID real del formulario
// add_action( 'gform_after_submission_{$form_id}', 'wpse96468_map_user_to_entry', 10, 2 );
function wpse96468_map_user_to_entry( $entry, $form ) {
// obtén el ID de tu usuario aquí
// EDITADO -- esto debería funcionar,
// si solo usuarios registrados pueden enviar el formulario
$user_id = $entry['created_by'];
// establece los argumentos para la función add_user_meta()
$meta_key = 'gform_entry_id';
$meta_value = $entry['id'];
// si quieres pasar tanto el ID de la Entrada como del Formulario, puedes usar un array:
// $meta_value = array( 'entry_id' => $entry['id'], 'form_id' => $form['id'] );
$unique = true;
// opcional, pero el valor por defecto es false,
// y si entendí bien tu pregunta, quieres que esto sea único
add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>
Una mejor manera (quizás)
Si estás usando GForms para crear una entrada (o página, presumiblemente), parece haber una forma más sencilla:
<?php
add_action( 'gform_after_submission', 'wpse96480_map_user_to_page', 10, 2);
function wpse96480_map_user_page( $entry, $form ) {
$user_id = $entry['created_by'];
$meta_key = 'generated_page_id';
$meta_value = $entry['post_id']; // ver nota [2] para un enlace
$unique = true;
add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>
Para mostrar un enlace a la página generada al usuario que la generó, puedes agregar lo siguiente a functions.php
:
<?php
add_filter( 'the_content', 'wpse96480_get_generated_page_for_user' );
function wpse96480_get_generated_page_for_user( $content ) {
if ( is_user_logged_in() ) {
global $current_user;
$current_user = get_currentuserinfo();
$user_id = $current_user->ID;
$meta_key = 'generated_page_id';
$single = true;
$page_id = get_user_meta( $user_id, $meta_key, $single );
if( strlen( $page_id ) > 0 && is_numeric( $page_id ) ) {
$page_link = '<a href="' . get_permalink( $page_id ) . '">' . get_the_title( $page_id ) . '</a>';
$content .= "Hola {$current_user->display_name}, gracias por enviar el formulario. Ve tu página aquí: $page_link";
} else {
$content .= "Hola {$current_user->display_name}, por favor completa el formulario a continuación<br />\n";
$content .= do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]');
}
}
return $content;
}
?>
En respuesta a tus comentarios
Asumiendo que la generación de tu página se hace como se solicitó en la pregunta original (ej, example.com/{entry-ID}
, y solo quieres código que puedas colocar en un archivo de plantilla de página (page.php
o similar), aquí está mi sugerencia:
Agrega el ID de la entrada a la información meta del usuario como se detalla en el primer fragmento de código -- el que comienza con add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
. Todo ese código puede ir en tu archivo functions.php
, para que siempre esté disponible para el formulario de Gravity Forms.
Luego agrega el siguiente código a tu archivo de plantilla de página (page.php
por defecto):
<?php
if ( is_user_logged_in() ) {
global $current_user;
// $current_user = get_currentuserinfo();
// parece que estaba sobrescribiendo la variable $current_user existente
$user_id = $current_user->ID;
$meta_key = 'gform_entry_id';
$single = true;
$entry_id = get_user_meta( $user_id, $meta_key, $single );
if( strlen( $entry_id ) > 0 && is_numeric( $entry_id ) ) {
// tenemos un ID de entrada ahora
?>
<h2>Hola <?php echo $current_user->display_name ?>, gracias por enviar el formulario. Visita tu página aquí: www.example.com/<?php echo( $entry_id ); ?></h2>
<?php
} else {
// no tenemos un ID de entrada para este usuario
?>
<h2>Hola <?php echo $current_user->display_name ?>, Gracias por unirte. Para crear una página por favor envía el formulario a continuación:</h2><?php echo do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]'); ?>
<?php
}
} else {
// el usuario no ha iniciado sesión
?>
<h2>Por favor inicia sesión para crear una página <?php do_action( 'wordpress_social_login' ); ?></h2>
<?php
}
?>
Creo que eso debería hacer lo que estás buscando.
[1] La documentación de usuario de Gravity Forms requiere que inicies sesión en su sitio.
[2] http://www.gravityhelp.com/documentation/page/Entry_Object -- busca post_id
en la página.

El código está funcionando (es decir, no da errores) pero no funciona como deseábamos. Creé un usuario nuevo y, al iniciar sesión, el formulario se muestra (lo cual está bien), pero después de enviarlo, el formulario sigue mostrándose (en lugar de la primera opción con la URL/ID de entrada). He copiado y pegado tu primer fragmento de código (el superior) en mi archivo functions.php y agregué el ID del formulario (2) así en la primera línea: add_action( 'gform_after_submission_2', 'wpse96468_map_user_to_entry', 10, 2 );

También probé la función 'Mejor manera (quizás)', pero da el mismo resultado. Parece que no tiene éxito en obtener el ID de entrada.

En el archivo page.php
, agrega esto justo después de la línea $entry_id = get_user_meta( $user_id, $meta_key, $single );
: echo( "DEBUG: \$user_id = $user_id; \$entry_id = $entry_id<br />\n" );
¿Qué imprime?

Muestra "DEBUG: $user_id = ; $entry_id =" en la página web justo encima del <h2>Hola <?php echo $current_user->display_name ?>, Gracias por unirte. Para crear una página por favor envía el formulario a continuación:</h2><?php echo do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]'); ?>

He actualizado el código de page.php
, después de probarlo en mi instalación local. He comentado la llamada a get_currentuserinfo()
porque parece que estaba vaciando la variable global $current_user
. Espero que eso haga lo que necesitas.

¡¡Sí!! eso solucionó el problema. Buen hallazgo y muchas gracias. ¿Hay alguna forma de contactarte por mensaje privado para futuras consultas? Me gustaría mencionarte en los créditos del sitio ;-)

Mi sitio web está en mi perfil, solo haz clic en mi nombre de usuario. En mi página de inicio, al final de la sección "Acerca de Patrick", encontrarás enlaces a mis cuentas de Facebook y Twitter. Por otro lado, si mi respuesta te funcionó, por favor márcala como Aceptada.

Lo siento, la solución no funciona para usuarios registrados que iniciaron sesión mediante Wordpress Social Login (u otros plugins de inicio social). Después de que un usuario se registra mediante inicio social y envía el formulario, parece haber un problema para reconocer el ID de entrada para estos usuarios. Cuando reviso las páginas o los usuarios en el panel de control, no hay nada inusual en comparación con los usuarios registrados de la manera normal como probé ayer. Hoy probé varios plugins de inicio social con dos proveedores (Twitter y Facebook). ¿Alguna idea de por qué ocurre esto y cómo encontrar una solución?

Lo siento, no estoy familiarizado con plugins de inicio social. Lo primero que sugeriría es averiguar cómo esos plugins generan usuarios: ¿obtienen un ID de usuario de la misma manera que un usuario "regular" de WordPress? Si no es así, entonces mi código no funcionará, ya que asume que el usuario tiene todos los campos asociados en la base de datos como tendría un usuario normal de WordPress. Más allá de eso, no puedo ser de mucha ayuda.
