La idea de este artículo surgió al desarrollar un tema a medida para WooCommerce. Bueno, en realidad creamos un plugin para WooCommerce para separar la funcionalidad del tema.
Necesitábamos enviar un email con información específica al finalizar el pedido. Os cuento cómo lo hicimos con un ejemplo muy sencillo.
Se ha simplificado el código para no hacerlo demasiado complejo, la finalidad de este artículo es dar una idea sencilla de como solucionar un problema.
Enviar el email al finalizar el pedido
Lo primero que haremos será utilizar el filtro «woocommerce_thankyou» de WooCommerce para enviar el email cuando el usuario haya realizado el pago del pedido.
add_filter('woocommerce_thankyou', 'bk_order_thankyou' ), 10, 1);
public function order_thankyou( $order_id ) {
$order = wc_get_order( $order_id );
$is_paid = $order->is_paid();
if ( $is_paid ) {
// Si el cliente a pagado le enviamos email.
}
}El Hook woocommerce_thankyou se activa después de que un cliente realice una compra en la tienda, y se muestre la página de agradecimiento (thank you page). Y «bk_order_thankyou» es el nombre de la función que se ejecutará cuando ocurra ese evento.
La función «bk_order_thankyou», recibe el parámetro «$order_id» (el número de pedido que se acaba de realizar).
Utilizamos la función «wc_get_order» para obtener los datos del pedido a partir de su ID, y con «is_paid()» comprobamos si el pedido ha sido pagado correctamente.
Si la orden ha sido pagada, ejecutaríamos el código de envío del email con la información que necesitemos. Por ejemplo, agradecerle la compra.
Creando una clase email de WooCommerce
Crear un template de email es bastante sencillo extendiendo la clase «WC_Email» de WooCommerce. Lo haremos de la siguiente forma:
namespace Dominio\emails;
use WC_Email;
defined( 'ABSPATH') || die( 'Hello, Pepiño!' );
if ( ! class_exists( 'Custom_emails' ) ) :
class Custom_emails extends WC_Email {
public function __construct() {
// Configuración de propiedades de la clase.
$this->enabled = true;
$this->id = 'bk_custom_emails';
$this->title = esc_html__( 'Envío Custom Emails', 'text_domain' );
$this->description = esc_html__( 'Envío de información extra para el cliente', 'text_domain' );
$this->heading = esc_html__( 'Seguimiento del Pedido', 'text_domain' );
$this->subject = '[' . get_option( 'blogname' ) . ']' . esc_html__( ' ¡Su Pedido está en Camino!', 'text_domain' );
$this->template_html = 'emails/custom-template-email.php';
$this->footer = esc_html__( 'Gracias por usar ', 'text_domain' ) . get_option( 'blogname' );
$this->template_base = get_template_directory_uri() . '/templates/';
// Llamada al constructor de la clase padre.
parent::__construct();
}
/**
* Envio.
*
* @param int $order_id order id
*/
public function send( $email, $subject, $message ) {
if ( ! empty( $email ) && ! empty( $subject ) && ! empty( $message ) ) {
// Configuración de propiedades y encabezados.
$this->recipient = $email;
$this->data = array(
'email' => $email,
'subject' => $subject,
'message' => $message,
);
$this->subject = $subject;
$this->heading = $subject;
$headers = 'MIME-Version: 1.0' . "\n";
$headers .= 'From: ' . get_option( 'admin_email' ) . "\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\n";
$headers .= "X-Priority: 1 (Highest)\n";
$headers .= "X-MSMail-Priority: High\n";
$headers .= "Importance: High\n";
$this->headers = $headers;
}
if ( $this->is_enabled() && $this->get_recipient() ) {
// Invocación del método send de la clase padre.
$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
}
}
/**
* Obtiene el contenido html.
*
* @return string
*/
public function get_content_html() {
return wc_get_template_html(
$this->template_html,
// Parámetros para la plantilla.
array(
'email_heading' => $this->get_heading(),
'admin_email' => $this->get_recipient(),
'data' => $this->data,
'blogname' => $this->get_blogname(),
'sent_to_admin' => false,
'plain_text' => false,
'email' => $this,
'additional_content' => $this->get_additional_content(),
),
'',
$this->template_base
);
}
}
endif;El código hace lo siguiente:
1. Namespace:
El código define un espacio de nombres (namespace) llamado Dominio/emails. Esto ayuda a evitar conflictos de nombres con otras clases, o funciones, que puedan existir en el mismo proyecto.
2. Clase Personalizada:
La clase Custom_emails se extiende de la clase base WC_Email proporcionada por WooCommerce. Esta nueva Class es una clase de correo electrónico personalizada.
class Custom_emails extends WC_Email {3. Constructor:
El constructor se utiliza para configurar varias propiedades de la clase, como el ID, el título, la descripción, el encabezado, el asunto, la plantilla HTML, el pie de página, etc.
public function __construct() {
// Configuración de propiedades de la clase.
// ...
// Llamada al constructor de la clase padre.
parent::__construct();
}4. Método «send»:
La clase define un método send que toma como parámetros la dirección de correo electrónico, el asunto y el mensaje. Este método configura las propiedades necesarias para enviar el correo, y luego invoca el método send de la clase padre (WC_Email) para enviar realmente el correo electrónico.
public function send( $email, $subject, $message ) {
// Configuración de propiedades y encabezados.
// ...
// Invocación del método send de la clase padre.
$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
}5. Método «get_content_html»:
Este método obtiene el contenido HTML del correo electrónico utilizando la plantilla definida en $this->template_html. Utiliza la función wc_get_template_html de WooCommerce.
public function get_content_html() {
return wc_get_template_html(
$this->template_html,
// Parámetros para la plantilla.
// ...
$this->template_base
);
}Con esta clase personalizada «custom_emails» podremos utilizarla para enviar correos electrónicos en un entorno de WordPress con WooCommerce.
Así podremos enviar información adicional al cliente después de realizar un pedido. Está diseñada para ser fácilmente extendida y personalizada según las necesidades del proyecto.
Crear plantillas personaliza de email para WooCommerce
Ahora faltaría crear el template del email personalizado para utilizar en WooCommerce. Según lo que definimos en el apartado anterior, todas las plantillas de correo electrónico las crearemos en «templates/emails» de nuestro theme. De esta manera lo tendremos mejor organizado.
En el ejemplo, el archivo lo llamaremos «custom-template-email.php» y tendrá el siguiente código:
/**
* Email templates
*/
defined( 'ABSPATH') || die( 'Hello, Pepiño!' );
$user_email = $data['email'];
$user_obj = get_user_by( 'email', $user_email );
$user_name = $user_obj->first_name ? $user_obj->first_name . ' ' . $user_obj->last_name : esc_html__( 'Cliente', 'text_domain' );
$message_html = html_entity_decode( $data['message'] );
do_action( 'woocommerce_email_header', $email_heading, $email );
$html = '<p>Hola ' . $user_name . '</p>' . $message_html;
echo wp_kses_post( $html );
do_action( 'woocommerce_email_footer', $email );Este código se encarga de generar y mostrar un correo electrónico personalizado en HTML para un usuario específico, utilizando información proporcionada y funciones proporcionadas por WooCommerce.
Este tipo de código es comúnmente utilizado para personalizar los correos electrónicos enviados a los clientes después de realizar acciones específicas en una tienda en línea basada en WooCommerce.
Vamos a desmenuzar el código:
1. Chequeo de Seguridad:
«defined( ‘ABSPATH’) || die( ‘¡Hello, Pepiño!’ );» Este fragmento asegura que el código no se ejecute directamente sin cargar WordPress. Si alguien intenta acceder directamente al archivo que contiene este código, se imprimirá «Hello, Pepiño» y se detendrá la ejecución.
2. Obtención de Información del Usuario:
Se obtiene la dirección de correo electrónico del usuario a partir de los datos proporcionados ($data[‘email’]). Luego, se utiliza la dirección de correo electrónico para obtener el objeto del usuario mediante get_user_by(‘email’, $user_email). Se extrae el nombre del usuario ($user_name), que es el primer nombre y el apellido si están disponibles, o simplemente se utiliza «Cliente» si no se encuentra el nombre.
$user_email = $data['email'];
$user_obj = get_user_by( 'email', $user_email );
$user_name = $user_obj->first_name ? $user_obj->first_name . ' ' . $user_obj->last_name : esc_html__( 'Cliente', 'text_domain' );3. Decodificación del Mensaje HTML:
El mensaje HTML proporcionado en $data[‘message’] se decodifica utilizando html_entity_decode y se almacena en la variable $message_html.
$message_html = html_entity_decode( $data['message'] );4. Generación del Contenido HTML del Correo Electrónico:
Utilizamos «do_action(‘woocommerce_email_header’, $email_heading, $email)» para ejecutar cualquier acción relacionada con el encabezado del correo electrónico de WooCommerce. Luego, se construye el contenido HTML del correo electrónico, que incluye un saludo personalizado con el nombre del usuario y el mensaje proporcionado.
$html = '<p>Hola ' . $user_name . '</p>' . $message_html;5. Acción del Pie de Página del Correo Electrónico:
Finalmente, se utiliza «do_action(‘woocommerce_email_footer’, $email)» para ejecutar cualquier acción relacionada con el pie de página del correo electrónico de WooCommerce.
Enviar datos al template personalizado de email en WooCommerce
Solo queda enviar los datos personalizados que vamos a enviar al template, que previamente habremos creado con el siguiente código:
$email_msg = '
<p>¡tu pedido <strong> #'. $order_id .'</strong> ha salido de nuestra tienda!</p>
<p>Si tiene alguna pregunta o duda, por favor no dude en ponerse en contacto con nosotros al correo
<a href="[email protected]" target="_blank" rel="noreferer noopener nofollow">[email protected]</a>.
Estamos aquí para ayudarle.
</p>
<p>¡Esperamos que disfrute de nuestro producto!</p>
<p><br>Atentamente,<br>Nombre tienda</p>
';
$custom_email = new \Dominio\emails\Custom_emails();
$custom_email->send( '[email protected]', '¡Su Pedido #'. $order_id .' está en Camino!', $email_msg );El código genera, y envía, un correo electrónico personalizado a una dirección de correo electrónico específica, informando al destinatario sobre el estado de su pedido. Utiliza una clase personalizada para facilitar el envío de correos electrónicos personalizados en un entorno WooCommerce.
Aquí tenéis una explicación paso a paso:
- Mensaje de Correo Electrónico HTML:
Se define una variable «$email_msg» que contiene el contenido HTML del mensaje de correo electrónico. - Instanciación de la Clase Personalizada:
Se crea una instancia de la clase personalizada «\Dominio\emails\Custom_emails()» y se almacena en la variable «$custom_email». La instancia de esta clase parece estar diseñada para manejar el envío de correos electrónicos personalizados en un entorno WooCommerce. - Envío del Correo Electrónico:
Se utiliza el método send de la clase «Custom_emails» para enviar el correo electrónico personalizado. Se proporciona la dirección de correo electrónico del destinatario, el asunto del correo electrónico, y el contenido HTML del mensaje.
Concusión
Con lo que hemos visto, podemos enviar email a nuestros clientes una vez que finalice la compra. Por ejemplo, una encuesta de satisfacción, animarles a valorar el producto, y mediante el uso de un Cron, podéis dejarlo programado para que se lance pasado un tiempo específico después de la compra.
También os invito a leer, este artículo que es un recurso muy útil para que verifiques como quedarán los emails de WooCommerce sin necesidad de estar haciendo envío a tu email constantemente, ahorrándote bastante tiempo en el desarrollo.



