WooCommerce后台商品列表促销价列无法排序问题咨询
实现方案
要给你新增的促销价列添加排序能力,只需要在原有代码基础上新增2段钩子逻辑即可,完整可运行代码如下:
// 原有代码:新增促销价列 add_filter( 'manage_edit-product_columns', 'onsale_product_column', 10); function onsale_product_column($columns){ $new_columns = []; foreach( $columns as $key => $column ){ $new_columns[$key] = $columns[$key]; if( $key == 'product_cat' ) { $new_columns['onsale'] = __( 'Sale Price','woocommerce'); } } return $new_columns; } // 原有代码:渲染促销价列内容 add_action( 'manage_product_posts_custom_column', 'onsale_product_column_content', 10, 2 ); function onsale_product_column_content( $column, $post_id ){ if( $column == 'onsale' ){ global $post, $product; // 排除可变、分组商品 if( is_a( $product, 'WC_Product' ) && ! $product->is_type('grouped') && ! $product->is_type('variable') && $product->is_on_sale() ) { echo strip_tags( wc_price( $product->get_sale_price() ) ); } } } // 新增代码:将促销价列设置为可排序列 add_filter( 'manage_edit-product_sortable_columns', 'add_onsale_column_sortable' ); function add_onsale_column_sortable( $columns ) { $columns['onsale'] = 'onsale_price'; return $columns; } // 新增代码:处理促销价列的排序查询逻辑 add_action( 'pre_get_posts', 'handle_onsale_column_sorting' ); function handle_onsale_column_sorting( $query ) { // 仅在后台商品列表的主查询生效,不影响其他请求 if ( ! is_admin() || ! $query->is_main_query() ) { return; } $orderby = $query->get( 'orderby' ); if ( 'onsale_price' === $orderby ) { $query->set( 'meta_key', '_sale_price' ); // 按价格数值排序 $query->set( 'orderby', 'meta_value_num' ); // 未设置促销价的商品默认排在列表末尾 $query->set( 'meta_compare', 'EXISTS' ); } }
新增逻辑说明:
- 第一段新增代码通过
manage_edit-product_sortable_columns过滤器,将自定义的onsale列注册为可排序列,关联排序标识为onsale_price - 第二段新增代码通过
pre_get_posts钩子拦截商品列表查询,当检测到排序条件为促销价时,将查询逻辑改为按WooCommerce原生存储促销价的_sale_price元字段数值排序
内容的提问来源于stack exchange,提问作者Shah Nawaze Pavel
相关产品推荐
相关产品推荐

