web-dev-qa-db-fra.com

Comment obtenir l'ID d'entrée Gravityform de la soumission de formulaire de l'utilisateur actuel?

Cas: Lorsqu'un utilisateur soumet un formulaire (Gravity), le plug-in génère automatiquement un ID d'entrée unique pour ce formulaire spécifique. Dans mon cas, les paramètres du formulaire ne permettent à l'utilisateur de le soumettre qu'une seule fois, et uniquement si l'utilisateur est enregistré. Lorsque l'utilisateur soumet le formulaire, une page est créée avec le contenu du formulaire. L'URL de cette page est générée dynamiquement et est basée sur l'ID d'entrée (www.example.com/entry-ID).

Question: Une fois que l'utilisateur a soumis un formulaire et que l'utilisateur est connecté, je souhaite afficher un lien vers la page créée par l'utilisateur. Non seulement juste après la soumission, mais à chaque fois que l'utilisateur est reconnecté. Mais comment obtenir et afficher l'ID d'entrée de cet utilisateur sur une page si cet utilisateur est connecté?

J'ai ce code sur le page.php pour identifier l'utilisateur et déterminer les éléments à afficher:

<?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 } ?>

C'est la fonction que j'utilise pour créer le formulaire (ID = 2) afin de créer une "page":

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;
}
4
tobe

Vous pouvez utiliser le gform_after_submission hook [1] pour ajouter l'ID d'entrée (et probablement l'ID de formulaire afin de minimiser la confusion si vous avez plusieurs formulaires) aux informations méta de l'utilisateur à l'aide de 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 );
}
?>

Une meilleure façon (peut-être)

Si vous utilisez GForms pour créer une publication (ou une page, vraisemblablement), il semble y avoir un moyen plus simple:

<?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 );
}
?>

Pour afficher un lien vers la page générée à l'utilisateur qui l'a généré, vous pouvez ajouter ce qui suit à 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 réponse à vos commentaires

En supposant que votre génération de page se fasse comme demandé dans la question initiale (c.-à-d. example.com/{entry-ID} et que vous souhaitiez simplement du code que vous pouvez insérer dans un fichier de modèle de page (page.php ou similaire), voici ma suggestion:

Ajoutez l'ID d'entrée aux métadonnées de l'utilisateur, comme indiqué dans le premier extrait de code - celui qui commence par add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );. Tout that code peut aller dans votre fichier functions.php, de sorte qu'il sera toujours disponible pour le formulaire Gravity Forms.

Ajoutez ensuite l'exemple de code suivant à votre fichier de modèle de page (page.php par défaut):

<?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
    }
?>

Je pense que cela devrait faire ce que vous cherchez.


[1] La documentation utilisateur de Gravity Forms nécessite que vous vous connectiez à leur site.

[2] http://www.gravityhelp.com/documentation/page/Entry_Object - vous recherchez post_id dans la page.

5
Pat J