wp_mail no envía correos electrónicos - Solución
He utilizado WP-Mail-SMTP
para configurar el servicio de correo en mi instalación de WordPress.
He probado enviando correos a mi email personal.
Ahora estoy intentando enviar datos de un formulario usando la función wp_mail()[WP].
A continuación está el código.
<?php
if(isset($_POST["button_pressed"])){
// Verificando campos vacíos..
if($_POST["dname"]==""){
echo "Rellena todos los campos..";
}
else {
$email=$_POST['email'];
$message = $_POST['dname'];
$headers = 'From:' . "\r\n"; // Email del remitente
$headers .= 'Cc:' . "\r\n"; // Copia al remitente
// Las líneas del mensaje no deben exceder 70 caracteres (regla de PHP), así que lo dividimos
// $message = wordwrap($message, 70);
wp_mail("PRIVATE-EMAIL-ADDRESS", $subject, $message, $headers)
echo "¡Tu correo ha sido enviado correctamente! Gracias por tu feedback";
}
?>
Formulario HTML
<form>
<div class="row">
<div class="form-group">
<div class="col-sm-6"><input class="form-control" type="text" placeholder="NOMBRE DEL PERRO" id="dname" /></div>
<div class="col-sm-6"><input class="form-control" type="text" placeholder="NOMBRE DEL DUEÑO" id="name" /></div>
</div>
</div>
<input type="submit" value="ENVIAR" />
<input type="hidden" name="button_pressed" value="1" />
</form>
He probado muchos tutoriales, pero ninguno me ha ayudado. Sus comentarios y sugerencias serán muy útiles para mí. Gracias por su tiempo.
Después de jugar durante horas, encontré el problema.
Era el formulario, no el PHP.
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOMBRE DEL PERRO" id="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOMBRE DEL DUEÑO" id="name" /></div>
El atributo id
debe ser name
.
Corregido
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOMBRE DEL PERRO" name="dname" /></div>
<div class="col-sm-6">
<input class="form-control" type="text" placeholder="NOMBRE DEL DUEÑO" name="name" /></div>
</div>

YIKESSSSSS. Hay muchas cosas mal aquí.
Debes sanitizar los datos de $_POST o cosas muy muy malas pueden pasar...
Es mejor usar comillas simples para cadenas en WordPress
El espaciado y la indentación no siguen las mejores prácticas.
¿No estás haciendo nada con $_POST['name']?
Estás llamando a $_POST["email"] pero no lo pasas a través del formulario de ejemplo, lo que resultará en errores de variable indefinida (¡¡¡USA WP_DEBUG !!! PONLO EN TRUE)
Es importante verificar todos los valores de $_POST, no solo uno, porque alguien podría manipular el formulario o un spammer podría enviar un correo sin el formulario, lo que causaría errores de variable indefinida nuevamente.
wp_mail debería tener un punto y coma al final
Te falta un corchete de cierre, el PHP nunca funcionaría.
El else no es necesario
Es mejor usar wp_die si hay manipulación del formulario. Si no quieres mala experiencia de usuario, simplemente usa el atributo required HTML en los campos de entrada.
No necesitas divs de cierre después de los campos de entrada
Es mejor usar CSS y Bootstrap nativo para manejar las letras mayúsculas.
el php
<?php
if ( isset( $_POST["button_pressed"] ) ) {
// Verificando campos vacíos...
if ( empty( $_POST['dname'] ) || empty( $_POST['name'] ) ) {
wp_die( __( 'Por favor completa todos los campos la próxima vez.', 'your-text-domain' ) );
}
$message = sanitize_text_field( $_POST['dname'] );
// $email = sanitize_email( $_POST["email"] );
$name = sanitize_text_field( $_POST['name'] );
$headers = 'From:' . "\r\n"; // Correo del remitente
$headers .= 'Cc:' . "\r\n"; // Copia al remitente
// Enviar correo
wp_mail( 'PRIVATE-EMAIL-ADDRESS', $subject, $message, $headers );
// Mostrar mensaje y ocultar el formulario
_e( '¡Tu correo ha sido enviado con éxito! Gracias por tu feedback.', 'your-text-domain' );
echo '<style>#contact-form{ display: none; }</style>';
}
?>
y el html markup
<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( 'Ingresa el nombre del perro', 'your-text-domain' ); ?>" name="dname" required>
<div class="col-sm-6">
<input class="form-control text-uppercase" type="text" placeholder="<?php _e( 'Ingresa el nombre del dueño', 'your-text-domain' ); ?>" name="name" required>
</div>
</div>
</div>
<input type="submit" value="ENVIAR" />
<input type="hidden" name="button_pressed" value="1" />
</form>

He revisado tu código. Creo que el encabezado no está definido correctamente. Por favor, revisa el código a continuación:
$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 = "Nombre : " . $name . "\n";
$message .= "Dirección de correo : " . $email_address . "\n";
$message .= "Detalle : " . $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();
}
