You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:10:10