如何在WooCommerce「我的账户」订单表新增列展示关联商品分类
实现方案
你已经完成了自定义列的注册,只需要追加列内容渲染的钩子函数即可,完整实现代码如下:
1. 修正列注册代码(可选优化列ID语义)
原来的列ID用了order-ship-to和实际用途不符,建议调整为语义化的ID:
/** * 为账户订单列表新增商品分类列 * * @param string[] $columns 原有订单表列数组 * @return string[] 调整后的列数组 */ function sv_wc_add_my_account_orders_column( $columns ) { $new_columns = array(); foreach ( $columns as $key => $name ) { $new_columns[ $key ] = $name; // 在订单号列之后插入分类列 if ( 'order-number' === $key ) { $new_columns['order-product-category'] = __( '商品分类', 'textdomain' ); } } return $new_columns; } add_filter( 'woocommerce_my_account_my_orders_columns', 'sv_wc_add_my_account_orders_column' );
2. 新增列内容渲染代码
用WooCommerce提供的列渲染钩子输出分类内容,自动支持多商品、多分类的场景,自动去重重复分类:
/** * 渲染商品分类列的内容 * * @param \WC_Order $order 当前订单对象 */ function sv_wc_render_order_category_column( $order ) { $category_list = array(); // 遍历订单内所有商品 foreach ( $order->get_items() as $item ) { $product_id = $item->get_product_id(); // 获取商品关联的产品分类,默认分类法为product_cat,自定义分类修改此处参数即可 $categories = get_the_terms( $product_id, 'product_cat' ); if ( ! is_wp_error( $categories ) && ! empty( $categories ) ) { foreach ( $categories as $cat ) { // 避免多个商品属于同一个分类时重复输出 if ( ! isset( $category_list[ $cat->term_id ] ) ) { $category_list[ $cat->term_id ] = esc_html( $cat->name ); } } } } // 输出分类,多个分类用顿号分隔 echo empty( $category_list ) ? '-' : implode( '、', $category_list ); } // 钩子名后缀对应你注册的列ID,如果你没修改第一步的列ID,此处后缀要改成order-ship-to add_action( 'woocommerce_my_account_my_orders_column_order-product-category', 'sv_wc_render_order_category_column' );
注意事项
- 如果需要展示自定义分类,只需把
get_the_terms的第二个参数product_cat替换为对应的自定义分类法别名即可 - 如果需要给分类加上跳转链接,可以把
$cat->name部分替换为<a href="'.get_term_link($cat).'">'.esc_html($cat->name).'</a>,并把implode的包裹标签改为允许HTML输出即可 - 代码可直接放到主题的
functions.php文件或者自定义功能插件中生效
内容的提问来源于stack exchange,提问作者Flor Ian
相关产品推荐
相关产品推荐

