如何在WooCommerce后台订单列表中显示完成及标记完成订单的用户名
实现WooCommerce后台订单列表的两个用户显示功能
嘿,我刚好处理过类似的需求,下面是完整的代码实现方案,你可以把这些代码添加到主题的functions.php文件中,或者创建一个自定义插件来使用(更推荐后者,避免主题更新导致代码丢失):
1. 记录并显示完成订单的用户名
首先我们需要在订单状态变更为“已完成”时,自动记录操作的用户ID,然后在订单列表中新增一列来展示这个用户的名称:
// 1. 给订单列表添加"完成用户"新列 add_filter('manage_shop_order_posts_columns', 'add_completed_by_column'); function add_completed_by_column($columns) { // 把新列插入到"订单状态"列的后面 $new_columns = []; foreach ($columns as $key => $value) { $new_columns[$key] = $value; if ($key === 'order_status') { $new_columns['completed_by'] = '完成用户'; } } return $new_columns; } // 2. 填充"完成用户"列的内容 add_action('manage_shop_order_posts_custom_column', 'display_completed_by_user', 10, 2); function display_completed_by_user($column, $post_id) { if ($column === 'completed_by') { $order = wc_get_order($post_id); if (!$order) return; // 获取已记录的完成用户ID $completed_by_user_id = $order->get_meta('_completed_by_user_id'); if ($completed_by_user_id) { $user = get_user_by('id', $completed_by_user_id); if ($user) { echo esc_html($user->display_name); } else { echo '用户已删除'; } } else { echo '无记录'; } } } // 3. 订单状态改为"已完成"时,自动记录操作的用户 add_action('woocommerce_order_status_changed', 'record_completed_by_user', 10, 4); function record_completed_by_user($order_id, $old_status, $new_status, $order) { // 仅在后台操作、且状态变为completed时记录 if ($new_status === 'completed' && is_admin()) { $current_user_id = get_current_user_id(); if ($current_user_id) { $order->update_meta_data('_completed_by_user_id', $current_user_id); $order->save(); } } }
2. 美化“完成用户”列的显示样式(匹配截图标签风格)
如果需要像截图那样把用户名显示成美观的标签样式,添加以下代码来实现:
// 给后台添加自定义CSS样式 add_action('admin_head', 'completed_by_column_styling'); function completed_by_column_styling() { echo '<style> .wp-list-table .column-completed_by { width: 120px; } .completed-by-label { display: inline-block; padding: 2px 8px; border-radius: 4px; background: #e7f5ff; color: #135e96; font-size: 12px; font-weight: 500; } .completed-by-label.deleted { background:#fef0f0; color:#dc3232; } .completed-by-label.no-record { background:#f0f0f1; color:#646970; } </style>'; }
然后修改之前的display_completed_by_user函数,把输出内容包裹在标签样式里:
// 修改后的填充列内容函数 add_action('manage_shop_order_posts_custom_column', 'display_completed_by_user', 10, 2); function display_completed_by_user($column, $post_id) { if ($column === 'completed_by') { $order = wc_get_order($post_id); if (!$order) return; $completed_by_user_id = $order->get_meta('_completed_by_user_id'); if ($completed_by_user_id) { $user = get_user_by('id', $completed_by_user_id); if ($user) { echo '<span class="completed-by-label">' . esc_html($user->display_name) . '</span>'; } else { echo '<span class="completed-by-label deleted">用户已删除</span>'; } } else { echo '<span class="completed-by-label no-record">无记录</span>'; } } }
小提示
- 这段代码仅对之后标记为已完成的订单生效,历史订单如果需要补全记录,可以通过数据库批量添加
_completed_by_user_id元数据,或者手动编辑订单补充; - 只有拥有订单编辑权限的后台用户才能看到这个新增列。
内容的提问来源于stack exchange,提问作者X - Developer
相关产品推荐
相关产品推荐

