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
相关产品推荐
相关产品推荐

