Modificar el encabezado de correo de WooCommerce con un plugin personalizado

9 nov 2017, 14:14:51
Vistas: 15.6K
Votos: 1

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.

4
Comentarios

no necesitas desenganchar / reenganchar. simplemente crea un archivo en el directorio de tu tema en woocommerce/emails/email-header.php y el envío original del correo electrónico lo usará

mmm mmm
9 nov 2017 15:10:10

Pero estoy intentando crear un plugin. No un desarrollo de tema. Este plugin se usa para todos los temas. Así que en lugar de tomar las plantillas de correo del plugin woocommerce, tiene que tomar las plantillas personalizadas creadas en el directorio de mi plugin

melvin melvin
9 nov 2017 18:45:46

Entonces en el método email_header de tu clase, simplemente muestra el archivo de tu plugin, con require por ejemplo

mmm mmm
9 nov 2017 19:18:17

no está funcionando

melvin melvin
9 nov 2017 19:44:49
Todas las respuestas a la pregunta 2
14

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">
10 nov 2017 07:56:38
Comentarios

Pero eso no me muestra el nuevo contenido.

melvin melvin
10 nov 2017 08:22:03

tu función debería generar código

Malay Solanki Malay Solanki
10 nov 2017 08:35:54

Todavía toma el encabezado predeterminado de woocommerce

melvin melvin
10 nov 2017 08:36:29

¿Dónde escribes el código? ¿En el tema?

Malay Solanki Malay Solanki
10 nov 2017 08:38:27

Archivo de plugin. He creado un archivo de plugin

melvin melvin
10 nov 2017 09:00:07

entonces debería funcionar

Malay Solanki Malay Solanki
10 nov 2017 09:05:18

El código se ve genial. Déjame revisar mi código de nuevo.

melvin melvin
10 nov 2017 09:20:48

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

melvin melvin
10 nov 2017 09:37:36

sí, debería funcionar

Malay Solanki Malay Solanki
10 nov 2017 10:08:11

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

melvin melvin
10 nov 2017 11:07:22

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

melvin melvin
16 nov 2017 14:42:18

Asigna un alto y ancho fijo en línea

Malay Solanki Malay Solanki
17 nov 2017 06:31:19

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

melvin melvin
20 nov 2017 05:55:16

Funciona. Muchas gracias. Como tengo baja reputación, no puedo marcar esta respuesta. Lo haré cuando tenga suficiente reputación para hacerlo @malaysolanki

melvin melvin
20 nov 2017 13:06:32
Mostrar los 9 comentarios restantes
0

Para alguien que esté haciendo esto desde su tema.

  1. 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

  1. Pega el contenido del archivo del paso 1 en la siguiente ruta:

tutema/woocommerce/emails/email-header.php

  1. 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;
    }
  1. 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

https://stackoverflow.com/questions/49739353/get-the-order-object-in-woocommerce-email-header-template

por @LoicTheAztec

19 jun 2020 00:36:23