woocommerce_order_status_completed hook:强制电子邮件AFTER操作(而不是之前)

时间:2016-04-28 20:24:28

标签: wordpress woocommerce hook

我已经编写了一个附加到woocommerce_order_status_completed的动作,它运行正常,为订单添加了一些元数据。但订单完成后发出的电子邮件似乎在此次运行之前发送,因此不会发送有问题的元数据(如果我再次重新运行已完成的订单,它将发送它,但这是因为此数据现在已经在D B)。所以我要找的是:

  • 在完成的电子邮件发送之前运行JUST的挂钩,或者
  • 通过woocommerce_order_status_completed hook发送已完成电子邮件的方法

任何想法或指示?我查看了Woocommerce API参考,但找不到任何适合的内容。

UPDATE:找到了一个早期的钩子并尝试将其挂钩到

weasyprint input.html output.pdf

哪个应该更早运行,但是STILL电子邮件首先消失(在元数据在数据库中之前可以读取。如果我“重新完成”订单(将其重新置于处理状态然后再次完成),它将发送元数据(再次,这是因为它现在在数据库中)

1 个答案:

答案 0 :(得分:2)

经过多次拔毛之后,我想出了一个似乎有些丑陋的解决方法,但希望它会帮助其他人。

  1. 我确认我的钩子在主电子邮件之前正确运行。 (使用add_action( 'woocommerce_order_status_completed_notification','mysite_woocommerce_order_status_completed',5,1 );
  2. 我确认在电子邮件发出之前我的元数据已正确插入数据库
  3. 不幸的是,它仍拒绝在首次发送时获取我的元数据。所以我做了以下事情:

    我将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://wordpress.org/support/topic/hook-an-action-before-transactional-woocommerce-emails-are-triggeredsent-out/page/2?replies=40#post-8379725

    结果是,它将在未来版本中修复,但您可以在此处看到更改:

    https://github.com/woothemes/woocommerce/commit/3db3f3796eb28fb79983f605a5a70d61ca114c6d