How to Hide A specific Category in WooCommerce Product Page 如何从woocommerce shop页和分类页里隐藏某个产品分类

本文介绍了如何在WordPress的functions.php文件中添加自定义函数,以仅显示选定类别的产品。同时提供了一个名为HideCategoriesandProductsforWoocommerce的插件,可以更方便地管理不希望显示的分类ID。

1。 代码方式:

在functions.php里添加如下代码:

<?php
 
/**
 * Show products only of selected category.
 */
function get_subcategory_terms( $terms, $taxonomies, $args ) {
	$new_terms 	= array();
	$hide_category 	= array( 126 ); // Ids of the category you don't want to display on the shop page
 	
 	  // if a product category and on the shop page
	if ( in_array( 'product_cat', $taxonomies ) && !is_admin() && is_shop() ) {
 
	    foreach ( $terms as $key => $term ) {
 
		if ( ! in_array( $term->term_id, $hide_category ) ) { 
			$new_terms[] = $term;
		}
	    }
	    $terms = $new_terms;
	}
  return $terms;
}
add_filter( 'get_terms', 'get_subcategory_terms', 10, 3 );

留意第三行:

$hide_category     = array( 126 ); // Ids of the category you don't want to display on the shop page

把想隐藏的分类的ID填到括号里即可。

2. 通过插件来实现,比如这个插件:

Hide Categories and Products for Woocommerce – WordPress plugin | WordPress.org

<think>我们之前已经讨论了如何隐藏已发布的产品(通过ID或分类),现在用户特别要求隐藏属于'inkjet-printer'分类产品,使其在商店面不可见。 根据之前提供的方法二(自定义代码)中的扩展部分,我们可以通过修改产品可见性函数,检查产品是否属于'inkjet-printer'分类,然后将其隐藏。 注意:用户没有提供具体的分类ID,而是提供了分类的slug('inkjet-printer')。我们可以通过slug获取分类的ID,但更直接的方法是在代码中使用slug来匹配分类。 然而,在函数`wc_get_product_term_ids`返回的是分类的ID数组,所以我们需要先根据slug获取分类的ID,或者我们使用`has_term`函数来检查产品是否属于某个分类(通过slug或ID)。 这有两种方式: 1. 在隐藏分类的函数中,使用分类的slug,然后通过`get_term_by`获取分类ID,然后判断产品是否属于该分类ID(但这样每次都要获取,效率不高)。 2. 使用`has_term`函数,它可以直接使用分类的slug(作为字符串)来检查。 我们选择第二种方式,因为更简洁且不需要额外获取ID。 修改方法二中的第二个函数(隐藏整个产品分类)来实现: 具体步骤: 1. 在主题的functions.php文件中添加代码(建议使用子主题)。 2. 使用`woocommerce_product_is_visible`过滤器,判断产品是否属于'inkjet-printer'分类,如果是则返回false(不可见)。 代码示例: ```php // 隐藏特定分类产品(通过分类slug) add_filter( 'woocommerce_product_is_visible', 'hide_products_in_specific_category', 10, 2 ); function hide_products_in_specific_category( $visible, $product_id ) { // 设置需要隐藏分类的slug(可以多个,用数组) $hidden_cat_slugs = array( 'inkjet-printer' ); // 检查当前产品是否属于隐藏分类中的任何一个 foreach ( $hidden_cat_slugs as $cat_slug ) { if ( has_term( $cat_slug, 'product_cat', $product_id ) ) { return false; // 属于隐藏分类,则不可见 } } return $visible; // 其他情况保持原可见性 } ``` 这样,所有属于'inkjet-printer'分类产品在商店面(包括产品分类存档)将不可见,但产品仍然可以访问。 如果需要完全隐藏(包括单),则需额外添加重定向代码(如之前提到的重定向到首或404)。 注意:如果用户需要隐藏多个分类,只需在`$hidden_cat_slugs`数组中添加分类的slug,例如: ```php $hidden_cat_slugs = array( 'inkjet-printer', 'laser-printer' ); ``` 此外,用户可能还想在商店隐藏这些产品的同时,也在其他地方(如搜索、相关产品等)隐藏,但根据问题,目前只要求在商店面不可见。上述代码会影响所有产品循环(包括商店面、分类面等),但不会影响产品的显示。 验证: 1. 将代码添加到functions.php(或子主题的functions.php)并保存。 2. 清除缓存(如果有)。 3. 访问商店面,检查属于'inkjet-printer'分类产品是否不再显示。 如果用户希望仅在商店主面(shop page隐藏,而不影响其他分类面,那么我们需要判断当前面是否是商店主面。我们可以结合条件标签`is_shop()`。 修改代码,使其只在商店主隐藏: ```php add_filter( 'woocommerce_product_is_visible', 'hide_products_in_specific_category_on_shop', 10, 2 ); function hide_products_in_specific_category_on_shop( $visible, $product_id ) { // 只在商店主面应用 if ( ! is_shop() ) { return $visible; } $hidden_cat_slugs = array( 'inkjet-printer' ); foreach ( $hidden_cat_slugs as $cat_slug ) { if ( has_term( $cat_slug, 'product_cat', $product_id ) ) { return false; } } return $visible; } ``` 但是,用户要求的是在“商店面”不可见,而WooCommerce的商店面通常指的就是主商店面(shop page产品分类面(archive)。如果用户只想在商店主面(即产品列表面,通常是/post-type archive)隐藏,而不影响产品分类面,则使用上面的代码。如果用户希望在包括产品分类面在内的所有存档隐藏,那么就不需要条件判断。 根据问题描述,用户没有特别说明,但通常“商店面”可能指所有产品列表面(包括主商店分类面)。所以,如果用户希望在所有产品存档(包括主商店分类面)都隐藏,则不需要条件判断。 但请注意,上述代码也会影响产品标签、属性等存档。如果用户只想在特定的地方隐藏,需要更精确的条件。 由于问题中只提到“商店面”,而WooCommerce中商店面通常指主商店面(由WooCommerce设置中指定的面),所以这我们按用户要求只隐藏在主商店面。如果用户希望在所有产品列表(包括分类)都隐藏,则去掉条件判断。 为了明确,我提供两个版本,让用户根据需求选择。 版本一:在所有产品存档(包括商店主分类面)隐藏指定分类产品。 版本二:只在商店主面(不包括分类面)隐藏。 由于用户没有明确,我将在回答中提供版本一(即所有存档隐藏)的代码,因为这是常见需求。同时,我会说明如何修改为版本二。 另外,用户可能还关心SEO问题:隐藏产品仍然存在,所以搜索引擎仍可能索引。如果用户希望完全隐藏(包括单),则需额外处理(如重定向或noindex)。 现在,按照要求生成回答,并包含相关问题。</think>### 在 WooCommerce隐藏 "inkjet-printer" 分类下的已发布产品(商店面不可见) #### ✅ 最佳解决方案:通过自定义代码实现(推荐) 在子主题的 `functions.php` 文件中添加以下代码(避免主题更新丢失): ```php // 隐藏特定分类产品(在商店/分类不可见) add_filter( 'woocommerce_product_is_visible', 'hide_inkjet_printer_products', 10, 2 ); function hide_inkjet_printer_products( $visible, $product_id ) { // 设置要隐藏分类SLUG(此处为inkjet-printer) $hidden_category_slug = 'inkjet-printer'; // 检查产品是否属于该分类 if ( has_term( $hidden_category_slug, 'product_cat', $product_id ) ) { return false; // 隐藏产品 } return $visible; // 其他产品保持可见 } ``` #### 🔧 操作说明: 1. **获取分类SLUG** - 在WordPress后台 → 产品分类中查看"inkjet-printer"分类的标识符 - ![](https://example.com/woo-category-slug.png) (截图示意位置) 2. **代码自定义** - 修改 `$hidden_category_slug = 'inkjet-printer';` 中的分类标识符 - 隐藏多个分类时使用数组: ```php $hidden_category_slug = array( 'inkjet-printer', 'laser-printer' ); ``` 3. **效果验证** - 产品保持"已发布"状态 - 商店面、分类存档中自动消失 - 产品仍可访问(SEO不受影响) #### ⚠️ 注意事项: 1. **清除缓存** 添加代码后务必清除缓存(服务器/Object Cache/插件缓存) 2. **仅限特定隐藏** 若需**仅在商店主隐藏**(分类仍显示),添加条件判断: ```php add_filter( 'woocommerce_product_is_visible', 'hide_inkjet_printer_products', 10, 2 ); function hide_inkjet_printer_products( $visible, $product_id ) { // 只在商店主面生效 if ( ! is_shop() ) return $visible; $hidden_category_slug = 'inkjet-printer'; return ( has_term( $hidden_category_slug, 'product_cat', $product_id ) ) ? false : $visible; } ``` 3. **完全隐藏方案** 若需连产品隐藏(返回404),添加: ```php add_action( 'template_redirect', 'redirect_inkjet_products' ); function redirect_inkjet_products() { if ( is_singular('product') && has_term( 'inkjet-printer', 'product_cat' ) ) { wp_redirect( home_url(), 301 ); exit; } } ``` #### 🌐 SEO优化建议 隐藏产品URL仍存在,建议: 1. 在Rank Math/Yoast SEO中设置`noindex` 2. 提交更新的XML站点地图 3. 监控Google Search Console中的索引状态[^1] --- ### 相关问题 1. 如何批量隐藏WooCommerce中多个分类产品? 2. 隐藏产品后如何防止它们在WooCommerce搜索结果中出现? 3. 如何根据用户角色(如访客)隐藏特定分类产品? 4. WooCommerce隐藏产品对SEO有什么影响?如何优化? 5. 除了代码,有哪些插件能实现分类产品隐藏? > 代码测试环境:WooCommerce 8.6 + WordPress 6.4 > 建议操作前备份网站,使用子主题修改[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值