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

WooCommerce如何按标签-品牌-分类优先级设置相关产品?

实现WooCommerce相关产品按「标签→品牌→分类」优先级填充

要实现按「标签→品牌(自定义字段)→分类」的优先级获取相关产品,核心思路是完全替换默认的相关产品查询逻辑,分三步依次获取产品并补足数量,具体实现如下:

实现代码

add_filter( 'woocommerce_related_products', 'custom_priority_related_products', 20, 3 );
function custom_priority_related_products( $related_products, $product_id, $args ) {
    $product = wc_get_product( $product_id );
    if ( ! $product ) return $related_products;

    // 获取目标数量(默认取WooCommerce设置的相关产品数量)
    $limit = isset( $args['posts_per_page'] ) ? $args['posts_per_page'] : 4;
    $final_products = array();

    // 1. 第一步:获取标签匹配的产品
    $tag_ids = wp_get_post_terms( $product_id, 'product_tag', array( 'fields' => 'ids' ) );
    if ( ! empty( $tag_ids ) ) {
        $tag_query = new WP_Query( array(
            'post_type'      => 'product',
            'posts_per_page' => $limit,
            'post__not_in'   => array( $product_id ),
            'tax_query'      => array(
                array(
                    'taxonomy' => 'product_tag',
                    'field'    => 'term_id',
                    'terms'    => $tag_ids,
                ),
            ),
            'fields'         => 'ids',
            'no_found_rows'  => true, // 优化查询,不需要分页计数
        ) );
        $final_products = $tag_query->posts;
    }

    // 2. 第二步:如果标签产品数量不足,补充品牌匹配的产品(自定义字段假设为'brand',请替换为你的实际字段名)
    $remaining = $limit - count( $final_products );
    if ( $remaining > 0 ) {
        $brand_value = $product->get_meta( 'brand' ); // 替换为你的品牌自定义字段键名
        if ( ! empty( $brand_value ) ) {
            $brand_query = new WP_Query( array(
                'post_type'      => 'product',
                'posts_per_page' => $remaining,
                'post__not_in'   => array_merge( array( $product_id ), $final_products ),
                'meta_query'     => array(
                    array(
                        'key'   => 'brand', // 同样替换为你的品牌字段键名
                        'value' => $brand_value,
                    ),
                ),
                'fields'         => 'ids',
                'no_found_rows'  => true,
            ) );
            $final_products = array_merge( $final_products, $brand_query->posts );
        }
    }

    // 3. 第三步:如果数量仍不足,补充分类匹配的产品
    $remaining = $limit - count( $final_products );
    if ( $remaining > 0 ) {
        $cat_ids = wp_get_post_terms( $product_id, 'product_cat', array( 'fields' => 'ids' ) );
        if ( ! empty( $cat_ids ) ) {
            $cat_query = new WP_Query( array(
                'post_type'      => 'product',
                'posts_per_page' => $remaining,
                'post__not_in'   => array_merge( array( $product_id ), $final_products ),
                'tax_query'      => array(
                    array(
                        'taxonomy' => 'product_cat',
                        'field'    => 'term_id',
                        'terms'    => $cat_ids,
                    ),
                ),
                'fields'         => 'ids',
                'no_found_rows'  => true,
            ) );
            $final_products = array_merge( $final_products, $cat_query->posts );
        }
    }

    // 确保最终数量不超过限制,同时去重(避免极端情况的重复)
    $final_products = array_slice( array_unique( $final_products ), 0, $limit );

    return $final_products;
}

关键说明

  • 自定义字段替换:代码中'brand'是假设的品牌自定义字段键名,请根据你实际使用的字段(比如可能是_brand或者其他)修改两处'brand'的位置。
  • 数量控制:默认使用WooCommerce后台设置的相关产品数量,你也可以直接修改$limit变量的值(比如改成6)来固定数量。
  • 查询优化:添加'no_found_rows' => true可以减少数据库查询开销,因为我们不需要分页相关的计数。
  • 去重处理:最后通过array_unique确保不会出现重复产品,避免极端情况下的查询重叠。

使用这段代码后,无需再保留你之前的禁用分类的代码,因为我们已经完全接管了相关产品的查询逻辑。

内容的提问来源于stack exchange,提问作者ulimc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:35:27