Modificar las plantillas de correos electrónicos de WooCommerce (en espera/procesando/completado)

5 minutos de lectura

Avatar de usuario de Mind Optimizer
Optimizador mental

Estoy usando el complemento WooCommerce para un negocio de comercio electrónico y cuando creo un pedido o cambio su estado, siempre se envía un correo electrónico para informar el estado actual del pedido. Por algunas razones actuales, no hay información sobre el precio de los productos y las plantillas de correo electrónico de WooCommerce que tienen el precio, el subtotal y los datos totales dentro de los detalles del pedido por correo electrónico. Lo que necesito es modificar esas plantillas para eliminar el precio, el subtotal y los datos totales y también para cambiar los encabezados de las direcciones.

Busqué en la carpeta del complemento de WooCommerce para encontrar dónde están las plantillas de correo electrónico y busqué en Google y encontré una solución desvirtuada que consiste en eliminar el gancho que genera los datos del pedido, que se encuentra en el constructor de la clase WC_Emails, luego lo agregué nuevamente y lo conecté a una función personalizada que genera la estructura deseada. La solución funciona parcialmente para mí como si hubiera creado un pedido la primera vez que el pedido está en estado de espera y se envía un correo electrónico y se ve según sea necesario, sin embargo, cuando cambio el estado del pedido a, por ejemplo, procesamiento, o cualquier pedido posterior indica que ahora se envía otro correo electrónico con dos tablas de detalles del pedido, la generada por mi función personalizada y debajo está la generada por WooCommerce como se muestra en la imagen a continuación.

ingrese la descripción de la imagen aquí

// add the action
add_action( 'woocommerce_email_order_details', 'remove_order_details', 10, 4);
add_action( 'woocommerce_email_order_details','action_woocommerce_email_order_details', 10, 4);

// define the woocommerce_email_order_details callback
function action_woocommerce_email_order_details($order, $sent_to_admin, $plain_text, $email)
{
    $text_align = is_rtl() ? 'right' : 'left';
    ?>
    <h2>
        <?php
        if ($sent_to_admin) {
            $before="<a class="link" href="" . esc_url($order->get_edit_order_url()) . '">';
            $after="</a>";
        } else {
            $before="";
            $after="";
        }
        /* translators: %s: Order ID. */
        echo wp_kses_post($before . sprintf(__('[Order #%s]', 'woocommerce') . $after . ' (<time datetime="%s">%s</time>)', $order->get_order_number(), $order->get_date_created()->format('c'), wc_format_datetime($order->get_date_created())));
        ?>
    </h2>

    <div style="margin-bottom: 40px;">
        <table class="td" cellspacing="0" cellpadding="6"
               style="width: 100%; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;" border="1">
            <thead>
            <tr>
                <th class="td" scope="col"
                    style="text-align:<?php echo esc_attr($text_align); ?>;"><?php esc_html_e('Product', 'woocommerce'); ?></th>
                <th class="td" scope="col"
                    style="text-align:<?php echo esc_attr($text_align); ?>;"><?php esc_html_e('Quantity', 'woocommerce'); ?></th>
            </tr>
            </thead>
            <tbody>
            <?php foreach ($order->get_items() as $item_id => $item) { ?>
                <tr class="<?php echo esc_attr(apply_filters('woocommerce_order_item_class', 'order_item', $item, $order)); ?>">
                    <td class="td"
                        style="text-align:<?php echo esc_attr($text_align); ?>; vertical-align: middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; word-wrap:break-word;">
                        <?php

                        // Product name.
                        echo wp_kses_post(apply_filters('woocommerce_order_item_name', $item->get_name(), $item, false));

                        // allow other plugins to add additional product information here.
                        do_action('woocommerce_order_item_meta_start', $item_id, $item, $order, $plain_text);

                        // allow other plugins to add additional product information here.
                        do_action('woocommerce_order_item_meta_end', $item_id, $item, $order, $plain_text);

                        ?>
                    </td>
                    <td class="td"
                        style="text-align:<?php echo esc_attr($text_align); ?>; vertical-align:middle; font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;">
                        <?php echo wp_kses_post(apply_filters('woocommerce_email_order_item_quantity', $item->get_quantity(), $item)); ?>
                    </td>
                </tr>
            <?php } ?>
            </tbody>
            <tfoot>
            <?php
            $meta_data = $order->get_meta('_custom_px_src');
            if ($meta_data) {
                ?>
                <tr>
                    <th class="td" scope="row" colspan="2"
                        style="text-align:<?php echo esc_attr($text_align); ?>;"><?php esc_html_e(is_rtl() ? 'وصفة طبية' : 'Prescription:'); ?></th>
                    <td class="td">
                        <img src="<?php echo $meta_data['value']; ?>" alt="Prescription image" height="42" width="42">
                        <a href="<?php echo $meta_data['value']; ?>" target="_blank"></a>
                    </td>
                </tr>
                <?php
            }
            if ($order->get_customer_note()) {
                ?>
                <tr>
                    <th class="td" scope="row" colspan="2"
                        style="text-align:<?php echo esc_attr($text_align); ?>;"><?php esc_html_e('Note:', 'woocommerce'); ?></th>
                    <td class="td"
                        style="text-align:<?php echo esc_attr($text_align); ?>;"><?php echo wp_kses_post(wptexturize($order->get_customer_note())); ?></td>
                </tr>
                <?php
            }
            ?>
            </tfoot>
        </table>
    </div>
    <?php
}

function remove_order_details()
{
    $mailer = WC()->mailer(); // get the instance of the WC_Emails class
    remove_action('woocommerce_email_order_details', array($mailer, 'order_details'));
}

Lo que esperaba es una solución que pertenezca solo a la tabla de detalles del pedido generada por mi función personalizada

Encontré el problema que causa la duplicación de la tabla de detalles del pedido dentro de la plantilla de correo electrónico y estaba agregando la acción de eliminación woocommerce_email_order_details con una prioridad igual a la acción en curso, como se muestra a continuación.

add_action( 'woocommerce_email_order_details', 'remove_order_details', 10, 4);
add_action( 'woocommerce_email_order_details','action_woocommerce_email_order_details', 10, 4);

Sin embargo, lo que debo hacer es priorizar la acción de eliminación con una prioridad más alta en su lugar

add_action( 'woocommerce_email_order_details', 'remove_order_details', 1, 4);
add_action( 'woocommerce_email_order_details','action_woocommerce_email_order_details', 10, 4); 

¿Ha sido útil esta solución?