如何使用 woocommerce_order_item_meta_end 在电子邮件确认中显示项目元数据

Posted

技术标签:

【中文标题】如何使用 woocommerce_order_item_meta_end 在电子邮件确认中显示项目元数据【英文标题】:How to display item meta data in email confirmation using woocommerce_order_item_meta_end 【发布时间】:2020-02-26 05:46:22 【问题描述】:

我们的商店销售软件,我们会为每个购买的软件添加一个软件优惠券代码。购买完成后(通过woocommerce_payment_complete 挂钩),我们生成优惠券代码并将其添加到通过wc_add_order_item_meta 方法购买的每件商品中。

总结代码:

add_filter('woocommerce_payment_complete', 'add_voucher_code');

function add_voucher_code( $order_id ) 

    $order = new WC_Order( $order_id );
    $items = $order->get_items();

    foreach ($items as $item)   

        for ($i = 1; $i <= $item['qty']; $i++)  
            $voucher_code = 'API request based on order information to get voucher code';
            wc_add_order_item_meta($item->get_id(), 'Voucher Code', $voucher_code);
        
         

出于某种原因,商品自定义元数据会显示在订单确认页面上,但不会出现在确认电子邮件中。 (问题 1 拍了拍额头)所以我们使用woocommerce_order_item_meta_end 钩子将其添加到确认电子邮件中。 (wc_get_order_item_meta)

总结代码:

add_action('woocommerce_order_item_meta_end', 'email_confirmation_display_order_items', 10, 4);

function email_confirmation_display_order_items($item_id, $item, $order, $plain_text) 

    echo '<div>Voucher Code: '. wc_get_order_item_meta( $item_id, 'Voucher Code') .'</div>';

问题 2 是在订单确认页面(所以现在它显示了两次)和订单确认电子邮件中添加了代码的 sn-p。 (又拍了拍额头)

当前问题 2 解决方案 现在我们通过添加一个建议为here 的if 语句来解决它。像这样:

// Only on emails notifications
if( ! (is_admin() || is_wc_endpoint_url() )) 
    echo '<div>Voucher Code: '. wc_get_order_item_meta( $item_id, 'Voucher Code') .'</div>';

这感觉就像一个创可贴修复,任何见解/建议将不胜感激。谢谢!

【问题讨论】:

您是专门使用woocommerce_order_item_meta_end 进行展示还是使用其他挂钩/过滤器的可能性? 没错。由于订购的每件商品都需要一个优惠券代码,我认为另一个钩子不会起作用。 (但我对此持开放态度)我基于 WooCommerce 标准挂钩:email confirmation hook visual guide. 【参考方案1】:

由于这并没有采取太多行动,我将把我们的创可贴修复作为当前解决方案。

问题 1 解决方案 添加的商品元数据显示在订单确认页面上,不会显示在确认电子邮件中。我们通过使用woocommerce_order_item_meta_end 钩子添加额外的项目元来解决了这个问题。

问题 2 解决方案 通过woocommerce_order_item_meta_end 将项目元数据添加到确认中 电子邮件还将其添加到确认页面(明显复制它)。我们通过添加 LoicTheAztec here 建议的 if 语句解决了这个问题。

add_action('woocommerce_order_item_meta_end', 'email_confirmation_display_order_items', 10, 4);

function email_confirmation_display_order_items($item_id, $item, $order, $plain_text) 

    // Only on emails notifications
    if( ! (is_admin() || is_wc_endpoint_url() )) 
        echo '<div>Voucher Code: '. wc_get_order_item_meta( $item_id, 'Voucher Code') .'</div>';
    

资源email confirmation hook visual guidewc_get_order_item_meta docsFilter out unwanted order item meta data from Woocommerce email notifications

【讨论】:

【参考方案2】:

我遇到了同样的问题。 正如我从源代码中了解到的,还有另一个钩子

woocommerce_pre_payment_complete

这为我解决了这个问题。 Hook woocommerce_payment_complete 在付款后、订单状态更改后以及电子邮件触发后调用,因此它不包含更新的元数据。 在付款之后但在订单状态更改之前和发送电子邮件之前挂钩 woocommerce_pre_payment_complete 电话。因此,在不使用 woocommerce_order_item_meta_end

的附加代码的情况下,我可以将元数据添加到订单项目中并正确显示在电子邮件、订单确认页面、管理订单查看页面中

【讨论】:

以上是关于如何使用 woocommerce_order_item_meta_end 在电子邮件确认中显示项目元数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?