如何修改WooCommerce代码实现按折扣百分比排序商品
WooCommerce 分类页按折扣百分比排序筛选器修改方案
直接替换你之前的代码,用下面这段实现按折扣百分比排序的功能,同时保留只显示促销商品的逻辑:
// 添加按折扣百分比排序的选项到分类页排序下拉 add_filter( 'woocommerce_catalog_orderby', 'add_discount_percent_sort_option' ); function add_discount_percent_sort_option( $sortby ) { $sortby['discount_percent'] = '按折扣百分比排序(从高到低)'; $sortby['discount_percent_low'] = '按折扣百分比排序(从低到高)'; return $sortby; } // 处理按折扣百分比排序的查询逻辑 add_action( 'woocommerce_product_query', 'sort_products_by_discount_percent' ); function sort_products_by_discount_percent( $query ) { if ( ! is_admin() && $query->is_main_query() && isset( $_GET['orderby'] ) ) { $orderby = $_GET['orderby']; // 筛选出有促销价的商品 $meta_query = $query->get( 'meta_query', array() ); $meta_query[] = array( 'key' => '_sale_price', 'value' => 0, 'compare' => '>', 'type' => 'numeric' ); $query->set( 'meta_query', $meta_query ); // 根据选择的排序方式设置对应逻辑 if ( $orderby === 'discount_percent' ) { add_filter( 'posts_join', 'discount_percent_join_clause' ); add_filter( 'posts_orderby', 'discount_percent_orderby_desc' ); } elseif ( $orderby === 'discount_percent_low' ) { add_filter( 'posts_join', 'discount_percent_join_clause' ); add_filter( 'posts_orderby', 'discount_percent_orderby_asc' ); } } } // 连接商品原价、促销价的元数据表,用于计算折扣 function discount_percent_join_clause( $join ) { global $wpdb; $join .= " LEFT JOIN {$wpdb->postmeta} AS sale_price ON {$wpdb->posts}.ID = sale_price.post_id AND sale_price.meta_key = '_sale_price' "; $join .= " LEFT JOIN {$wpdb->postmeta} AS regular_price ON {$wpdb->posts}.ID = regular_price.post_id AND regular_price.meta_key = '_regular_price' "; return $join; } // 折扣百分比降序排序的SQL规则 function discount_percent_orderby_desc( $orderby ) { global $wpdb; // 计算折扣百分比:((原价-促销价)/原价)*100,按此值降序排列 $orderby = " ((regular_price.meta_value - sale_price.meta_value)/regular_price.meta_value)*100 DESC, {$wpdb->posts}.post_date DESC "; // 用完即移除过滤器,避免影响其他查询 remove_filter( 'posts_join', 'discount_percent_join_clause' ); remove_filter( 'posts_orderby', __FUNCTION__ ); return $orderby; } // 折扣百分比升序排序的SQL规则 function discount_percent_orderby_asc( $orderby ) { global $wpdb; $orderby = " ((regular_price.meta_value - sale_price.meta_value)/regular_price.meta_value)*100 ASC, {$wpdb->posts}.post_date ASC "; remove_filter( 'posts_join', 'discount_percent_join_clause' ); remove_filter( 'posts_orderby', __FUNCTION__ ); return $orderby; }
关键说明:
- 代码会在分类页的排序下拉菜单里新增两个选项,分别对应折扣从高到低、从低到高排序。
- 自动筛选出正在促销的商品(有
_sale_price且大于0的商品),和你之前的逻辑一致。 - 通过SQL直接计算折扣百分比,避免PHP循环计算的性能问题,排序更高效。
- 用完过滤器后会自动移除,不会干扰WooCommerce其他的查询逻辑。
使用注意:
- 把代码添加到当前主题的
functions.php文件末尾,或者用自定义代码插件(比如Code Snippets)添加,避免主题更新导致代码丢失。 - 如果你的商品有变体,这段代码会以主商品的折扣百分比为准,若需要支持变体折扣排序,需要额外调整元查询逻辑。
内容的提问来源于stack exchange,提问作者Hector Solutions
相关产品推荐
相关产品推荐

