wordpress 如果当前结帐失败,如何创建一个具有相同详细信息的新订单?

brtdzjyr  于 2023-03-17  发布在  WordPress
关注(0)|答案(1)|浏览(257)

所以目前在支付失败的时候,Woo-commerce将订单设置为失败状态。如果您重新加载或进行硬刷新并再次进行结帐而不更改购物车,您仍然需要为失败的订单付款。我不希望这种情况发生。我希望创建一个具有相同购物车和结帐详细信息的新订单。(我的发票打印插件使2张发票,一张失败,一张完成,如果付款批准,这使 Package 部门的混乱。
我试了几个结帐钩,但没有一个是works.like

woocommerce_checkout_order_processed
woocommerce_review_order_after_payment
woocommerce_pay_order_before_submit

由于支付插件进行 AJAX 调用,我不确定使用哪个钩子。或者如何进行硬重新加载,以便它会跳过失败的订单,并再次进行新的订单。感谢阅读,任何信息都会很有帮助。:)

mwkjh3gx

mwkjh3gx1#

您可以使用woocommerce_checkout_order_created钩子(在创建新订单时启动)在付款失败时创建新订单。您需要检查当前订单是否处于“错误”状态,如果是,则使用前一订单的数据创建新订单。

add_action( 'woocommerce_checkout_order_created', 'new_order_on_checkout_failed' );

function new_order_on_checkout_failed( $order_id ) {
  $order = wc_get_order( $order_id );
  if ( 'failed' === $order->get_status() ) {
    $new_order = wc_create_order( [
      'customer_id' => $order->get_customer_id(),
      'status' => 'pending', // status
    ] );

    // Copy data from previous order to new order
    foreach ( $order->get_items() as $item ) {
      $new_order->add_product(
        $item->get_product(),
        $item->get_quantity(),
        [
          'subtotal' => $item->get_subtotal(),
          'total' => $item->get_total(),
          'subtotal_tax' => $item->get_subtotal_tax(),
          'tax' => $item->get_tax(),
          'tax_data' => $item->get_tax_data(),
        ]
      );
    }

    // Copy shipping and billing information
    $new_order->set_address( $order->get_address( 'billing' ), 'billing' );
    $new_order->set_address( $order->get_address( 'shipping' ), 'shipping' );
    $new_order->set_payment_method( $order->get_payment_method() );
    $new_order->set_payment_method_title( $order->get_payment_method_title() );
    $new_order->set_total( $order->get_total() );

    $new_order->save();
  }
}

或者使用woocommerce_payment_failed挂钩:

add_action( 'woocommerce_payment_failed', 'new_order_on_checkout_failed' );

function new_order_on_checkout_failed( $order_id ) {
    // Failed order
    $failed_order = wc_get_order( $order_id );
    
    // Create a new order with the same cart and checkout details
    $new_order = wc_create_order();
    $new_order->set_billing_address( $failed_order->get_billing() );
    $new_order->set_shipping_address( $failed_order->get_shipping() );
    $new_order->add_product( $failed_order->get_items() );
    $new_order->set_payment_method( $failed_order->get_payment_method() );

    $new_order->update_status( 'pending', 'New order created due to payment failure' );

    wp_redirect( $new_order->get_checkout_order_received_url() );
    exit;
}

相关问题