WooCommerce:如何从订单备注提取倒数第二个订单状态的元键
解决方案
原函数通过解析订单备注文本获取状态信息的方式不可靠,因为文本会随语言、WooCommerce版本变化。正确的做法是直接读取状态变更备注的元数据,其中存储了标准的订单状态元键(如wc-processing、wc-completed)。
修改后的函数如下:
function get_last_but_one_order_status_key($order_id) { // 获取订单对象,先做有效性校验 $order = wc_get_order($order_id); if (!$order) { return ''; } // 筛选系统状态变更类型的订单备注,按创建时间正序排列 $order_notes = wc_get_order_notes(array( 'order_id' => $order_id, 'type' => 'system_status_change', 'orderby' => 'date_created', 'order' => 'ASC', )); $status_transitions = array(); // 遍历备注提取状态变更的元数据 foreach ($order_notes as $note) { $prev_status = $note->get_meta('_prev_status'); $new_status = $note->get_meta('_new_status'); // 确保状态数据有效,再存入历史数组 if (!empty($prev_status) && !empty($new_status)) { $status_transitions[] = array( 'prev_status' => $prev_status, 'new_status' => $new_status ); } } $transition_count = count($status_transitions); // 状态变更次数不足2次时返回空 if ($transition_count < 2) { return ''; } // 获取倒数第二条变更记录的新状态键(与原函数返回的备注文本对应) // 如果需要变更前的状态键,替换为 $last_but_one_transition['prev_status'] $last_but_one_transition = $status_transitions[$transition_count - 2]; return $last_but_one_transition['new_status']; }
关键说明
- 用
$note->get_meta('_prev_status')和$note->get_meta('_new_status')直接读取状态元键,这两个是WooCommerce内置的元字段,存储的是标准状态标识(而非显示文本)。 - 增加了订单对象的有效性校验,避免传入无效ID时抛出错误。
- 可以根据需求切换返回
prev_status(变更前状态)或new_status(变更后状态),对应原函数备注文本里的前后状态。
内容的提问来源于stack exchange,提问作者art
相关产品推荐
相关产品推荐

