Cum să obții ID-ul înregistrării din Gravityform pentru formularul trimis de utilizatorul curent?

19 apr. 2013, 17:57:26
Vizualizări: 29.9K
Voturi: 5

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;
}
5
Comentarii

Doriți ID-ul intrării din Gravity Forms asociat cu utilizatorul sau ID-ul paginii pe care o creează trimiterea formularului lor?

Pat J Pat J
19 apr. 2013 21:55:27

Doresc să afișez ID-ul intrării asociat cu utilizatorul curent. Scopul este să ofer acelui utilizator (când este autentificat) un titlu/link către pagina sa creată.

tobe tobe
19 apr. 2013 23:30:43

Ar putea exista o modalitate mai ușoară. Dacă utilizați Gravity Forms pentru a genera pagini, atunci există un ID pentru noua pagină/post în obiectul Entry. Voi adăuga un alt segment de cod în răspunsul meu pentru a arăta la ce mă refer.

Pat J Pat J
19 apr. 2013 23:45:57

Vezi mai sus codul funcției pe care îl folosesc pentru ca Gravityforms să creeze o pagină (în loc de post) dacă este folosit formularul cu ID=2. Poate este util pentru a afla de ce funcția care obține ID-ul intrării nu funcționează?

tobe tobe
20 apr. 2013 15:48:25

'$current_user->entry_id' îl returnează când utilizatorul tău este autentificat - deja ai '$current_user->ID'

Steve Steve
13 nov. 2016 22:07:54
Toate răspunsurile la întrebare 1
9

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ă.

19 apr. 2013 19:17:49
Comentarii

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

tobe tobe
20 apr. 2013 10:19:30

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?

tobe tobe
20 apr. 2013 15:51:47

Î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ă?

Pat J Pat J
20 apr. 2013 21:37:46

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"]'); ?>

tobe tobe
20 apr. 2013 22:55:49

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.

Pat J Pat J
20 apr. 2013 23:11:14

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

tobe tobe
20 apr. 2013 23:33:15

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.

Pat J Pat J
20 apr. 2013 23:43:39

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?

tobe tobe
22 apr. 2013 19:09:19

Î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.

Pat J Pat J
22 apr. 2013 19:12:53
Arată celelalte 4 comentarii