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

求助:在WooCommerce订单视图列中显示自定义成本中心字段值

解决WooCommerce订单列表Cost Center列显示值的问题

嘿,你已经完成了大半工作啦!现在就差给新增的「Cost Center」列填充对应的值。咱们只需要添加一个钩子函数来处理列内容的输出,另外还要修正代码里的一个小拼写错误,具体看下面:

1. 修复现有代码的拼写问题

你在costcenter_management_group_display函数里把$cost_center拼成了$cost_centre,这会导致订单里的元数据无法正确保存,先把这个改过来:

add_action('woocommerce_checkout_create_order_line_item', 'costcenter_management_group_display', 20, 4);
function costcenter_management_group_display($item, $cart_item_key, $values, $order) {
    if ( $cost_center = $values['data']->get_meta('_cost_center') ) {
        // 这里修正拼写错误:$cost_centre → $cost_center
        $item->update_meta_data( 'Cost Center', $cost_center );
    }
}

2. 添加列内容输出的钩子函数

要在自定义列里显示值,我们需要使用manage_shop_order_posts_custom_column钩子,它负责渲染订单列表每一列的内容。添加下面这段代码:

// 在Cost Center列中显示对应字段值
add_action('manage_shop_order_posts_custom_column', 'costcenter_management_group_column_content', 10, 2);
function costcenter_management_group_column_content($column, $post_id) {
    if ($column === 'cost_center') {
        // 获取当前订单对象
        $order = wc_get_order($post_id);
        $cost_centers = array();
        
        // 遍历订单里的所有订单项
        foreach ($order->get_items() as $item) {
            // 获取订单项里的Cost Center元数据
            $cost_center = $item->get_meta('Cost Center');
            if (!empty($cost_center)) {
                $cost_centers[] = $cost_center;
            }
        }
        
        // 如果有多个成本中心,用逗号分隔显示;没有则显示"无"
        if (!empty($cost_centers)) {
            echo implode(', ', array_unique($cost_centers));
        } else {
            echo __('None', 'woocommerce');
        }
    }
}

完整代码整合

把所有代码放在一起就是这样:

// 在产品编辑页添加Cost Center下拉框
add_action( 'woocommerce_product_options_general_product_data', 'costcenter_management_group' );
function costcenter_management_group() {
    global $post;
    echo '<div class="options_group">';
    woocommerce_wp_select( array(
        'id' => '_cost_center',
        'label' => __( 'Cost Center', 'woocommerce' ),
        'options' => array(
            'One' => __( 'Office One', 'woocommerce' ),
            'Two' => __( 'Office Two', 'woocommerce' ),
        )));
    echo '</div>';
}

// 保存产品的Cost Center设置
add_action( 'woocommerce_process_product_meta', 'costcenter_management_group_save' );
function costcenter_management_group_save( $post_id ){
    if( isset( $_POST['_cost_center'] ) )
        update_post_meta( $post_id, '_cost_center', esc_attr( $_POST['_cost_center'] ) );
}

// 将Cost Center添加到订单项并保存到订单
add_action('woocommerce_checkout_create_order_line_item', 'costcenter_management_group_display', 20, 4);
function costcenter_management_group_display($item, $cart_item_key, $values, $order) {
    if ( $cost_center = $values['data']->get_meta('_cost_center') ) {
        $item->update_meta_data( 'Cost Center', $cost_center );
    }
}

// 在订单列表添加Cost Center列
add_filter('manage_edit-shop_order_columns', 'costcenter_management_group_column', 10, 1 );
function costcenter_management_group_column( $columns ) {
    $actions_key = isset($columns['wc_actions']) ? 'wc_actions' : 'order_actions';
    $order_actions = $columns[$actions_key];
    unset($columns[$actions_key]);
    $columns['cost_center'] = __("Cost Center", "woocommerce");
    $columns[$actions_key] = $order_actions;
    return $columns;
}

// 在Cost Center列中显示对应字段值
add_action('manage_shop_order_posts_custom_column', 'costcenter_management_group_column_content', 10, 2);
function costcenter_management_group_column_content($column, $post_id) {
    if ($column === 'cost_center') {
        $order = wc_get_order($post_id);
        $cost_centers = array();
        
        foreach ($order->get_items() as $item) {
            $cost_center = $item->get_meta('Cost Center');
            if (!empty($cost_center)) {
                $cost_centers[] = $cost_center;
            }
        }
        
        if (!empty($cost_centers)) {
            echo implode(', ', array_unique($cost_centers));
        } else {
            echo __('None', 'woocommerce');
        }
    }
}

这样一来,订单列表里的Cost Center列就会显示对应的值啦!如果一个订单里有多个不同的成本中心,会用逗号分隔显示;没有的话就显示“无”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:27:39