woocommerce_checkout_order_processed钩子执行功能两次

时间:2017-10-11 10:37:01

标签: php wordpress woocommerce hook-woocommerce

我已将一个函数附加到woocommerce_checkout_order_processed钩子:

//check if woocommerce is acive
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
    add_action('woocommerce_checkout_order_processed', 'wc_on_place_order');
}

在用户点击 PLACE ORDER 按钮后执行wc_on_place_order功能。但是,这个函数执行两次很奇怪。

我的wc_on_place_order函数调用用C#编写的外部api:

function wc_on_place_order( $order_id ) {
    global $wpdb;

    // get order object and order details
    $order = new WC_Order( $order_id ); 

    // get product details
    $items = $order->get_items();
    //return $items;

    $products = array();
    foreach ($items as $item) {
        array_push($products, 
            array('userid' => $order->user_id, 'descr' => $item['name'], 'amt' => (float)$item['line_total'])
        );
    }

    //passing $products to external api using `curl_exec`
    . . . .

    //on successful call, the page should be showing an `alert`, however, it does not
    // the handle response    
    if (strpos($response,'ERROR') !== false) {
            print_r($response);
    } else {
        echo "<script type='text/javascript'>alert($response)</script>";
    }
}

在C#API上调试之后,我注意到服务被调用了两次,因此,结账被保存两次到API数据库。

单击 PLACE ORDER 时,wc_on_place_order函数是否有问题或woocommerce_checkout_order_processed被调用了两次?

有趣的是,在return $items以某种方式添加$items = $order->get_items()后,C#api只被调用一次:

// get product details
$items = $order->get_items();
return $items; //this line

为什么会这样?

我想问的另一个问题是,woocommerce_checkout_order_processed我应该使用正确的钩子吗?我一直在网上搜索正确使用的钩子,似乎woocommerce_checkout_order_processed用于最多的帖子。我无法使用woocommerce_thankyou挂钩,因为如果我刷新页面,它也会调用API。

任何想法都会非常感激。

修改

  

我使用woocommerce_after_checkout_validation挂钩,在结帐时进行预验证后触发。我无法记住为什么woocommerce_checkout_order_processed被解雇了两次,但我刚刚在WooCommerce选项页面中更改了某种设置。我无法记住哪一个。

1 个答案:

答案 0 :(得分:1)

我总是使用挂钩woocommerce_payment_complete这将在订单付款后按名称显示。

function order_payment_complete( $order_id ){
    $order = wc_get_order( $order_id );
    /* Insert your code */
}

add_action( 'woocommerce_payment_complete', 'order_payment_complete' );