设置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; }
关键改动说明
- 整合排序逻辑:在
show_featured_products_orderby中直接拼接特色商品优先排序和价格升序的SQL语句,确保两者同时生效。 - 确保价格元数据查询:添加了
posts_join过滤器,强制关联_price元数据表,避免排序时找不到价格字段。 - 简化排序字符串:不再依赖原有
$order_by变量,直接构建完整的排序规则,避免与默认排序逻辑冲突。
内容的提问来源于stack exchange,提问作者DimitrisPas
相关产品推荐
相关产品推荐

