woocommerce_checkout_order_processed 钩子执行函数两次

Geo*_*bes 2 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');
}
Run Code Online (Sandbox Code Playgroud)

wc_on_place_order函数将在用户单击按钮后执行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>";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

该函数是否有问题wc_on_place_orderwoocommerce_checkout_order_processed单击时被调用两次PLACE ORDER

有趣的是,不知何故添加return $items$items = $order->get_items(),C# api 仅被调用一次:

// get product details
$items = $order->get_items();
return $items; //this line
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

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

任何想法都会非常感激。

编辑:

我使用了woocommerce_after_checkout_validation在结帐时预验证后触发的钩子。我不记得为什么woocommerce_checkout_order_processed被解雇两次,但我只是更改了选项页面中的某种设置WooCommerce。我不记得是哪一个了。

评论中的有用链接:

And*_*ltz 5

我总是使用钩子,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' );
Run Code Online (Sandbox Code Playgroud)

  • 那你就使用了错误的钩子。尝试执行 woocommerce_checkout_process 操作,您可以通过 wc_add_notice() 函数创建错误,通知用户余额为零。 (2认同)