You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:03:21