我已经编写了一个附加到woocommerce_order_status_completed的动作,它运行正常,为订单添加了一些元数据。但订单完成后发出的电子邮件似乎在此次运行之前发送,因此不会发送有问题的元数据(如果我再次重新运行已完成的订单,它将发送它,但这是因为此数据现在已经在D B)。所以我要找的是:
任何想法或指示?我查看了Woocommerce API参考,但找不到任何适合的内容。
UPDATE:找到了一个早期的钩子并尝试将其挂钩到
weasyprint input.html output.pdf
哪个应该更早运行,但是STILL电子邮件首先消失(在元数据在数据库中之前可以读取。如果我“重新完成”订单(将其重新置于处理状态然后再次完成),它将发送元数据(再次,这是因为它现在在数据库中)
答案 0 :(得分:2)
经过多次拔毛之后,我想出了一个似乎有些丑陋的解决方法,但希望它会帮助其他人。
add_action( 'woocommerce_order_status_completed_notification','mysite_woocommerce_order_status_completed',5,1 );
)不幸的是,它仍拒绝在首次发送时获取我的元数据。所以我做了以下事情:
我将woocommerce / templates / emails / email-order-items.php模板复制到我的主题中并进行了以下更改:
// Variation
if ( ! empty( $item_meta->meta ) ) {
echo '<br/><small>' . nl2br( $item_meta->display( true, true, '_', "\n" ) ) . '</small>';
// following 5 lines are MY extra code (checking for my meta field 'signup_code')
if (!array_key_exists('signup_code',$item_meta->meta)) {
$suc = wc_get_order_item_meta( $item_id, 'signup_code' );
if ($suc) {
echo '<br/><small>signup_code: ' . $suc . '</small>';
}}
}
它将检查元数组中的欺骗,如果已存在则不输出。它需要这样做以防止它显示两次(否则它将在第二次发送时执行)。我无法相信这一切都是必要的,但我无法找到任何可以解决此问题的指针。
<强>更新强> 这显然是由于内部缓存问题引起的。我和其中一个woo开发者进行了长时间的讨论:
结果是,它将在未来版本中修复,但您可以在此处看到更改:
https://github.com/woothemes/woocommerce/commit/3db3f3796eb28fb79983f605a5a70d61ca114c6d