Web development

10
Giu
2016

Passare il valore di variabili $_POST con CF7

Contact Form 7 è un plugin per WordPress tra i più conosciuti e i più utilizzati. Permette di realizzare rapidamente form di contatto, anche complessi, utilizzando degli shortcode che sviluppano in un completo markup HTML5. Non solo: CF7 può gestire anche gli invii postali (a un destinatario e al mittente per conferma), possiede un sistema di validazione dei campi e consente controlli lato server con i nonce di WordPress. Con le opportune estensioni, è anche in grado di immagazzinare i dati in un dbase (utilissimo, ad esempio, per raccogliere gli indirizzi email di chi scrive) o di presentare campi condizionati, in base alle opzioni selezionate nel form. Il plugin dispone anche di un’ottima documentazione, che permette agli sviluppatori di personalizzarne le funzioni. Per tutte queste ragioni, l’uso del plugin è in molti casi preferibile alla costruzione manuale dei form.

CF7 non conserva i valori delle variabili $_POST

Anche i form di CF7 inviano i valori dei campi compilati attraverso il metodo POST, creando un array e immagazzinandolo in una variabile $_POST. Peccato però che i valori vengano eliminati subito dopo l’invio e non siano più disponibili. Questo non è un problema se mi serve solo un invio postale, ma lo diventa se volessi passare uno o tutti i valori del form a un’altra pagina. Potrei, ad esempio, voler creare una pagina di riepilogo con i dati inseriti dall’utente, oppure impostare una thank you page personalizzata. O ancora, potrei voler realizzare un form a più pagine e conservare i dati già inseriti o valorizzare dei campi nel form di destinazione.
Per tutto questo è necessario conservare i valori dell’array e per farlo bisogna “catturarli” prima che CF7 li cancelli inviando la mail.

Creare una sessione con i valori del form di Contact Form 7

Il “trucco” consiste nel creare una sessione con i dati dell’array $_POST PRIMA che CF7 invii la mail. Possiamo farlo attraverso l’hook wpcf7_before_send_mail, aggiungendo poche righe al file functions.php.

Anzitutto dobbiamo attivare le sessioni in WordPress, perché di default le sessioni non sono permesse.

add_action('init', 'attiva_sessioni', 1);

function attiva_sessioni() {
    if(!session_id()) {
        session_start();
    }
}

Poi aggiungo la funzione per mantenere i valori dell’array $_POST in una sessione.

function imposta_sessione($cf7) {
    $submission = WPCF7_Submission::get_instance();

    if ( $submission ) {
        $posted_data = $submission->get_posted_data();
    }
    $_SESSION['datiform'] = $posted_data;
    return false;
}

add_action( 'wpcf7_before_send_mail', 'imposta_sessione' );

A questo punto, i valori $_POST (tranne il nonce di controllo) sono immagazzinati in $_SESSION['datiform'] e possono essere richiamati nella pagina che ci interessa. Per controllare i dati dell’array potete usare print_r($_SESSION['datiform']).

Una volta estratti i dati, è buona norma distruggere la sessione, per non lasciare dati memorizzati sul server. Potete quindi scrivere:

unset($_SESSION['datiform']);

Vecchie versioni di CF7

Il metodo descritto sopra è valido dalla versione 3.9 di Contact Form 7. Nelle versioni precedenti infatti, i dati venivano richiamati in maniera diversa. I vecchi post che trattano il problema potrebbero ancora riportare il vecchio codice non più funzionante. Il metodo corretto di estrazione è

$submission = WPCF7_Submission::get_instance();
 
if ( $submission ) {
    $posted_data = $submission->get_posted_data();
}

mentre quello obsoleto è

$posted_data = $contact_form->posted_data; // Non funziona!

Realizzo siti internet per aziende e professionisti: ideazione, progettazione e sviluppo, front end e back end.

Altri post

2 Commenti:

  1. Nino dicembre 17, 2016 Risposta

    Ciao Angelo, grazie per questo post, sarebbe proprio quello che cerco se riuscissi a farlo funzionare. Ho seguito le tue indicazioni modificando il file functions.php ed ho quindi inserito il seguente codice nella mia pagina di ringraziamento

    tuttavia non riesco a visualizzare il contenuto dei miei campi. Considera che il form in questione è molto semplice e contiene solo il campo nome e il campo email. Ho bisogno di “acchiappare” questi due valori nella pagina di ringraziamento per registrarli nella mia piattaforma di mail marketing. Non capisco comunque della tue spiegazioni come verrebbero passati i due valori. Con due variabili diverse? Con quali nomi?

    Mi faresti cosa immensamente gradita se mi potessi aiutare. Grazie

  2. Angelo Portalupi dicembre 21, 2016 Risposta

    Purtroppo non riesco a vedere il codice che hai postato (WordPress non permette l’inserimento di codice nei commenti), perciò non posso capire se c’è un errore e come risolverlo. I valori vengono passati con un array nella sessione $_SESSION[‘datiform’], perciò i valori saranno qualcosa come $_SESSION[‘formdata’][‘nome’], $_SESSION[‘formdata’][‘email’] e così via. Ricordati che la sessione va disattivata DOPO che si sono raccolti i dati. Se vuoi puoi contattami privatamente, copiando il codice che hai usato, in modo da poterti dare una risposta.
    Se però la tua esigenza è di mantenere un dbase con i dati di chi ti scrive, puoi usare il plugin Contact Form DB che fa proprio ciò che ti serve.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *