隐藏WooCommerce缺货商品后页面仍留空白问题求助
解决WooCommerce隐藏缺货商品后出现空白位置/空白分页的问题
你当前用woocommerce_product_is_visible过滤器的问题在于:这个钩子只是在查询出商品后,控制单个商品是否显示,但分页逻辑是基于原始查询的商品总数,所以那些被隐藏的缺货商品依然被算进了分页计数里,导致末尾出现空白页;而商店/分类页面的布局是按查询结果的数量渲染位置,隐藏商品后自然会留下空白。
正确的做法是直接修改产品查询,从数据库层面排除不需要的缺货商品,这样分页和布局都会基于实际要显示的商品数量,不会出现空白问题。替换你原来的代码,改用下面的实现:
add_action( 'pre_get_posts', 'exclude_out_of_stock_except_restock_attribute' ); function exclude_out_of_stock_except_restock_attribute( $query ) { // 只针对前台的产品查询生效,后台不受影响 if ( ! is_admin() && $query->is_main_query() && ( is_shop() || is_product_category() || is_product_tag() ) ) { // 构建元查询:排除缺货且没有"Only with restock"属性的商品 $query->set( 'meta_query', array( 'relation' => 'OR', // 条件1:商品有库存 array( 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=', ), // 条件2:商品缺货,但带有指定属性 array( 'relation' => 'AND', array( 'key' => '_stock_status', 'value' => 'outofstock', 'compare' => '=', ), array( 'key' => 'pa_availability', 'value' => 'Only with restock', 'compare' => '=', ), ), ) ); } }
代码说明:
- 使用
pre_get_posts钩子在查询执行前修改参数,直接从数据库筛选符合条件的商品,避免后续隐藏操作带来的分页和布局问题。 - 元查询分两个分支:要么商品有库存,要么商品缺货但带有
pa_availability属性且值为Only with restock。 - 限制只在前台的商店、分类、标签页面的主查询生效,不会影响后台的产品管理。
额外注意:
如果你的商品是变量产品,需要确保pa_availability属性设置在父产品上,或者调整代码来检查子产品的库存和属性(如果属性是在子产品上的话)。
内容的提问来源于stack exchange,提问作者O Andersons
相关产品推荐
相关产品推荐

