bookable products按价格排序异常 与booking plugin冲突求助
故障原因
WooCommerce默认价格排序逻辑只读取产品的_price元字段值作为排序依据,主流Booking插件的可预订产品(bookable products)不会把基础价格存在默认的_price字段中,一般存储在_wc_booking_base_cost、_wc_display_cost这类自定义元字段里,所以默认排序查询抓不到可预订产品的价格值,就会出现简单产品排序正常、可预订产品排序失效的情况,本质是排序逻辑的字段匹配不兼容,不是功能本身损坏。
无插件修复方案
直接把以下代码添加到当前主题的functions.php文件中,即可让默认价格排序兼容可预订产品:
// 修复WooCommerce价格排序对可预订产品不生效问题 add_action( 'woocommerce_product_query', 'fix_bookable_product_price_sort' ); function fix_bookable_product_price_sort( $query ) { if ( is_admin() || $query->get( 'orderby' ) !== 'price' ) return; $meta_query = $query->get( 'meta_query' ) ?: array(); // 同时匹配普通产品、可预订产品的价格字段 $meta_query[] = array( 'relation' => 'OR', array( 'key' => '_price', 'compare' => 'EXISTS' ), array( 'key' => '_wc_booking_base_cost', 'compare' => 'EXISTS' ) ); $query->set( 'meta_query', $meta_query ); add_filter( 'posts_clauses', function( $clauses ) use ( $query ) { global $wpdb; $order_dir = strtoupper( $query->get( 'order' ) ) === 'ASC' ? 'ASC' : 'DESC'; $clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} AS booking_price_meta ON {$wpdb->posts}.ID = booking_price_meta.post_id AND booking_price_meta.meta_key = '_wc_booking_base_cost' "; $clauses['orderby'] = " IFNULL(default_price_meta.meta_value, booking_price_meta.meta_value) {$order_dir}, {$wpdb->posts}.ID DESC "; return $clauses; } ); }
代码添加完成后,进入WooCommerce工具页面清空产品瞬态缓存再测试排序即可。如果你使用的Booking插件存储基础价格的字段不是_wc_booking_base_cost,可以到数据库wp_postmeta表中查询对应可预订产品存储价格的meta key,替换代码中的对应字段名即可。
兼容可预订产品的排序插件推荐
如果不想修改代码,可以选择以下经过实测兼容主流WooCommerce Booking插件的排序工具:
- WooCommerce Product Sort and Display:自带自定义字段排序兼容选项,可手动指定可预订产品的价格字段作为排序依据,支持拖拽调整产品排序优先级,无需编写代码
- Advanced Post Types Order:支持全类型自定义文章类型的可视化排序,可自定义按meta值排序的规则,适配包括可预订产品、订阅产品在内的绝大多数WooCommerce自定义产品类型
注意:安装新排序插件前,请先禁用当前存在冲突的旧排序功能或自定义排序代码,避免出现重复逻辑导致的二次冲突。
内容的提问来源于stack exchange,提问作者devs
相关产品推荐
相关产品推荐

