Modificar el encabezado de correo de WooCommerce con un plugin personalizado
Quiero cambiar la plantilla del encabezado de correo de WooCommerce por una nueva para poder agregar condiciones en la plantilla y obtener valores desde el panel de control (para cambiar el color del encabezado según la entrada del usuario). He creado un archivo de plugin para hacer esto.
He seguido varios tutoriales y todo lo que he recibido son errores. Tengo una clase con el siguiente código:
public function __construct(){
add_action('woocommerce_email',array($this,'woocommerce_email'));
}
Ahora he añadido código para eliminar el hook del encabezado por defecto
public function woocommerce_email($mailer){
remove_action('woocommerce_header',array($mailer,'email_header'));
add_action('woocommerce_header',array($this,'email_header'));
Ahora llamando a la plantilla
public function email_header() {
wc_get_template( 'emails/email-header.php');
}
No estoy pasando nada al archivo de plantilla. Así que no se pasan parámetros a las funciones. Solo quería ver si mi plantilla estaba siendo tomada.
También, asumo que $mailer
es parte de la clase de WooCommerce. Cualquier ayuda sería apreciada.
Por favor ten en cuenta que esto es una funcionalidad de plugin, así que no estoy interesado en reemplazar las plantillas de correo de WooCommerce.

Debes eliminar la acción woocommerce_email_header
remove_action( 'woocommerce_email_header', 'email_header');
Que fue registrada en
wp-content\plugins\woocommerce\includes\class-wc-emails.php
Luego añade tu propia acción
add_action('woocommerce_email_header','nombre_de_tu_funcion');
Tu función debería generar HTML
Por defecto hay el siguiente código en la plantilla del encabezado
<?php
/**
* Encabezado del Email
*
* Esta plantilla puede ser sobrescrita copiándola a yourtheme/woocommerce/emails/email-header.php.
*
* SIN EMBARGO, ocasionalmente WooCommerce necesitará actualizar los archivos de plantilla y tú
* (el desarrollador del tema) necesitarás copiar los nuevos archivos a tu tema para
* mantener la compatibilidad. Intentamos hacer esto lo menos posible, pero puede
* suceder. Cuando esto ocurra, la versión del archivo de plantilla será actualizada y
* el readme listará cualquier cambio importante.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @author WooThemes
* @package WooCommerce/Templates/Emails
* @version 2.4.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Salir si se accede directamente
}
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<?php bloginfo( 'charset' ); ?>" />
<title><?php echo get_bloginfo( 'name', 'display' ); ?></title>
</head>
<body <?php echo is_rtl() ? 'rightmargin' : 'leftmargin'; ?>="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">
<div id="wrapper" dir="<?php echo is_rtl() ? 'rtl' : 'ltr'?>">
<table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
<tr>
<td align="center" valign="top">
<div id="template_header_image">
<?php
if ( $img = get_option( 'woocommerce_email_header_image' ) ) {
echo '<p style="margin-top:0;"><img src="' . esc_url( $img ) . '" alt="' . get_bloginfo( 'name', 'display' ) . '" /></p>';
}
?>
</div>
<table border="0" cellpadding="0" cellspacing="0" width="600" id="template_container">
<tr>
<td align="center" valign="top">
<!-- Encabezado -->
<table border="0" cellpadding="0" cellspacing="0" width="600" id="template_header">
<tr>
<td id="header_wrapper">
<h1><?php echo $email_heading; ?></h1>
</td>
</tr>
</table>
<!-- Fin del Encabezado -->
</td>
</tr>
<tr>
<td align="center" valign="top">
<!-- Cuerpo -->
<table border="0" cellpadding="0" cellspacing="0" width="600" id="template_body">
<tr>
<td valign="top" id="body_content">
<!-- Contenido -->
<table border="0" cellpadding="20" cellspacing="0" width="100%">
<tr>
<td valign="top">
<div id="body_content_inner">

Si mi archivo de plantilla de encabezado de correo no contiene nada más que un echo, ¿WooCommerce tomará el predeterminado? @malaysolanki

Gracias hermano. Está funcionando. Era un error en el nombre de mi hook de acción. Saludos @Malaysolanki

¿Sabes por qué la imagen no se muestra en el encabezado del correo? La etiqueta img aparece al inspeccionar en el navegador

Déjame intentarlo y te aviso. Eres el mejor ayudante. Gracias por tu mentalidad de ayuda @Malay

Para alguien que esté haciendo esto desde su tema.
- Copia el contenido de la plantilla de correo electrónico que puedes encontrar aquí:
https://github.com/woocommerce/woocommerce/blob/master/templates/emails/email-header.php
- Pega el contenido del archivo del paso 1 en la siguiente ruta:
tutema/woocommerce/emails/email-header.php
- Opcional: si necesitas el objeto de pedido para obtener algún dato, debes agregar lo siguiente en tu functions.php
add_action( 'woocommerce_email_header', 'email_header_before', 1, 2 );
function email_header_before( $email_heading, $email ){
$GLOBALS['email'] = $email;
}
- Opcional: y luego en el archivo de plantilla que acabas de crear, úsalo de esta manera
// Llama al objeto global WC_Email
global $email;
// Obtiene una instancia del objeto WC_Order
$order = $email->object;
Los pasos 3 y 4 se obtuvieron de esta respuesta
por @LoicTheAztec
