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

WooCommerce后台支付方式变更记录代码失效,需新增收发货信息变更记录

WooCommerce订单变更记录(支付方式/账单/配送)修复与扩展方案

原代码问题分析

  • 钩子选择错误:woocommerce_saved_order_items仅在订单项(如商品)变更时触发,不监听订单主数据(如支付方式)的更新,导致代码无法执行。
  • 直接读取$_POST数据不够可靠:WooCommerce后台更新订单时,部分数据会经过处理后才存入订单对象,直接读POST可能获取不到正确的最新值。

修复+扩展后的完整代码

// 记录订单支付方式、账单、配送信息变更(后台操作)
add_action('woocommerce_admin_order_updated', 'log_order_changes_to_notes', 10, 2);
function log_order_changes_to_notes($order_id, $post_data) {
    // 获取当前用户和时间
    $current_user = wp_get_current_user();
    $user_name = $current_user->display_name;
    $change_time = current_time('Y-m-d H:i:s');

    // 获取更新前后的订单对象
    $order = wc_get_order($order_id);
    $old_order = wc_get_order($order_id);
    $old_order->set_date_modified(get_post_modified_time('U', false, $order_id, true)); // 加载更新前的元数据

    // --- 1. 检测支付方式变更 ---
    $new_payment_method = $order->get_payment_method();
    $old_payment_method = $old_order->get_payment_method();
    $new_payment_title = $order->get_payment_method_title(); // 获取支付方式友好名称

    if ($new_payment_method !== $old_payment_method) {
        $note = sprintf(
            '支付方式变更为【%s】(标识:%s),操作人:%s,时间:%s',
            $new_payment_title,
            $new_payment_method,
            $user_name,
            $change_time
        );
        $order->add_order_note($note, true); // true表示仅管理员可见
    }

    // --- 2. 检测账单信息变更 ---
    $billing_fields = [
        'billing_first_name' => '账单名',
        'billing_last_name' => '账单姓',
        'billing_address_1' => '账单地址1',
        'billing_address_2' => '账单地址2',
        'billing_city' => '账单城市',
        'billing_postcode' => '账单邮编',
        'billing_country' => '账单国家',
        'billing_state' => '账单省份/州',
        'billing_phone' => '账单电话',
        'billing_email' => '账单邮箱'
    ];
    $billing_changes = [];

    foreach ($billing_fields as $field_key => $field_label) {
        $new_value = $order->get_meta('_'.$field_key);
        $old_value = $old_order->get_meta('_'.$field_key);
        if ($new_value !== $old_value && !empty(trim($new_value)) && !empty(trim($old_value))) {
            $billing_changes[] = sprintf('%s:%s → %s', $field_label, $old_value, $new_value);
        } elseif ($new_value !== $old_value) {
            $billing_changes[] = sprintf('%s:%s → %s', $field_label, empty($old_value) ? '空' : $old_value, empty($new_value) ? '空' : $new_value);
        }
    }

    if (!empty($billing_changes)) {
        $billing_note = sprintf(
            '账单信息变更:%s,操作人:%s,时间:%s',
            implode(';', $billing_changes),
            $user_name,
            $change_time
        );
        $order->add_order_note($billing_note, true);
    }

    // --- 3. 检测配送信息变更 ---
    $shipping_fields = [
        'shipping_first_name' => '配送名',
        'shipping_last_name' => '配送姓',
        'shipping_address_1' => '配送地址1',
        'shipping_address_2' => '配送地址2',
        'shipping_city' => '配送城市',
        'shipping_postcode' => '配送邮编',
        'shipping_country' => '配送国家',
        'shipping_state' => '配送省份/州'
    ];
    $shipping_changes = [];

    foreach ($shipping_fields as $field_key => $field_label) {
        $new_value = $order->get_meta('_'.$field_key);
        $old_value = $old_order->get_meta('_'.$field_key);
        if ($new_value !== $old_value && !empty(trim($new_value)) && !empty(trim($old_value))) {
            $shipping_changes[] = sprintf('%s:%s → %s', $field_label, $old_value, $new_value);
        } elseif ($new_value !== $old_value) {
            $shipping_changes[] = sprintf('%s:%s → %s', $field_label, empty($old_value) ? '空' : $old_value, empty($new_value) ? '空' : $new_value);
        }
    }

    if (!empty($shipping_changes)) {
        $shipping_note = sprintf(
            '配送信息变更:%s,操作人:%s,时间:%s',
            implode(';', $shipping_changes),
            $user_name,
            $change_time
        );
        $order->add_order_note($shipping_note, true);
    }
}

代码说明

  1. 钩子选择:使用woocommerce_admin_order_updated,该钩子在后台订单更新完成后触发,完美覆盖订单主数据变更场景。
  2. 支付方式记录:同时记录支付方式的友好名称(比如"微信支付")和标识(比如"wechat_pay"),便于管理员查看。
  3. 字段对比逻辑:
    • 对账单、配送的核心字段逐一对比,区分"空值→新值"、"旧值→空值"、"旧值→新值"三种场景。
    • 变更内容会整理成清晰的字符串,添加为订单内部备注(仅管理员可见)。
  4. 用户与时间:自动获取当前操作的管理员姓名和变更时间,确保记录可追溯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:32:17