wp_mail non invia email - Risoluzione problemi WordPress
Ho utilizzato WP-Mail-SMTP
per configurare il sistema di invio email nel mio sito WordPress.
Ho testato il funzionamento inviando email al mio indirizzo personale.
Ora sto provando a inviare i dati di un modulo usando la funzione wp_mail()[WP].
Ecco il codice:
<?php
if(isset($_POST["button_pressed"])){
// Controllo campi vuoti..
if($_POST["dname"]==""){
echo "Compila tutti i campi..";
}
else {
$email=$_POST['email'];
$message = $_POST['dname'];
$headers = 'From:' . "\r\n"; // Email del mittente
$headers .= 'Cc:' . "\r\n"; // Copia carbone al mittente
// Le righe del messaggio non dovrebbero superare 70 caratteri (regola PHP), quindi aggiungi a capo
// $message = wordwrap($message, 70);
wp_mail("INDIRIZZO-EMAIL-PRIVATO", $subject, $message, $headers)
echo "La tua email è stata inviata con successo! Grazie per il feedback";
}
?>
Modulo HTML
<form>
<div class="row">
<div class="form-group">
<div class="col-sm-6"><input class="form-control" type="text" placeholder="NOME DEL CANE" id="dname" /></div>
<div class="col-sm-6"><input class="form-control" type="text" placeholder="NOME DEL PROPRIETARIO" id="name" /></div>
</div>
</div>
<input type="submit" value="INVIA" />
<input type="hidden" name="button_pressed" value="1" />
</form>
Ho provato molti tutorial, ma nessuno ha funzionato. I vostri commenti e suggerimenti mi saranno molto utili. Grazie per il vostro tempo.
Dopo aver smanettato per ore, ho trovato il problema.
Non era il PHP ma il form.
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOME DEL CANE" id="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOME DEL PROPRIETARIO" id="name" /></div>
L'attributo id
deve essere name
.
Corretto
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOME DEL CANE" name="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOME DEL PROPRIETARIO" name="name" /></div>
</div>

YIKESSSSSS. Ci sono molte cose sbagliate.
Devi sanificare i dati $_POST altrimenti potrebbero accadere cose molto molto brutte...
È meglio usare gli apici singoli per le stringhe in WordPress
Spaziature e indentazione non seguono le migliori pratiche.
Non stai facendo nulla con $_POST['name'] ???
Stai chiamando $_POST["email"] ma non lo stai passando attraverso il form di esempio, il che risulterà in errori di variabile non definita (USA WP DEBUG !!! IMPOSTALO SU TRUE)
È importante verificare tutti i valori $_POST, non solo uno, perché qualcuno potrebbe manipolare il form o uno spammer potrebbe inviare email senza che il form abbia un valore POST mancante, causando nuovamente errori di variabile non definita.
wp_mail dovrebbe avere un punto e virgola alla fine
Manca una parentesi di chiusura, il PHP non funzionerebbe mai.
L'else non è necessario
È meglio usare wp_die se c'è manomissione del form. Se non vuoi una cattiva esperienza utente, usa semplicemente il tag HTML required nei campi di input.
Non c'è bisogno di div di chiusura dopo i campi di input
È meglio usare CSS e Bootstrap nativo per gestire le lettere maiuscole.
il php
<?php
if ( isset( $_POST["button_pressed"] ) ) {
// Verifica campi vuoti..
if ( empty( $_POST['dname'] ) || empty( $_POST['name'] ) ) {
wp_die( __( 'Per favore compila tutti i campi la prossima volta.', 'your-text-domain' ) );
}
$message = sanitize_text_field( $_POST['dname'] );
// $email = sanitize_email( $_POST["email"] );
$name = sanitize_text_field( $_POST['name'] );
$headers = 'From:' . "\r\n"; // Email del mittente
$headers .= 'Cc:' . "\r\n"; // Copia carbone al mittente
// Invia email
wp_mail( 'PRIVATE-EMAIL-ADDRESS', $subject, $message, $headers );
// Mostra messaggio e nascondi il form
_e( 'La tua email è stata inviata con successo! Grazie per il tuo feedback.', 'your-text-domain' );
echo '<style>#contact-form{ display: none; }</style>';
}
?>
e il markup html
<form action="" id="contact-form" method="post">
<div class="row">
<div class="form-group">
<div class="col-sm-6">
<input class="form-control text-uppercase" type="text" placeholder="<?php _e( 'Inserisci il nome del cane', 'your-text-domain' ); ?>" name="dname" required>
<div class="col-sm-6">
<input class="form-control text-uppercase" type="text" placeholder="<?php _e( 'Inserisci il nome del proprietario', 'your-text-domain' ); ?>" name="name" required>
</div>
</div>
</div>
<input type="submit" value="INVIA" />
<input type="hidden" name="button_pressed" value="1" />
</form>

Ho controllato il tuo codice. Penso che l'header non sia definito correttamente. Per favore controlla il codice qui sotto:
$current_user = wp_get_current_user();
$name = sanitize_text_field($_POST["name"]);
$email_address = sanitize_email($_POST["email_address"]);
$detail = esc_textarea($_POST["detail"]);
$message = "Nome : " . $name . "\n";
$message .= "Indirizzo Email : " . $email_address . "\n";
$message .= "Dettaglio : " . $detail . "\n";
$send_to = 'test@test.com';
$headers = 'From: ' . $current_user->user_firstname . ' ' . $current_user->user_lastname . ' <test@test.com>' . "\r\n";
if (wp_mail($send_to, $email_subject, $message, $headers)) {
wp_redirect(admin_url('admin.php?page=contact-page&msg=success'));
exit();
} else {
wp_redirect(admin_url('admin.php?page=contact-page&msg=failed'));
exit();
}
