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); } }
代码说明
- 钩子选择:使用
woocommerce_admin_order_updated,该钩子在后台订单更新完成后触发,完美覆盖订单主数据变更场景。 - 支付方式记录:同时记录支付方式的友好名称(比如"微信支付")和标识(比如"wechat_pay"),便于管理员查看。
- 字段对比逻辑:
- 对账单、配送的核心字段逐一对比,区分"空值→新值"、"旧值→空值"、"旧值→新值"三种场景。
- 变更内容会整理成清晰的字符串,添加为订单内部备注(仅管理员可见)。
- 用户与时间:自动获取当前操作的管理员姓名和变更时间,确保记录可追溯。
内容的提问来源于stack exchange,提问作者Rishikesh Dubey
相关产品推荐
相关产品推荐

