如何在自定义查询中按最高变体价格排序WooCommerce可变产品
按WooCommerce可变产品最高变体价格排序的解决方案
你的问题核心在于:WooCommerce中_price元字段存储的是可变产品的最低变体价格,而你需要按最高变体价格排序。WooCommerce本身已经为可变产品存储了最高价格的元字段_max_variation_price,我们可以基于这个字段修改查询逻辑,同时兼顾简单产品的价格筛选与排序。
修改后的完整代码
function products_load_more() { $size = $_POST['size']; $count = $_POST['count']; $strength = $_POST['strength']; $country = $_POST['country']; $taxonomy_id = $_POST['taxonomy_id']; $category = $_POST['category']; $amount1 = (int) $_POST['amount1']; $amount2 = (int) $_POST['amount2']; $sorting = $_POST['sorting']; $range_slider_array = array(0=>0,1=>100,2=>200,3=>300,4=>400,5=>500,6=>600,7=>700,8=>800,9=>900,10=>1000,11=>1500,12=>2000,13=>2500,14=>3000,15=>3500,16=>4000,17=>4500,18=>5000); if($sorting == "h_t_l"){ $order = "DESC"; } else{ $order = "ASC"; } $args = array( 'post_type' => 'product', 'posts_per_page' => 8, 'orderby' => 'date', 'order' => 'DESC', 'paged' => $_POST['paged'], 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $taxonomy_id ) ), 'meta_query' => array( 'relation' => 'OR', // 匹配简单产品的价格字段 array( 'key' => '_price', 'compare' => 'EXISTS' ), // 匹配可变产品的最高变体价格字段 array( 'key' => '_max_variation_price', 'compare' => 'EXISTS' ) ) ); // 价格区间筛选:同时兼容简单产品和可变产品的最高价格 if(isset($_POST['amount1']) && isset($_POST['amount2'])){ if(trim($amount1) != "" && trim($amount2) != ""){ $price_min = $range_slider_array[$amount1]; $price_max = $range_slider_array[$amount2]; $price_query = array( 'relation' => 'OR', // 简单产品价格在区间内 array( 'key' => '_price', 'value' => array($price_min, $price_max), 'compare' => ($price_max == 5000) ? '>=' : 'BETWEEN', 'type' => 'NUMERIC' ), // 可变产品最高变体价格在区间内 array( 'key' => '_max_variation_price', 'value' => array($price_min, $price_max), 'compare' => ($price_max == 5000) ? '>=' : 'BETWEEN', 'type' => 'NUMERIC' ) ); $args['meta_query'][] = $price_query; } } // 设置排序规则:优先按最高变体价格排序,没有该字段的简单产品按自身价格排序 $args['orderby'] = 'meta_value_num'; $args['order'] = $order; // 使用meta_query的别名来指定排序字段,确保同时兼容两种产品类型 $args['meta_key'] = '_max_variation_price'; // 添加 fallback:如果没有_max_variation_price字段,使用_price字段 add_filter('posts_orderby', function($orderby, $query) { global $wpdb; if ($query->get('meta_key') == '_max_variation_price') { $orderby = "COALESCE({$wpdb->postmeta}.meta_value, (SELECT meta_value FROM {$wpdb->postmeta} pm WHERE pm.post_id = {$wpdb->posts}.ID AND pm.meta_key = '_price')) {$query->get('order')}"; } return $orderby; }, 10, 2); $ajaxposts = new WP_Query($args); // 移除上面添加的过滤器,避免影响其他查询 remove_filter('posts_orderby', '__return_false', 10); $count = $ajaxposts->found_posts; $response = ''; if($ajaxposts->have_posts()) { while($ajaxposts->have_posts()) : $ajaxposts->the_post(); include get_stylesheet_directory()."/inc/product.php"; endwhile; } else { $response = 0; } echo $response; exit; } add_action('wp_ajax_products_load_more', 'products_load_more'); add_action('wp_ajax_nopriv_products_load_more', 'products_load_more');
关键修改说明
- 元字段替换:用
_max_variation_price(可变产品最高价格)替代原来的_price作为排序依据,同时通过COALESCE函数为简单产品提供 fallback,使用其自身的_price字段。 - 价格筛选兼容:修改价格区间查询逻辑,同时检查简单产品的
_price和可变产品的_max_variation_price,确保两种产品类型都能正确匹配价格范围。 - 排序逻辑优化:通过
posts_orderby过滤器自定义排序规则,保证没有_max_variation_price字段的简单产品也能正常参与排序。
内容的提问来源于stack exchange,提问作者Kapil Goyal
相关产品推荐
相关产品推荐

