¿Cómo obtener el ID de entrada de Gravityform del envío del formulario del usuario actual? [cerrado]

4

Caso: Cuando un usuario envía un formulario (Gravedad), el complemento genera automáticamente un ID de entrada único para ese formulario específico. En mi caso, la configuración del formulario solo permite al usuario enviar el formulario una vez, y solo si el usuario 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 creada por el usuario. No solo justo después del envío, sino cada vez que el usuario inicia 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 la página.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 ) { ?>
// This is what user see if form is submitted, where '{entry-ID}' should be replaced by the user's entry iD 
<h2>Hey <?php echo $current_user->display_name ?>, thank you for submitting the form. Visit your page here: www.example.com/{entry-ID}</h2>

<?php } else { ?>
// If user have not submitted a form, user is shown the info below with the form to submit
<h2>Hey <?php echo $current_user->display_name ?>, Thank you for joining. To create a page please submit the form below:</h2><?php echo do_shortcode('[gravityform id="2" name="just a form" title="false" description="false"]'); ?>

<?php } } else { ?>
// if user is not logged in, user is urged to log in to submit form
<h2><Please log in to create a page <?php do_action( 'wordpress_social_login' ); ?></h2>

<?php } ?>

Esta es la función que utilizo para hacer el formulario (ID = 2) para crear una 'página':

add_filter("gform_post_data", "change_post_type", 10, 2);
function change_post_type($post_data, $form){
    //only change post type on form id 1
    if($form["id"] != 2)
       return $post_data;

    $post_data["post_type"] = "page";
    return $post_data;
}
    
pregunta tobe 19.04.2013 - 16:57

1 respuesta

5

Puede usar gform_after_submission hook [1] para agregar el ID de entrada (y probablemente el Formulario ID para minimizar la confusión si tiene múltiples formularios) a la metainformación del usuario usando add_user_meta() .

<?php
add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
// to tie it to a specific form, use the format below,
// replacing '{$form_id}' with the actual form ID
// add_action( 'gform_after_submission_{$form_id}', 'wpse96468_map_user_to_entry', 10, 2 );

function wpse96468_map_user_to_entry( $entry, $form ) {
    // get your user's ID here
    // EDITED -- this should work, 
    // if only logged-in users can submit the form
    $user_id = $entry['created_by'];
    // set the arguments for the add_user_meta() function
    $meta_key = 'gform_entry_id';
    $meta_value = $entry['id'];
    // if you want to pass both the Entry and Form IDs, you can use an array:
    // $meta_value = array( 'entry_id' => $entry['id'], 'form_id' => $form['id'] );
    $unique = true;
        // optional, but the default is false,
        // and if I understand your question, you want this to be unique
    add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>

Una mejor manera (tal vez)

Si estás utilizando GForms para crear una publicación (o página, probablemente), parece haber una forma más fácil:

<?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']; // see note [2] for a link
    $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ó, puede 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 .= "Hey {$current_user->display_name}, thank you for submitting the form. View your page here: $page_link";
        } else {
            $content .= "Hey {$current_user->display_name}, please fill in the form below<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

Suponiendo que la generación de su página se realiza según lo solicitado en la pregunta original (es decir, example.com/{entry-ID} , y solo desea que el código se pueda insertar en un archivo de plantilla de página ( page.php o similar), aquí está mi sugerencia:

Agregue el ID de entrada a la metainformación 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 el código que puede incluirse en su archivo functions.php , para que siempre esté disponible para el formulario de Formularios de Gravedad.

Luego agregue el siguiente ejemplo de código a su archivo de plantilla de página ( page.php de manera predeterminada):

<?php
    if ( is_user_logged_in() ) {
        global $current_user;
        // $current_user = get_currentuserinfo();
        // seems I was clobbering the existing $current_user variable
        $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 ) ) {
            // we have an entry ID now
            ?>
            <h2>Hey <?php echo $current_user->display_name ?>, thank you for submitting the form. Visit your page here: www.example.com/<?php echo( $entry_id ); ?></h2>
            <?php
        } else {
            // we don't have an entry ID for this user
            ?>
            <h2>Hey <?php echo $current_user->display_name ?>, Thank you for joining. To create a page please submit the form below:</h2><?php echo do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]'); ?>
            <?php
        }
    } else {
        // user is not logged in
        ?>
        <h2><Please log in to create a page <?php do_action( 'wordpress_social_login' ); ?></h2>
        <?php
    }
?>

Creo que debería hacer lo que estás buscando.

[1] La documentación del usuario de Gravity Forms requiere que inicies sesión en su sitio.

[2] enlace : estás buscando post_id en la página.

    
respondido por el Pat J 19.04.2013 - 18:17

Lea otras preguntas en las etiquetas