Come ottenere l'ID di inserimento Gravityform dalla compilazione del modulo dell'utente corrente?
Caso: Quando un utente invia un modulo (Gravity)form, il plugin genera automaticamente un ID univoco per quel specifico modulo. Nel mio caso le impostazioni del modulo permettono all'utente di inviarlo una sola volta, e solo se l'utente è registrato. Quando l'utente invia il modulo, viene creata una pagina con il contenuto del modulo. L'URL di quella pagina viene generato dinamicamente ed è basato sull'ID di inserimento (www.example.com/entry-ID).
Domanda: Dopo che l'utente ha inviato un modulo, e l'utente ha effettuato l'accesso, voglio mostrare un link alla pagina che è stata creata dall'utente. Non solo subito dopo l'invio, ma ogni volta che l'utente effettua nuovamente l'accesso. Ma come ottenere e visualizzare l'ID di inserimento di quell'utente su una pagina se quell'utente ha effettuato l'accesso?
Ho questo codice su page.php per identificare l'utente e determinare cosa visualizzare:
<?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 ) { ?>
// Questo è ciò che l'utente vede se il modulo è stato inviato, dove '{entry-ID}' dovrebbe essere sostituito dall'ID di inserimento dell'utente
<h2>Ciao <?php echo $current_user->display_name ?>, grazie per aver inviato il modulo. Visita la tua pagina qui: www.example.com/{entry-ID}</h2>
<?php } else { ?>
// Se l'utente non ha inviato un modulo, viene mostrata l'informazione sottostante con il modulo da inviare
<h2>Ciao <?php echo $current_user->display_name ?>, Grazie per esserti unito. Per creare una pagina invia il modulo qui sotto:</h2><?php echo do_shortcode('[gravityform id="2" name="just a form" title="false" description="false"]'); ?>
<?php } } else { ?>
// se l'utente non ha effettuato l'accesso, viene sollecitato a farlo per inviare il modulo
<h2><Per favore effettua l'accesso per creare una pagina <?php do_action( 'wordpress_social_login' ); ?></h2>
<?php } ?>
Questa è la funzione che uso per far creare al modulo (ID=2) una 'pagina':
add_filter("gform_post_data", "change_post_type", 10, 2);
function change_post_type($post_data, $form){
//cambia il tipo di post solo sul form id 1
if($form["id"] != 2)
return $post_data;
$post_data["post_type"] = "page";
return $post_data;
}

Puoi utilizzare l'hook gform_after_submission
[1] per aggiungere l'ID dell'Entry (e probabilmente l'ID del Form per ridurre la confusione nel caso di più form) ai metadati dell'utente usando add_user_meta()
.
<?php
add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
// per associarlo a un form specifico, usa il formato qui sotto,
// sostituendo '{$form_id}' con l'ID effettivo del form
// add_action( 'gform_after_submission_{$form_id}', 'wpse96468_map_user_to_entry', 10, 2 );
function wpse96468_map_user_to_entry( $entry, $form ) {
// ottieni qui l'ID dell'utente
// MODIFICATO -- questo dovrebbe funzionare,
// se solo gli utenti loggati possono inviare il form
$user_id = $entry['created_by'];
// imposta gli argomenti per la funzione add_user_meta()
$meta_key = 'gform_entry_id';
$meta_value = $entry['id'];
// se vuoi passare sia l'ID dell'Entry che del Form, puoi usare un array:
// $meta_value = array( 'entry_id' => $entry['id'], 'form_id' => $form['id'] );
$unique = true;
// opzionale, ma il default è false,
// e se ho capito la tua domanda, vuoi che questo sia unico
add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>
Un modo migliore (forse)
Se stai usando GForms per creare un post (o presumibilmente una pagina), sembra esserci un modo più semplice:
<?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']; // vedi nota [2] per un link
$unique = true;
add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>
Per mostrare un link alla pagina generata all'utente che l'ha creata, puoi aggiungere quanto segue 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 .= "Ciao {$current_user->display_name}, grazie per aver inviato il form. Visualizza la tua pagina qui: $page_link";
} else {
$content .= "Ciao {$current_user->display_name}, per favore compila il form qui sotto<br />\n";
$content .= do_shortcode('[gravityform id="2" name="Unisciti al movimento dei Gooders" title="false" description="false"]');
}
}
return $content;
}
?>
In risposta ai tuoi commenti
Assumendo che la generazione della pagina sia fatta come richiesto nella domanda originale (es. example.com/{entry-ID}
, e vuoi solo del codice da inserire in un file template di pagina (page.php
o simile), ecco il mio suggerimento:
Aggiungi l'ID dell'entry ai metadati dell'utente come dettagliato nel primo snippet di codice -- quello che inizia con add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
. Tutto quel codice può andare nel tuo file functions.php
, così sarà sempre disponibile per il form di Gravity Forms.
Poi aggiungi il seguente codice al tuo file template di pagina (page.php
di default):
<?php
if ( is_user_logged_in() ) {
global $current_user;
// $current_user = get_currentuserinfo();
// sembra che stessi sovrascrivendo la variabile $current_user esistente
$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 ) ) {
// ora abbiamo un ID dell'entry
?>
<h2>Ciao <?php echo $current_user->display_name ?>, grazie per aver inviato il form. Visita la tua pagina qui: www.example.com/<?php echo( $entry_id ); ?></h2>
<?php
} else {
// non abbiamo un ID dell'entry per questo utente
?>
<h2>Ciao <?php echo $current_user->display_name ?>, Grazie per esserti unito. Per creare una pagina per favore invia il form qui sotto:</h2><?php echo do_shortcode('[gravityform id="2" name="Unisciti al movimento dei Gooders" title="false" description="false"]'); ?>
<?php
}
} else {
// l'utente non è loggato
?>
<h2>Per favore accedi per creare una pagina <?php do_action( 'wordpress_social_login' ); ?></h2>
<?php
}
?>
Penso che questo dovrebbe fare quello che stai cercando.
[1] La documentazione utente di Gravity Forms richiede di accedere al loro sito.
[2] http://www.gravityhelp.com/documentation/page/Entry_Object -- stai cercando post_id
nella pagina.

Il codice funziona (cioè non dà errori) ma non funziona come desideravamo. Ho creato un nuovo utente e quando accede, il modulo viene mostrato (questo è OK) ma dopo l'invio il modulo viene ancora mostrato (invece della prima opzione con l'url/entry-ID). Ho copiato-incollato il tuo primo snippet di codice nel mio functions.php e ho aggiunto l'ID del modulo (2) così nella prima riga: add_action( 'gform_after_submission_2', 'wpse96468_map_user_to_entry', 10, 2 );

Ho provato anche la funzione 'Metodo migliore (forse)', ma dà lo stesso risultato. Sembra che non riesca a ottenere l'entry-ID?

Nel file page.php
, aggiungi questo subito dopo la riga $entry_id = get_user_meta( $user_id, $meta_key, $single );
: echo( "DEBUG: \$user_id = $user_id; \$entry_id = $entry_id<br />\n" );
Cosa stampa?

Mostra "DEBUG: $user_id = ; $entry_id =" sulla pagina web appena sopra il <h2>Ciao <?php echo $current_user->display_name ?>, grazie per esserti unito. Per creare una pagina invia il modulo qui sotto:</h2><?php echo do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]'); ?>

Ho aggiornato il codice page.php
, dopo averlo testato sulla mia installazione locale. Ho commentato la chiamata get_currentuserinfo()
perché sembrava che stesse svuotando la variabile globale $current_user
. Spero che questo risolva il tuo problema.

Sì!! Ha funzionato. Ottimo lavoro e grazie mille. C'è un modo per contattarti in privato per futuri contatti? Vorrei menzionarti nei crediti del sito ;-)

Il mio sito web è nel mio profilo — basta cliccare sul mio username. Nella mia homepage, alla fine della sezione "About Patrick", troverai i link ai miei account Facebook e Twitter. Un'altra cosa — se la mia risposta ti è stata utile, per favore segnala come Accettata.

Scusa, la soluzione non funziona per gli utenti loggati che si sono registrati tramite Wordpress Social Login (o altri plugin di social login). Dopo che un utente si è registrato tramite social login e ha inviato il form, sembra esserci un problema nel riconoscere l'entry-ID per questi utenti. Quando controllo le pagine o gli utenti nella dashboard, non c'è nulla di insolito rispetto agli utenti registrati nel modo normale come ho testato ieri. Oggi ho testato diversi plugin di social login con due provider social (Twitter e Facebook). Hai idea di come sia possibile e come trovare una soluzione?

Mi dispiace, ma non ho familiarità con i plugin di social login. La prima cosa che suggerirei è capire come questi plugin generano gli utenti — ricevono un User ID nello stesso modo di un utente WordPress "normale"? Se no, allora il mio codice non funzionerà, perché presuppone che l'utente abbia tutti i campi associati nel database come un normale utente WordPress. Oltre a questo, non posso essere di grande aiuto.
