求助:在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
相关产品推荐
相关产品推荐

