WooCommerce单品页同品牌产品查询需排除目录隐藏商品
WooCommerce单品页同品牌商品排除隐藏项的修复方案
你当前的代码在查询同品牌商品时,会展示目录可见性设置为隐藏的商品,原因是你使用的woocommerce_product_query_tax_query过滤器仅对WooCommerce的主产品查询生效,而你这里用的是自定义WP_Query,加上过滤器里的is_main_query()判断,导致过滤逻辑完全没起作用。
直接修改自定义查询的参数,把排除隐藏商品的条件直接加入tax_query即可解决问题,以下是修复后的完整代码:
<div class="brand-section"> <?php // 获取当前商品 global $product; // 获取商品品牌分类项(请替换为你实际的品牌分类法slug) $brand_term = wp_get_post_terms($product->get_id(), 'product_brand', array('fields' => 'ids')); // 显示品牌图片 if (!empty($brand_term)) { $brand_id = $brand_term[0]; $brand_image_id = get_term_meta($brand_id, 'brand_image', true); if (!empty($brand_image_id)) { echo '<div class="brand-image">'; echo '<img src="' . esc_url(wp_get_attachment_image_url($brand_image_id, 'full')) . '" alt="' . esc_attr(get_term($brand_id)->name) . '">'; echo '</div>'; } } ?> <?php // 显示同品牌的其他商品 if (!empty($brand_term)) { $args = array( 'post_type' => 'product', 'posts_per_page' => 4, // 仅显示4个商品 'tax_query' => array( 'relation' => 'AND', // 确保两个分类条件同时满足 array( 'taxonomy' => 'product_brand', 'field' => 'id', 'terms' => $brand_term, ), array( 'taxonomy' => 'product_visibility', 'field' => 'slug', 'terms' => array('exclude-from-catalog', 'exclude-from-search'), 'operator' => 'NOT IN', ) ), 'post__not_in' => array($product->get_id()), // 排除当前商品 ); $brand_query = new WP_Query($args); if ($brand_query->have_posts()) { echo '<div class="other-products-from-brand">'; echo '<h3 class="other-products-heading">同品牌其他商品:' . esc_html(get_term($brand_id)->name) . '</h3>'; while ($brand_query->have_posts()) { $brand_query->the_post(); // 显示商品信息(图片、标题、价格、加入购物车按钮) echo '<div class="product-item">'; echo '<a href="' . get_permalink() . '">' . get_the_post_thumbnail() . '</a>'; echo '<h4><a href="' . get_permalink() . '">' . get_the_title() . '</h4>'; echo '<div class="price">' . wc_price(get_post_meta(get_the_ID(), '_regular_price', true)) . '</div>'; echo '<div class="add-to-cart-button">' . do_shortcode('[add_to_cart id="' . get_the_ID() . '"]') . '</div>'; echo '</div>'; } echo '</div>'; wp_reset_postdata(); } } ?> </div>
关键修改说明:
- 移除了无效的
custom_exclude_hidden_products过滤器及相关操作,自定义WP_Query不会触发针对主查询的过滤器 - 在
tax_query中添加relation => 'AND',确保品牌匹配和可见性条件同时生效 - 直接加入
product_visibility的排除条件,筛选掉标记为exclude-from-catalog(目录隐藏)和exclude-from-search(搜索隐藏)的商品 - 若需排除缺货商品,可将
'outofstock'加入到terms数组中
内容的提问来源于stack exchange,提问作者Aum Vaghela
相关产品推荐
相关产品推荐

