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

WooCommerce虚拟订单30秒自动改完成状态失败求助

修复WooCommerce特定支付方式虚拟订单自动完成的问题

原代码的核心问题

  • 语法错误:PHP函数名、钩子名称不能使用连字符,必须用下划线;WooCommerce的方法采用蛇形命名(下划线分隔),而非驼峰式。
  • 订单对象获取错误:应使用WooCommerce推荐的wc_get_order()获取订单,而非直接实例化WC_Order。
  • 同步阻塞问题:sleep(30)会导致用户的感谢页面卡顿30秒,严重影响体验,必须改用异步任务(WP Cron)处理延迟逻辑。
  • 缺少支付方式筛选:原代码未针对目标支付网关(MobileWallet/ReferenceCode)做判断,不符合需求。
  • 状态更新方法错误:WooCommerce订单状态更新的正确方法是update_status(),而非updateStatus()。

修正后的完整代码

// 1. 将符合条件的虚拟订单设置为待处理状态,为后续异步完成做准备
add_filter( 'woocommerce_payment_complete_order_status', 'wc_set_virtual_order_on_hold', 10, 2 );
function wc_set_virtual_order_on_hold( $order_status, $order ) {
    // 定义目标支付网关ID(需和自定义网关类中的$id属性一致)
    $target_gateways = array('mobilewallet', 'referencecode');
    // 判断条件:目标支付方式 + 包含可下载/虚拟商品 + 未完成状态
    if ( in_array( $order->get_payment_method(), $target_gateways ) && $order->has_downloadable_item() && ! $order->has_status( 'completed' ) ) {
        return 'on-hold';
    }

    return $order_status;
}

// 2. 在感谢页面触发异步任务,30秒后更新订单状态
add_action( 'woocommerce_thankyou', 'wc_schedule_virtual_order_completion', 30 );
function wc_schedule_virtual_order_completion( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    $target_gateways = array('mobilewallet', 'referencecode');
    // 仅处理目标支付方式的待处理虚拟订单
    if ( in_array( $order->get_payment_method(), $target_gateways ) && $order->has_downloadable_item() && $order->has_status( 'on-hold' ) ) {
        // 30秒后触发自定义异步任务
        wp_schedule_single_event( time() + 30, 'wc_complete_virtual_order', array( $order_id ) );
    }
}

// 3. 自定义异步任务:更新订单为完成状态
add_action( 'wc_complete_virtual_order', 'wc_mark_virtual_order_completed' );
function wc_mark_virtual_order_completed( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order || $order->has_status( 'completed' ) ) return;

    $target_gateways = array('mobilewallet', 'referencecode');
    // 二次确认条件,避免重复执行
    if ( in_array( $order->get_payment_method(), $target_gateways ) && $order->has_downloadable_item() ) {
        $order->update_status( 'completed', '虚拟商品订单延迟30秒自动完成' );
    }
}

// 4. 注册自定义支付网关(修正语法错误)
add_filter( 'woocommerce_payment_gateways', 'wc_add_mobilewallet_referencecode_gateways' );
function wc_add_mobilewallet_referencecode_gateways( $methods ) {
    $methods[] = 'WCMobileWallet';
    $methods[] = 'WCReferenceCode';
    return $methods;
}

关键注意事项

  • 支付网关ID匹配:代码中$target_gateways的数组值必须和自定义支付网关类中$this->id的赋值一致(比如WCMobileWallet类中需设置$this->id = 'mobilewallet';)。
  • WP Cron启用:确保WordPress服务器的WP Cron处于启用状态(默认启用,若禁用需通过服务器定时任务触发)。
  • 日志排查:若问题仍存在,可开启WooCommerce日志(路径:WooCommerce > 设置 > 高级 > 日志),查看订单状态更新的错误信息。

内容的提问来源于stack exchange,提问作者Adham 3mmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:45:33