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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:52:55