修改 WooCommerce 电子邮件模板 (on-hold/processing/complete)

Modify the WooCommerce emails templates (on-hold/processing/complete)

我在 e-commerce 业务中使用 WooCommerce 插件,当我创建订单或更改其状态时,总是会发送一封电子邮件来通知订单的当前状态。由于目前的一些原因,没有关于产品价格的信息,WooCommerce 电子邮件模板在电子邮件订单详细信息中包含价格、小计和总计数据。我需要的是修改这些模板以删除价格、小计和总计数据,并更改地址标题。

我浏览了 woocommerce 插件文件夹以查找电子邮件模板所在的位置,然后我用谷歌搜索并找到了一个分散的解决方案,该解决方案在于删除生成订单数据的挂钩,该挂钩位于 WC_Emails class构造函数,然后再次添加它并将其连接到生成所需结构的自定义函数。该解决方案部分适用于我,就好像我第一次创建订单时订单处于 on-hold 状态并且发送电子邮件并根据需要看起来,但是,当我将订单状态更改为,例如,处理,或任何后续订单状态,现在发送另一封电子邮件,其中包含两个订单详细信息 tables 由我的自定义函数生成的,下面是 WooCommerce 生成的,如下图所示。

// 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'));
}

我期望的解决方案仅涉及我的自定义函数table生成的订单详细信息

我发现导致电子邮件模板中的订单详细信息 table 重复的问题,它正在添加 woocommerce_email_order_details 删除操作,其优先级等于执行操作,如下所示

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

但是,我应该做的是优先考虑更高优先级的删除操作

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