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

在WooCommerce中将自定义订单状态设置为已支付

解决WooCommerce自定义订单状态标记为“已支付”的问题

我太懂你的困扰了——自定义订单状态没法被会计软件识别成已支付,Processing和Complete却能正常同步,之前的代码方案没起作用,但看到Order Status Manager插件有这个功能,其实咱们完全可以用代码实现同样的效果,不用依赖插件。

核心在于WooCommerce判断订单是否已支付有两个关键逻辑:

  • 哪些状态属于官方认可的“已支付”状态列表
  • 订单是否存在_paid_date元数据(很多同步工具会硬性检查这个字段)

下面是完整的代码解决方案,你可以把它加到主题的functions.php里,或者用自定义代码插件来添加:

1. 先添加自定义订单状态(如果还没添加的话)

要是你的自定义状态已经存在,直接跳过这部分就行:

// 注册自定义订单状态
add_action('init', 'add_custom_paid_order_status');
function add_custom_paid_order_status() {
    register_post_status('wc-custom-paid', array(
        'label'                     => '自定义已支付',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop('自定义已支付 <span class="count">(%s)</span>', '自定义已支付 <span class="count">(%s)</span>')
    ));
}

// 把自定义状态加到订单状态下拉菜单
add_filter('wc_order_statuses', 'add_custom_status_to_order_dropdown');
function add_custom_status_to_order_dropdown($order_statuses) {
    $new_statuses = array();
    foreach ($order_statuses as $key => $status) {
        $new_statuses[$key] = $status;
        // 可以调整位置,比如放在Processing状态后面
        if ('wc-processing' === $key) {
            $new_statuses['wc-custom-paid'] = '自定义已支付';
        }
    }
    return $new_statuses;
}

2. 标记自定义状态为“已支付”状态(核心步骤)

这一步是让WooCommerce认可这个自定义状态属于已支付范畴:

// 将自定义状态加入已支付状态列表
add_filter('wc_order_is_paid_statuses', 'mark_custom_status_as_paid');
function mark_custom_status_as_paid($paid_statuses) {
    // 替换成你自己的自定义状态slug
    $paid_statuses[] = 'wc-custom-paid';
    return $paid_statuses;
}

3. 自动设置支付日期(适配同步工具)

很多会计软件会检查订单的_paid_date字段,所以我们要在状态切换时自动填充这个值:

// 当订单切换到自定义已支付状态时,设置支付日期
add_action('woocommerce_order_status_wc-custom-paid', 'set_paid_date_for_custom_status');
function set_paid_date_for_custom_status($order_id) {
    $order = wc_get_order($order_id);
    // 避免重复设置,只在未设置过支付日期时添加
    if (!$order->get_date_paid()) {
        $order->set_date_paid(current_time('mysql'));
        $order->save();
    }
}

代码逻辑说明

  • wc_order_is_paid_statuses过滤器:WooCommerce靠这个列表判断哪些状态属于已支付,把你的自定义状态slug加进去,就能让WC从底层认可它的已支付属性。
  • woocommerce_order_status_{状态slug}动作:当订单切换到指定状态时触发,这里用来补全_paid_date字段,确保同步工具能识别到订单已完成支付。

这样设置后,你的自定义订单状态就会和Processing、Complete完全一样,具备“已支付”的所有属性,会计软件同步应该就能正常生成销售收据了。

内容的提问来源于stack exchange,提问作者KnargleMcFeckenburg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:07:37