WooCommerce按属性显示关联产品数量异常及缺货排除问题
WooCommerce按属性显示关联产品的问题解决
一、关联产品数量不固定的原因
- 核心原因:
get_posts查询到的符合属性条件的有效产品总数不足12个——比如你的pa_kolekcja属性下,除去当前产品外,实际只有6-7个已发布的公开产品,自然没法返回12个结果。 - 额外影响因素:原代码用
orderby => rand随机排序,每次查询会随机选取产品,但如果符合条件的总数量本身不够,结果数就会少于设置的posts_per_page。另外get_posts默认会排除草稿、私有状态的产品,WooCommerce里标记为“目录不可见”的产品也会被过滤,这些都会进一步减少可返回的产品数量。
二、如何排除缺货商品
修改get_posts的参数,添加meta_query过滤库存状态,同时兼容“不管理库存”的产品(这类产品WooCommerce默认视为有货)。修改后的完整代码如下:
add_filter( 'woocommerce_related_products', 'related_products_by_attribute', 10, 3 ); function related_products_by_attribute( $related_posts, $product_id, $args ) { $taxonomy = 'pa_kolekcja'; // 目标产品属性分类法 $term_slugs = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'slugs'] ); // 获取当前产品的属性标签 if ( empty($term_slugs) ) return $related_posts; $posts_ids = get_posts( array( 'post_type' => 'product', 'ignore_sticky_posts' => 1, 'posts_per_page' => 12, // 设置你需要的关联产品数量 'post__not_in' => array( $product_id ), 'post_status' => 'publish', // 仅查询已发布的公开产品 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term_slugs, ) ), 'meta_query' => array( 'relation' => 'OR', // 保留管理库存且有货的产品 array( 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=', ), // 保留不管理库存的产品(默认视为有货,不需要可删除此条件) array( 'key' => '_manage_stock', 'value' => 'no', 'compare' => '=', ) ), 'fields' => 'ids', 'orderby' => 'rand', ) ); return count($posts_ids) > 0 ? $posts_ids : $related_posts; }
代码说明
- 新增
post_status => 'publish':确保只查询已发布的公开产品,避免草稿、私有产品干扰结果数量。 meta_query双条件:- 筛选库存状态为
instock的产品(针对开启库存管理的商品); - 筛选不管理库存的产品(WooCommerce默认这类商品为有货,若不需要可直接删除此条件)。
- 筛选库存状态为
补充验证数量问题的方法
如果设置12个后还是无法达到预期,可手动统计:
- 进入WooCommerce产品列表,筛选
pa_kolekcja属性为当前产品的标签; - 去掉当前产品,统计剩余已发布、有货的产品总数——如果总数少于12,就是产品基数不足,只能显示现有数量。
内容的提问来源于stack exchange,提问作者Kiyik
相关产品推荐
相关产品推荐

