Cómo usar PHPmailer en una función en WordPress
Tengo una función en el archivo functions.php de WordPress que busca una condición en los metadatos del usuario y envía un correo electrónico basado en lo que encuentra. Actualmente uso wp_mail() para enviar el correo, y funciona. Sin embargo, quiero usar la clase PHPMailer incluida para hacer esto y así poder enviar los mensajes a través de SMTP.
Pensé que tenía una solución aquí: https://codex.wordpress.org/Plugin_API/Action_Reference/phpmailer_init, sin embargo, esto parece aplicarse solo a mensajes generados por el sistema, no para mensajes personalizados.
En este punto solo estoy adivinando, pero intenté esto, sin éxito (WP deja de cargar justo en este punto, sin mensaje de error):
function my_function() {
//si se encuentran cosas enviar un correo
global $phpmailer;
$phpmailer->IsSMTP();
$phpmailer->Host = 'smtp.google.com';
$phpmailer->Port = '587';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = 'something@gmail.com';
$phpmailer->Password = '11111111';
$phpmailer->addAddress('joe@example.com', 'Joe User');
$phpmailer->setFrom('from@example.com', 'Mailer');
$phpmailer->addReplyTo('info@example.com', 'Information');
$phpmailer->isHTML(true);
$phpmailer->Subject = 'Aquí está el asunto';
$phpmailer->Body = 'Este es el cuerpo del mensaje HTML <b>¡en negrita!</b>';
$phpmailer->send();
// Correo enviado; función terminada
}
Para su información, llamo a esta función en el encabezado. No la estoy agregando como una acción porque quiero controlar dónde se usa.
¿Hay alguna manera de acceder a la clase PHPMailer directamente desde mi función? Supongo que podría cargar PHPMailer por separado, pero eso parece innecesario.
No es necesario usar la clase PHPMailer en lugar de wp_mail()
. wp_mail()
es esencialmente un envoltorio para la clase. Simplemente proporciona una forma más fácil de empaquetar y enviar el mensaje.
Puedes acceder a los elementos de PHPMailer cuando se inicializa para que wp_mail()
envíe a través de SMTP en lugar del servidor web.
Dijiste que no lo estás agregando como una acción para controlar dónde se usa, pero eso es precisamente para lo que sirve un hook de acción: te permite engancharlo exactamente donde quieras, cuando quieras.
En este caso, todos esos elementos de PHPMailer deben configurarse cuando se inicializa PHPMailer. Hay un hook de acción para eso: phpmailer_init
Puedes definir tus configuraciones cuando PHPMailer se inicialice usando ese hook:
add_action( 'phpmailer_init', 'send_smtp_email' );
function send_smtp_email( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.google.com';
$phpmailer->Port = '587';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = 'something@gmail.com';
$phpmailer->Password = '11111111';
$phpmailer->From = 'from@example.com';
$phpmailer->FromName = 'From Name';
$phpmailer->addReplyTo('info@example.com', 'Information');
}
Quieres tu mensaje en HTML. Podrías configurarlo en el argumento de encabezado de wp_mail()
, pero puedes/deberías usar el filtro wp_mail_content_type
para eso:
add_filter( 'wp_mail_content_type','set_my_mail_content_type' );
function set_my_mail_content_type() {
return "text/html";
}
Con tu configuración correctamente hecha, ahora estás listo para usar wp_mail()
para enviar tu mensaje y puedes hacerlo en cualquier lugar. Recomiendo enganchar esta función a algo que tenga sentido, como 'template_redirect' para que lo hagas antes de que se envíen los encabezados:
function my_function() {
$to = 'joe@example.com';
$subject = 'Here is the subject';
$message = 'This is the HTML message body <b>in bold!</b>';
wp_mail( $to, $subject, $message );
}
Actualización: Método Alternativo (Contenido):
Entonces, extendiendo lo descrito anteriormente, supongamos que algunas de estas configuraciones no son lo que normalmente quieres para cada ejecución de wp_mail()
y que solo quieres estas configuraciones para un correo específico.
Aún necesitarías separar las configuraciones y engancharlas apropiadamente (de lo contrario no se procesarán en el momento correcto). Teniendo en cuenta que los hooks phpmailer_init
y wp_mail_content_type
se activan cuando se ejecuta wp_mail()
, podrías configurar esos hooks dentro de tu función principal, ejecutar tu correo y luego eliminarlos para volver a los valores predeterminados.
function send_smtp_email( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.google.com';
$phpmailer->Port = '587';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = 'something@gmail.com';
$phpmailer->Password = '11111111';
$phpmailer->From = 'from@example.com';
$phpmailer->FromName = 'From Name';
$phpmailer->addReplyTo('info@example.com', 'Information');
}
function set_my_mail_content_type() {
return "text/html";
}
function my_function() {
$to = 'joe@example.com';
$subject = 'Here is the subject';
$message = 'This is the HTML message body <b>in bold!</b>';
add_filter( 'wp_mail_content_type','set_my_mail_content_type' );
add_action( 'phpmailer_init', 'send_smtp_email' );
wp_mail( $to, $subject, $message );
remove_filter( 'wp_mail_content_type','set_my_mail_content_type' )
remove_action( 'phpmailer_init', 'send_smtp_email' );
}

Hacer una llamada directa a un archivo central de WP no siempre es la mejor solución. Funciona ahora, pero ¿qué pasa si algo cambia en una versión futura? Siempre es mejor utilizar una acción central existente y debidamente documentada para mantener la compatibilidad con futuras actualizaciones.
