【问题标题】:Fetching order data in new order hook在新订单挂钩中获取订单数据
【发布时间】:2017-09-11 00:10:19
【问题描述】:

我正在尝试在每次下订单后给自己发送一封电子邮件。我遇到的问题是 $order->get_total()get_total_tax 返回 0 而不是实际订单总值。

add_action( 'woocommerce_new_order', 'custom_after_order_created_hook', 12 , 1);
function custom_after_order_created_hook($order_id) {
    $order = new WC_Order($order_id);

    $with_tax = $order->get_total();
    $tax = $order->get_total_tax();
    $without_tax = $with_tax - $tax;

    $to = "test@example.com";
    $subject = "New order";
    $content = "
    New order {$order->id}
    With tax: {$with_tax}
    Without tax: {$without_tax}
    Tax: {$tax}
    ";

    $status = wp_mail($to, $subject, $content);
}

除了 $order_id 和 $order->id 之外的每个值都被评估为 0。$order_id 具有正确的值。仅在使用 woocommerce_new_order 钩子时才会出现此问题(我也尝试在自定义页面上使用它 - 可以正常工作),这让我想知道。

我不确定这里有什么问题,我的代码的某些部分是异步的吗?
或者,在订单更新为支付价格/税收信息之前,可能会调用这个钩子?
我应该怎么做才能在此处获取价格信息?

谢谢。

【问题讨论】:

  • 哪个版本的WC?

标签: php wordpress woocommerce hook-woocommerce orders


【解决方案1】:

此 woocommerce_new_order 操作挂钩用于更改 create_order() 函数。所以你最好使用 woocommerce_thankyou 动作钩子,它会在创建订单时触发你的自定义电子邮件通知:

// Tested on WooCommerce versions 2.6+ and 3.0+
add_action( 'woocommerce_thankyou', 'new_order_custom_email_notification', 1, 1 );
function new_order_custom_email_notification( $order_id ) {
    if ( ! $order_id ) return;

    // Getting an instance of WC_Order object
    $order = wc_get_order( $order_id );

    $with_tax = $order->get_total();
    $tax = $order->get_total_tax();
    $without_tax = $with_tax - $tax;
            
    $to = "test@example.com";
    $subject = "New order";
    $content = "
    New order {$order_id}
    With tax: {$with_tax}
    Without tax: {$without_tax}
    Tax: {$tax}
    ";
    
    wp_mail($to, $subject, $content);
}

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

代码已经过测试并且可以工作。

使用 woocommerce_checkout_order_processed 动作钩子代替 woocommerce_thankyou 动作钩子也是一个不错的选择,可能会更好。您只需替换:

add_action( 'woocommerce_thankyou', 'new_order_custom_email_notification', 1, 1 );

作者:

add_action( 'woocommerce_checkout_order_processed', 'new_order_custom_email_notification', 1, 1 );

类似的工作答案:Woocommerce - How to send custom emails based on payment type


woocommerce_checkout_order_processed 钩子(位于 WC_Checkout process_checkout() 方法中,对于此目的也很方便。

WC_Checkout process_checkout()方法的源代码很有趣,可以了解购买流程

【讨论】:

  • 谢谢,这就是我的怀疑。您是否有机会知道整个购买流程是否记录在某处?到目前为止,官方文档并没有太大帮助。
  • @mymlyn 我已经更新了有关 WooCommerce 中购买流程的答案(最后)。我希望这会对您有所帮助;所以你可以使用 woocommerce_checkout_order_processed
猜你喜欢
  • 2017-09-17
  • 2016-02-12
  • 2020-10-29
  • 2021-04-21
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
相关资源
最近更新 更多