2017-04-14 93 views
1

我试图在每次下订单后发送一封电子邮件给自己。我的问题是$order->get_total()以及get_total_tax返回而不是实际的订单总价值。以新订单钩取订单数据

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 = "[email protected]"; 
    $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挂钩时发生(我也尝试在自定义页面上使用它 - 正常工作),这让我感到惊讶。

林不知道这里有什么问题,是我的代码异步的一部分?
或者也许这个挂钩在订单获得更新的价格支付/税务信息之前被调用?
我应该怎么做才能在这里得到价格信息?

谢谢。

+0

WC的哪个版本? – 2017-04-14 18:23:05

回答

2

这个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 = "[email protected]"; 
    $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()方法的源代码很有趣,可以在上查看购买流程

+0

谢谢,这就是我所怀疑的。你有没有机会知道整个采购流程是否记录在某个地方?到目前为止,官方文档并不是非常有帮助。 – mymlyn

+0

@mymlyn我有一个关于WooCommerce购买流程(最后)的答案的女佣。我希望这会帮助你;所以你可以使用woocommerce_checkout_order_processed – LoicTheAztec