Come verificare se $wpdb->insert() ha avuto successo in WordPress?
Sto cercando di scrivere un piccolo script all'interno del mio footer.php
(che trasformerò successivamente in un plugin) che invia due campi di un form a una tabella personalizzata (wp_newsletter
). Riesco già a inviare il form e scrivere nella tabella correttamente, ma non so come posso inviare un messaggio di successo o errore all'utente. Il mio codice attuale è il seguente:
<form method="post">
<input type="text" name="user_name">Nome
<input type="text" name="user_email">Email
<input type="submit">
<?php echo $message; ?>
</form>
<?php
global $wpdb;
$table = $wpdb->prefix . "newsletter";
$name = sanitize_text_field( $_POST["user_name"] );
$email = sanitize_email( $_POST["user_email"] );
$message = "";
if( isset($_POST["submit"]) ) {
if ( is_email($email) && isset($name)) {
if ( $wpdb->insert( $table, array("name" => $name, "email" => $email)) != false ) {
$message = "La tua iscrizione è stata inviata.";
}
}
else {
if ( !is_email($email) ) {
$message = "Indirizzo email non valido.";
} elseif ( !isset($name) ) {
$message = "Il campo nome è obbligatorio.";
} else {
$message = "Entrambi i campi nome ed email sono obbligatori.";
}
}
} else {
$message = "Per favore, riprova più tardi.";
}
?>
<?php wp_footer(); ?>
</body>
</html>
Penso di stare testando correttamente, come indicato dalla documentazione di $wpdb che afferma:
Questa funzione restituisce false se la riga non può essere inserita. Altrimenti, restituisce il numero di righe interessate (che sarà sempre 1).

Restituisce il numero di righe inserite oppure false in caso di errore.
Puoi ottenere l'id del record inserito oppure false se l'inserimento fallisce:
link di riferimento: https://developer.wordpress.org/reference/classes/wpdb/insert/#return
Quindi puoi verificare come mostrato di seguito:
$result_check = $wpdb->insert( $table, array("name" => $name, "email" => $email));
if($result_check){
//inserimento avvenuto con successo
}else{
//qualcosa è andato storto
}

Quando ho capito che PHP è un acronimo per "PHP Hypertext Preprocessor" – con enfasi su "preprocessor" – ho finalmente realizzato che non posso mescolare PHP e HTML e aspettarmi una qualsiasi forma di interattività con l'utente. Quando una pagina web viene servita, il PHP genera l'HTML che poi viene visualizzato dal browser. Se l'utente compie un'azione a cui il PHP deve rispondere, deve necessariamente attivare una nuova pagina PHP/HTML per fornire una risposta. (Un'alternativa sarebbe usare AJAX per inviare dati avanti e indietro senza caricare una nuova pagina. WordPress funziona bene con AJAX e ci sono tutorial a portata di una ricerca su Google.)
Per un modulo semplice come il tuo, userei JavaScript per il controllo degli errori. Se il modulo non è compilato, impedisci l'invio con JS. Se il modulo è completo, l'azione del modulo può puntare a un file .php che si occupa dell'inserimento nel database e mostra il messaggio di successo/fallimento in HTML.

Grazie per il consiglio, scott. Come potrei creare un file .php
che mostri all'utente un messaggio di successo/fallimento?

Scusa per il ritardo nella risposta. In un ambiente web, farei in modo che l'action del form punti a un file .php. I dati vengono inviati via GET al file di destinazione. I dati vengono poi analizzati e inseriti nel DB. Quindi il file .php genera HTML in un nuovo documento web che indica successo o fallimento. Nota che questo non dà all'utente molte opportunità di correggere gli errori per ottenere un risultato migliore una volta che la nuova pagina web è stata caricata.

In WordPress, tuttavia, considererei di provare AJAX. Ci sono molti buoni tutorial, e darei un'occhiata anche al Codex, ma ecco due che hanno funzionato per me: https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/ e https://premium.wpmudev.org/blog/using-ajax-with-wordpress/
AJAX consente l'accesso al DB senza caricare una nuova pagina web. Quindi avresti un elemento che non ha contenuto HTML fino a quando AJAX non restituisce successo/fallimento:
document.getElementById("results-div").innerHTML = content.result;

La logica che gestisce il modulo si trova nello stesso file del modulo: il footer.php
. Sto solo cercando di farlo funzionare in questo modo, poi posso separarlo meglio quando avrò finito con i test. Nonostante ciò, non voglio inviare i dati del mio modulo tramite GET.

Mio errore. Puoi usare POST. Sembra che tu voglia fare AJAX all'interno di footer.php in modo da non causare un ricaricamento della pagina. Dovrai usare javascript per inviare/ricevere i dati AJAX, ma puoi creare un nuovo file .php per gestire la chiamata AJAX. (Io metto i miei file .php all'interno di un plugin in modo che tutte le dipendenze siano gestite dal sistema WP.)
