Cum să obții ID-ul înregistrării din Gravityform pentru formularul trimis de utilizatorul curent?
Situație: Când un utilizator trimite un formular (Gravity), plugin-ul generează automat un ID unic pentru acea înregistrare specifică. În cazul meu, setările formularului permit utilizatorului să trimită formularul o singură dată și doar dacă este înregistrat. Când utilizatorul trimite formularul, se creează o pagină cu conținutul formularului. URL-ul paginii este generat dinamic și se bazează pe ID-ul înregistrării (www.example.com/entry-ID).
Întrebare: După ce utilizatorul a trimis un formular și este autentificat, vreau să afișez un link către pagina creată de utilizator. Nu doar imediat după trimitere, ci de fiecare dată când utilizatorul se autentifică din nou. Dar cum pot obține și afișa ID-ul înregistrării acelui utilizator pe o pagină dacă utilizatorul este autentificat?
Am acest cod în page.php pentru a identifica utilizatorul și a determina ce să afișez:
<?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 ) { ?>
// Asta vede utilizatorul dacă formularul este trimis, unde '{entry-ID}' ar trebui înlocuit cu ID-ul înregistrării utilizatorului
<h2>Salut <?php echo $current_user->display_name ?>, îți mulțumim pentru trimiterea formularului. Vizitează pagina ta aici: www.example.com/{entry-ID}</h2>
<?php } else { ?>
// Dacă utilizatorul nu a trimis un formular, i se arată informațiile de mai jos cu formularul de completat
<h2>Salut <?php echo $current_user->display_name ?>, îți mulțumim că te-ai alăturat. Pentru a crea o pagină te rugăm să completezi formularul de mai jos:</h2><?php echo do_shortcode('[gravityform id="2" name="just a form" title="false" description="false"]'); ?>
<?php } } else { ?>
// dacă utilizatorul nu este autentificat, este îndemnat să se autentifice pentru a trimite formularul
<h2><Te rugăm să te autentifici pentru a crea o pagină <?php do_action( 'wordpress_social_login' ); ?></h2>
<?php } ?>
Aceasta este funcția pe care o folosesc pentru a face ca formularul (ID=2) să creeze o 'pagină':
add_filter("gform_post_data", "change_post_type", 10, 2);
function change_post_type($post_data, $form){
//schimbă tipul de postare doar pentru formularul cu id 1
if($form["id"] != 2)
return $post_data;
$post_data["post_type"] = "page";
return $post_data;
}

Puteți utiliza hook-ul gform_after_submission
[1] pentru a adăuga ID-ul Intrării (și probabil ID-ul Formularului pentru a minimiza confuzia dacă aveți mai multe formulare) la metainformațiile utilizatorului folosind add_user_meta()
.
<?php
add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
// pentru a-l lega de un formular specific, utilizați formatul de mai jos,
// înlocuind '{$form_id}' cu ID-ul real al formularului
// add_action( 'gform_after_submission_{$form_id}', 'wpse96468_map_user_to_entry', 10, 2 );
function wpse96468_map_user_to_entry( $entry, $form ) {
// obțineți ID-ul utilizatorului aici
// EDITAT -- acest lucru ar trebui să funcționeze,
// dacă doar utilizatorii autentificați pot trimite formularul
$user_id = $entry['created_by'];
// setați argumentele pentru funcția add_user_meta()
$meta_key = 'gform_entry_id';
$meta_value = $entry['id'];
// dacă doriți să transmiteți atât ID-ul Intrării cât și al Formularului, puteți utiliza un array:
// $meta_value = array( 'entry_id' => $entry['id'], 'form_id' => $form['id'] );
$unique = true;
// opțional, dar valoarea implicită este false,
// și dacă am înțeles corent întrebarea, doriți ca acesta să fie unic
add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>
O metodă mai bună (poate)
Dacă utilizați GForms pentru a crea un articol (sau o pagină, probabil), există o metodă mai ușoară:
<?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']; // vedeți nota [2] pentru un link
$unique = true;
add_user_meta( $user_id, $meta_key, $meta_value, $unique );
}
?>
Pentru a afișa un link către pagina generată utilizatorului care a generat-o, puteți adăuga următoarele în 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 .= "Hei {$current_user->display_name}, mulțumim pentru trimiterea formularului. Vizualizați pagina dvs. aici: $page_link";
} else {
$content .= "Hei {$current_user->display_name}, vă rugăm să completați formularul de mai jos<br />\n";
$content .= do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]');
}
}
return $content;
}
?>
Ca răspuns la comentariile dumneavoastră
Presupunând că generarea paginii este realizată conform cerinței din întrebarea inițială (adică example.com/{entry-ID}
și doriți doar cod pe care îl puteți introduce într-un fișier de șablon de pagină (page.php
sau similar), iată sugestia mea:
Adăugați ID-ul intrării la metainformațiile utilizatorului conform detaliilor din primul fragment de cod — cel care începe cu add_action( 'gform_after_submission', 'wpse96468_map_user_to_entry', 10, 2 );
. Tot acel cod poate fi introdus în fișierul functions.php
, astfel încât să fie întotdeauna disponibil pentru formularul Gravity Forms.
Apoi adăugați următorul fragment de cod în fișierul de șablon al paginii (page.php
implicit):
<?php
if ( is_user_logged_in() ) {
global $current_user;
// $current_user = get_currentuserinfo();
// se pare că suprascriam variabila $current_user existentă
$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 ) ) {
// avem acum un ID de intrare
?>
<h2>Hei <?php echo $current_user->display_name ?>, mulțumim pentru trimiterea formularului. Vizitați pagina dvs. aici: www.example.com/<?php echo( $entry_id ); ?></h2>
<?php
} else {
// nu avem un ID de intrare pentru acest utilizator
?>
<h2>Hei <?php echo $current_user->display_name ?>, Mulțumim pentru înscriere. Pentru a crea o pagină, vă rugăm să trimiteți formularul de mai jos:</h2><?php echo do_shortcode('[gravityform id="2" name="Join the movement of Gooders" title="false" description="false"]'); ?>
<?php
}
} else {
// utilizatorul nu este autentificat
?>
<h2>Vă rugăm să vă autentificați pentru a crea o pagină <?php do_action( 'wordpress_social_login' ); ?></h2>
<?php
}
?>
Cred că asta ar trebui să realizeze ceea ce căutați.
[1] Documentația utilizatorului pentru Gravity Forms necesită autentificarea pe site-ul lor.
[2] http://www.gravityhelp.com/documentation/page/Entry_Object — căutați post_id
pe pagină.

Codul funcționează (adică nu dă erori), dar nu funcționează așa cum ne-am dorit. Am creat un utilizator nou, iar când m-am autentificat, formularul se afișează (asta e OK), dar după trimitere formularul încă se afișează (în loc de prima opțiune cu URL/ID-intrare). Am copiat și lipit primul fragment de cod (cel de sus) în functions.php și am adăugat ID-ul formularului (2) astfel pe prima linie: add_action( 'gform_after_submission_2', 'wpse96468_map_user_to_entry', 10, 2 );

Am încercat și funcția 'Better way (maybe)', dar dă același rezultat. Se pare că nu reușește să obțină ID-ul intrării?

În fișierul page.php
, adaugă asta imediat după linia $entry_id = get_user_meta( $user_id, $meta_key, $single );
: echo( "DEBUG: \$user_id = $user_id; \$entry_id = $entry_id<br />\n" );
Ce afișează?

Afișează "DEBUG: $user_id = ; $entry_id =" pe pagina web chiar deasupra <h2>Salut <?php echo $current_user->display_name ?>, Mulțumim că te-ai alăturat. Pentru a crea o pagină, completează formularul de mai jos:</h2><?php echo do_shortcode('[gravityform id="2" name="Alătură-te mișcării de Binefăcători" title="false" description="false"]'); ?>

Am actualizat codul din page.php
, după ce l-am testat pe instalarea mea locală. Am comentat apelul get_currentuserinfo()
deoarece se pare că acesta golise variabila globală $current_user
. Sper că asta va rezolva problema ta.

Da!! Asta a funcționat. Bună identificare și îți mulțumesc foarte mult. Există vreo posibilitate să te contactez în privat pentru comunicări viitoare? Aș vrea să te menționez în crediturile site-ului ;-)

Site-ul meu este în profilul meu -- doar faceți clic pe numele meu de utilizator. Pe pagina mea principală, la sfârșitul secțiunii Despre Patrick, veți găsi link-uri către conturile mele de Facebook și Twitter. Pe de altă parte -- dacă răspunsul meu v-a fost util, vă rog să îl marcați ca Acceptat.

Scuze, soluția nu funcționează pentru utilizatorii autentificați care s-au înregistrat prin intermediul Wordpress Social Login (sau alte plugin-uri de autentificare socială). După ce utilizatorii se înregistrează prin autentificare socială și trimit formularul, se pare că există o problemă în recunoașterea ID-ului de intrare pentru acești utilizatori. Când verific paginile sau utilizatorii în panoul de administrare, nu observ nimic neobișnuit în comparație cu utilizatorii înregistrați în mod normal, așa cum am testat ieri. Astăzi am testat mai multe plugin-uri de autentificare socială cu doi furnizori sociali (Twitter și Facebook). Aveți vreo idee cum este posibil acest lucru și cum aș putea găsi o soluție?

Îmi pare rău, nu sunt familiarizat cu plugin-urile de autentificare socială. Primul lucru pe care l-aș sugera este să aflați cum generează acele plugin-uri utilizatori -- primesc ei un ID de utilizator în același mod ca un utilizator "normal" WordPress? Dacă nu, atunci codul meu nu va funcționa, deoarece presupune că utilizatorul are toate câmpurile asociate în baza de date pe care le are un utilizator WordPress obișnuit. În afară de asta, nu vă pot fi de mare ajutor.
