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

设置WooCommerce特色商品优先按价格升序排序

解决WooCommerce特色商品优先+价格升序排序不生效问题

需求:修改WooCommerce商店页面默认排序规则,实现特色商品优先显示,且所有商品(包括特色商品)按价格升序排列。
当前问题:已实现特色商品优先显示,但价格升序规则对特色商品组内部不生效。

问题原因

原代码中,posts_orderby过滤器仅将特色商品的ID排序前置,但没有把价格升序的逻辑整合进最终的SQL排序语句,导致特色商品内部依然保持原有顺序,未按价格排序。

修改后的完整代码

// 添加自定义排序选项
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby' );
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby' );
function custom_woocommerce_catalog_orderby( $sortby ) {
    $sortby['recommended'] = __('排序:默认推荐', 'woocommerce');
    return $sortby;
}

// 设置自定义排序选项的默认参数
add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args' );
function custom_woocommerce_get_catalog_ordering_args( $args ) {
    $orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
    
    if ( 'recommended' == $orderby_value ) {
        $args['orderby'] = 'meta_value_num';
        $args['meta_key'] = '_price';
        $args['order'] = 'ASC';
    }
    return $args;
}

// 调整排序逻辑:特色商品优先 + 价格升序
add_filter('posts_orderby', 'show_featured_products_orderby', 10, 2);
function show_featured_products_orderby($order_by, $query){
    global $wpdb;
    
    if( !is_admin() ){
        $orderby_value = isset( $_GET['orderby'] ) ? wc_clean( (string) $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
        $orderby_value_array = explode( '-', $orderby_value );
        $orderby = esc_attr( $orderby_value_array[0] );
        $feture_product_ids = wc_get_featured_product_ids();
        
        // 仅对自定义推荐排序生效
        if ( $orderby == "recommended" && is_array( $feture_product_ids ) && !empty($feture_product_ids) ) {
            // 拼接排序规则:先按是否为特色商品排序,再按价格升序
            $featured_sort = "FIELD({$wpdb->posts}.ID,'" . implode( "','", $feture_product_ids ) . "') DESC";
            $price_sort = "{$wpdb->postmeta}.meta_value_num ASC";
            
            // 确保价格元数据被查询(如果未自动加入)
            if ( strpos($query->query_from, $wpdb->postmeta) === false ) {
                add_filter('posts_join', function($join) use ($wpdb) {
                    return $join . " LEFT JOIN {$wpdb->postmeta} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_price' ";
                }, 10, 1);
            }
            
            $order_by = "{$featured_sort}, {$price_sort}";
        }  
    }
    return $order_by;
}

关键改动说明

  1. 整合排序逻辑:在show_featured_products_orderby中直接拼接特色商品优先排序和价格升序的SQL语句,确保两者同时生效。
  2. 确保价格元数据查询:添加了posts_join过滤器,强制关联_price元数据表,避免排序时找不到价格字段。
  3. 简化排序字符串:不再依赖原有$order_by变量,直接构建完整的排序规则,避免与默认排序逻辑冲突。

内容的提问来源于stack exchange,提问作者DimitrisPas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:57:49