在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
相关产品推荐
相关产品推荐

