Form semplice che salva nel database
Sto utilizzando un servizio di terze parti che effettua un controllo del mio database per le nuove voci all'interno di una tabella specifica. Tuttavia non sono riuscito a trovare un plugin per form semplice che invii i dati al database di WordPress all'interno di una tabella senza influenzare le funzionalità di WordPress. Il motivo è che il mio provider di hosting mi permette di avere un solo database.
Ho bisogno di utilizzare un form in WordPress che:
- Catturi nome, telefono, email inviati dall'utente finale
- Salvi nel database
- Reindirizzi l'utente a una pagina di conferma
Niente di elaborato in realtà e sebbene sarebbe ottimo vedere i risultati nell'amministrazione di WordPress, non è necessariamente richiesto dato che posso semplicemente usare phpMyAdmin.
In sintesi:
Ho bisogno di un semplice form HTML/PHP, dove posso semplicemente incollare il codice HTML su una pagina tramite l'amministrazione di WordPress usando la visualizzazione HTML/codice per le pagine. Quando un utente invia il form, questo salva i dati nel database di WordPress e poi reindirizza l'utente a una pagina di "ringraziamento".
Da quello che posso capire, hai già la tabella nel tuo database.
Non so come l'hai chiamata, ma una buona pratica (per me una pratica obbligatoria) è nominarla con lo stesso prefisso delle tabelle di WordPress, quello impostato nel file wp-config.php
.
Non dici neanche come è strutturata questa tabella, ma immagino sia qualcosa del tipo:
ID (integer,primary,autoincrement) | name (varchar) | phone (varchar) | email (varchar)
Puoi aggiungere uno shortcode che stampi il form. Nel tuo functions.php
aggiungi:
add_action('init', function() {
add_shortcode('userform', 'print_user_form');
});
function print_user_form() {
echo '<form method="POST">';
wp_nonce_field('user_info', 'user_info_nonce', true, true);
?>
Tutti i tuoi campi del form (nome, email, telefono) vanno qui.
<?php
submit_button('Invia Dati');
echo '</form>';
}
Ora crea semplicemente un articolo o una pagina nel pannello di controllo di wp e aggiungi [userform]
: il form viene magicamente stampato nella pagina.
Come puoi vedere non ho aggiunto l'attributo action al form, in questo modo il form invia i dati POST alla stessa pagina.
Ora devi salvare i dati. Aggiungi un'azione su un hook early, controlla la presenza di $_POST
, verifica il nonce e salva i tuoi dati:
add_action('template_redirect', function() {
if ( ( is_single() || is_page() ) &&
isset($_POST[user_info_nonce]) &&
wp_verify_nonce($_POST[user_info_nonce], 'user_info')
) {
// dovresti fare la validazione prima di salvare i dati nel db.
// Non scriverò la funzione di validazione, è fuori dallo scopo di questa risposta
$pass_validation = validate_user_data($_POST);
if ( $pass_validation ) {
$data = array(
'name' => $_POST['name'],
'email' => $_POST['email'],
'phone' => $_POST['phone'],
);
global $wpdb;
// se hai seguito il mio suggerimento di nominare la tua tabella usando il prefisso di wordpress
$table_name = $wpdb->prefix . 'my_custom_table';
// la prossima riga inserirà i dati
$wpdb->insert($table_name, $data, '%s');
// se vuoi recuperare il valore ID della riga appena inserita usa
$rowid = $wpdb->insert_id;
// dopo l'inserimento dobbiamo reindirizzare l'utente
// Ti suggerisco di creare un'altra pagina e intitolarla "Grazie"
// se lo fai:
$redirect_page = get_page_by_title('Grazie') ? : get_queried_object();
// la riga precedente se la pagina intitolata 'Grazie' non è trovata imposta la pagina corrente
// come pagina di reindirizzamento. La prossima riga ottiene l'url della pagina di reindirizzamento:
$redirect_url = get_permalink( $redirect_page );
// ora reindirizza
wp_safe_redirect( $redirect_url );
// e ferma php
exit();
}
}
});
Il codice è grezzo, ma dovrebbe essere un valido punto di partenza. I commenti inline dovrebbero aiutarti a capire il flusso di lavoro.
Assicurati di leggere la documentazione:

Grazie per la risposta estremamente dettagliata. C'è molto da digerire, ti terrò aggiornato sui miei risultati e grazie ancora.

Domande rapide: 1. Se avessi bisogno di più di un modulo, c'è un modo per aggiungere un nome allo shortcode come [userform:FormA] o [userform:Contact] che aggiungerebbe FormA alla classe ID del campo del form html oltre a inserire FormA in un campo nascosto nel form? 2. Per il secondo blocco di codice, andrebbe inserito anche nel file functions.php? 3. Quale parte del secondo esempio di codice fa sì che WordPress sappia di eseguire quella funzionalità solo sui form creati con questo metodo? Non vedo un modo per verificare che l'invio del form provenga dal form creato tramite lo shortcode.

(1) ciò di cui hai bisogno sono gli shortcode atts utilizzandoli puoi personalizzare il form come vuoi, vedi la documentazione di add_shortcode
linkata nella risposta. (2) Sì. Il codice che inizia con add_filter
o add_action
devi creare un plugin per contenerlo o inserirlo in functions.php
: dipende se vuoi/puoi perdere quella funzionalità quando cambi tema. (3) il motivo d'essere di wp_verify_nonce
è proprio questo. Verifica una variabile $_POST
(creata da wp_nonce_field
) che contiene un valore cifrato creato a partire da una stringa semplice, in questo caso 'user_info'. Ancora una volta, vedi i link alla documentazione alla fine della risposta. @Damainman

domanda veloce, hai un tag di chiusura php in cima e un tag di apertura php verso il fondo della tua funzione shortcode. Puoi verificare perché è impostato così?

@Damainman "All your form inputs (name, email, phone) goes here." è pensato per essere un segnaposto per la parte html del modulo, quindi chiudo i tag php prima e li riapro dopo per evitare una lunga e brutta successione di echo
. Scrivi semplicemente l'html lì come faresti normalmente.
