WooCommerce自定义订单状态下Mollie支付网关触发异常问题
自定义订单状态导致Mollie支付网关未触发的解决方法
问题描述
我在网店的部分产品分类中使用了自定义订单状态。上线后发现,所有状态为Processing的订单均通过Mollie(支付网关)完成支付;但当订单属于自定义订单状态且客户选择Mollie支付时,支付网关未触发,客户仅被跳转至显示“Order is submitted”的页面,无法完成支付。
我用到的代码如下:
add_action( 'woocommerce_checkout_order_processed', 'custom_order_status_by_cat', 10, 3 ); function custom_order_status_by_cat( $order_id, $posted_data, $order ){ $items = $order->get_items(); foreach ( $items as $item ) { $product_id = $item->get_product_id(); if ( has_term( 'met-gravure', 'product_cat', $product_id ) ) { //选择分类 $order->update_status( 'ord-maatwerk' ); //自定义状态 break; } else if ( has_term( 'moedermelk', 'product_cat', $product_id ) ) { //选择分类 $order->update_status( 'ord-moedermelk' ); //自定义状态 break; } else if ( has_term( 'last-minute-gepersonaliseerd-juweel', 'product_cat', $product_id ) ) { //选择分类 $order->update_status( 'ord-lastminute' ); //自定义状态 break; } } }
问题原因
你使用的woocommerce_checkout_order_processed钩子是在订单创建完成、支付流程结束后才触发的。此时修改订单状态为自定义状态,Mollie网关的支付触发逻辑已经错过——默认情况下,支付网关会在订单处于待支付(pending)状态时发起支付请求,提前修改状态会导致网关无法触发支付流程。
解决方案
换用更早的woocommerce_checkout_create_order钩子,该钩子在订单对象创建后、未保存到数据库前触发,不会干扰支付网关的正常执行逻辑。
修改后的核心代码
add_action( 'woocommerce_checkout_create_order', 'custom_order_status_by_cat_on_create', 10, 2 ); function custom_order_status_by_cat_on_create( $order, $data ){ foreach ( $order->get_items() as $item ) { $product_id = $item->get_product_id(); if ( has_term( 'met-gravure', 'product_cat', $product_id ) ) { $order->set_status( 'ord-maatwerk' ); break; } elseif ( has_term( 'moedermelk', 'product_cat', $product_id ) ) { $order->set_status( 'ord-moedermelk' ); break; } elseif ( has_term( 'last-minute-gepersonaliseerd-juweel', 'product_cat', $product_id ) ) { $order->set_status( 'ord-lastminute' ); break; } } }
补充:确保自定义订单状态已正确注册
如果之前未注册过这些自定义状态,需要添加以下代码完成注册,否则WooCommerce无法识别这些状态:
add_action( 'init', 'register_custom_order_statuses' ); function register_custom_order_statuses() { // 注册自定义状态 register_post_status( 'ord-maatwerk', array( 'label' => _x( 'Maatwerk', 'Order status', 'woocommerce' ), 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Maatwerk <span class="count">(%s)</span>', 'Maatwerk <span class="count">(%s)</span>', 'woocommerce' ) ) ); register_post_status( 'ord-moedermelk', array( 'label' => _x( 'Moedermelk', 'Order status', 'woocommerce' ), 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Moedermelk <span class="count">(%s)</span>', 'Moedermelk <span class="count">(%s)</span>', 'woocommerce' ) ) ); register_post_status( 'ord-lastminute', array( 'label' => _x( 'Last Minute', 'Order status', 'woocommerce' ), 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Last Minute <span class="count">(%s)</span>', 'Last Minute <span class="count">(%s)</span>', 'woocommerce' ) ) ); } // 将自定义状态添加到WooCommerce订单状态下拉列表 add_filter( 'wc_order_statuses', 'add_custom_order_statuses' ); function add_custom_order_statuses( $order_statuses ) { $new_order_statuses = array(); foreach ( $order_statuses as $key => $status ) { $new_order_statuses[ $key ] = $status; // 在Processing状态后插入自定义状态 if ( 'wc-processing' === $key ) { $new_order_statuses['wc-ord-maatwerk'] = _x( 'Maatwerk', 'Order status', 'woocommerce' ); $new_order_statuses['wc-ord-moedermelk'] = _x( 'Moedermelk', 'Order status', 'woocommerce' ); $new_order_statuses['wc-ord-lastminute'] = _x( 'Last Minute', 'Order status', 'woocommerce' ); } } return $new_order_statuses; }
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

