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