WooCommerce:基于产品属性展示追加销售商品
基于产品属性展示WooCommerce追加销售商品的实现方案
问题背景
已实现基于特定产品属性展示关联商品的功能,现需对追加销售(Upsells)商品实现相同逻辑,但自行编写的代码未生效,推测关联商品与追加销售商品的函数存在参数或逻辑差异。
用户提供的未生效代码:
add_filter( 'woocommerce_upsell_products', 'upsell_products_by_attribute', 10, 3 ); function upsell_products_by_attribute( $upsells, $product_id, $args ) { $taxonomy = 'pa_attribute'; $term_slugs = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'slugs'] ); if ( empty($term_slugs) ) return $upsells; $posts_ids = get_posts( array( 'post_type' => 'product', 'ignore_sticky_posts' => 1, 'posts_per_page' => 6, 'post__not_in' => array( $product_id ), 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term_slugs, ) ), 'fields' => 'ids', 'orderby' => 'rand', ) ); return count($posts_ids) > 0 ? $posts_ids : $upsells; }
解决方案
完全可以实现基于产品属性展示追加销售商品的功能,代码失效的核心原因是钩子参数不匹配及查询逻辑缺失,修正后的代码如下:
add_filter( 'woocommerce_upsell_products', 'upsell_products_by_attribute', 10, 3 ); function upsell_products_by_attribute( $upsells, $product, $args ) { $taxonomy = 'pa_attribute'; // 替换为你的实际属性分类法 $product_id = $product->get_id(); $term_slugs = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'slugs'] ); if ( empty( $term_slugs ) ) { return $upsells; } // 查询匹配属性的已发布商品 $matching_product_ids = get_posts( array( 'post_type' => 'product', 'post_status' => 'publish', 'ignore_sticky_posts' => 1, 'posts_per_page' => $args['posts_per_page'], // 沿用后台设置的数量 'post__not_in' => array( $product_id ), 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term_slugs, ) ), 'fields' => 'ids', 'orderby' => 'rand', ) ); // 合并匹配商品与原追加商品,去重并限制数量 if ( ! empty( $matching_product_ids ) ) { $combined_ids = array_unique( array_merge( $matching_product_ids, $upsells ) ); return array_slice( $combined_ids, 0, $args['posts_per_page'] ); } return $upsells; }
关键修正点
- 参数匹配:钩子
woocommerce_upsell_products的第二个参数是$product对象而非$product_id,需通过$product->get_id()获取商品ID; - 状态过滤:添加
post_status' => 'publish',确保只查询已发布的有效商品; - 逻辑兼容:合并匹配属性的商品与原后台设置的追加商品,避免丢失原有配置,同时去重并保留设置的展示数量上限;
- 配置复用:使用
$args['posts_per_page']沿用后台设置的追加销售商品数量,保持逻辑一致性。
内容的提问来源于Stack Exchange,提问作者Jonas
相关产品推荐
相关产品推荐

