如何在WooCommerce订单视图新增列并显示自定义订单项元键值
解决WooCommerce订单列表无法显示配送日期自定义元键的问题
问题描述
已成功在WooCommerce订单列表新增「配送日期」列,但无法读取由WooCommerce Product Add-Ons Ultimate插件添加的自定义元键_Choose Date的值,所有订单均返回提示“Meta key is wrong or not found for the order items”。
排查与解决方法
1. 确认真实元键名称
插件存储附加字段时可能会自动修改元键格式(比如大小写转换、空格替换为下划线),可通过以下方式确认真实键名:
- 查看数据库
wp_woocommerce_order_itemmeta表,找到对应订单的商品元数据,核对配送日期的元键 - 临时在代码中加入调试代码,输出所有商品元键:
// 在遍历订单商品的循环内添加 foreach($item->get_meta_data() as $meta){ echo $meta->key . '<br>'; }
2. 适配插件的元数据存储格式
Product Add-Ons Ultimate通常会将附加选项以数组或特定前缀元键存储,修改代码如下:
function custom_shop_order_column( $columns ) { // 新增配送日期列 $columns['delivery_date'] = __( '配送日期', 'woocommerce' ); return $columns; } add_filter( 'manage_edit-shop_order_columns', 'custom_shop_order_column', 10, 1 ); // 填充列内容 function custom_shop_order_list_column_content( $column, $post_id ) { if ( $column !== 'delivery_date' ) return; $order = wc_get_order( $post_id ); if ( ! is_a( $order, 'WC_Order' ) ) return; $delivery_date_arr = array(); // 遍历订单商品 foreach ( $order->get_items() as $item ) { // 尝试原元键 $delivery_date = $item->get_meta( '_Choose Date' ); // 尝试小写无空格的键名 if( empty($delivery_date) ){ $delivery_date = $item->get_meta( 'choose_date' ); } // 尝试读取插件的附加选项数组 if( empty($delivery_date) ){ $addons = $item->get_meta( '_product_addons' ); if( is_array($addons) ){ foreach($addons as $addon){ if( isset($addon['name']) && $addon['name'] === 'Choose Date' ){ $delivery_date = $addon['value']; break; } } } } if ( ! empty( $delivery_date ) ) { $delivery_date_arr[] = $delivery_date; } } if ( ! empty( $delivery_date_arr ) ) { echo '<ul>'; echo '<li>' . implode( '</li><li>', $delivery_date_arr ) . '</li>'; echo '</ul>'; } else { echo __( '未设置配送日期', 'woocommerce' ); } } add_action( 'manage_shop_order_posts_custom_column' , 'custom_shop_order_list_column_content', 10, 2 );
3. 尝试读取订单级别元数据
如果插件将配送日期存储在订单级而非商品级,改用以下代码:
function custom_shop_order_list_column_content( $column, $post_id ) { if ( $column !== 'delivery_date' ) return; $order = wc_get_order( $post_id ); if ( ! is_a( $order, 'WC_Order' ) ) return; $delivery_date = $order->get_meta( '_Choose Date' ); if ( ! empty( $delivery_date ) ) { echo $delivery_date; } else { echo __( '未设置配送日期', 'woocommerce' ); } }
内容的提问来源于stack exchange,提问作者tekkie
相关产品推荐
相关产品推荐

