You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修正点

  1. 参数匹配:钩子woocommerce_upsell_products的第二个参数是$product对象而非$product_id,需通过$product->get_id()获取商品ID;
  2. 状态过滤:添加post_status' => 'publish',确保只查询已发布的有效商品;
  3. 逻辑兼容:合并匹配属性的商品与原后台设置的追加商品,避免丢失原有配置,同时去重并保留设置的展示数量上限;
  4. 配置复用:使用$args['posts_per_page']沿用后台设置的追加销售商品数量,保持逻辑一致性。

内容的提问来源于Stack Exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:35:41