如何使用 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 提交?