能否将WooCommerce产品分类移至回收站或设为草稿而非删除?
解决WooCommerce产品分类暂不显示的方案
插件方案
- Category Status:支持给产品分类添加「草稿」「私有」等状态,设置后前台不会展示该分类,关联产品不受影响。安装后在分类编辑页面就能看到状态设置选项,逻辑和产品状态一致。
- WP Hide Post:虽主打隐藏文章,但也支持隐藏产品分类。在分类编辑页启用隐藏后,前台的分类导航、归档页都会自动屏蔽该分类,后台仍可正常编辑管理。
自定义代码方案
如果不想依赖插件,可以通过以下代码实现:
方案1:给分类添加草稿状态(模拟产品的草稿逻辑)
将这段代码添加到主题的functions.php文件或自定义代码插件中:
// 注册产品分类状态相关功能 function add_product_category_status() { // 注册草稿状态字段 add_action( 'product_cat_add_form_fields', 'add_product_category_status_field' ); add_action( 'product_cat_edit_form_fields', 'edit_product_category_status_field' ); add_action( 'created_product_cat', 'save_product_category_status' ); add_action( 'edited_product_cat', 'save_product_category_status' ); // 前台排除草稿分类 add_filter( 'pre_get_posts', 'exclude_draft_product_categories' ); } add_action( 'init', 'add_product_category_status' ); // 分类新增页添加状态选择框 function add_product_category_status_field() { ?> <div class="form-field"> <label for="category_status">状态</label> <select name="category_status" id="category_status"> <option value="publish">发布</option> <option value="draft">草稿</option> </select> <p class="description">设置该分类的显示状态</p> </div> <?php } // 分类编辑页显示状态选择框 function edit_product_category_status_field( $term ) { $status = get_term_meta( $term->term_id, 'category_status', true ); $status = empty( $status ) ? 'publish' : $status; ?> <tr class="form-field"> <th scope="row" valign="top"><label for="category_status">状态</label></th> <td> <select name="category_status" id="category_status"> <option value="publish" <?php selected( $status, 'publish' ); ?>>发布</option> <option value="draft" <?php selected( $status, 'draft' ); ?>>草稿</option> </select> <p class="description">设置该分类的显示状态</p> </td> </tr> <?php } // 保存分类状态元数据 function save_product_category_status( $term_id ) { if ( isset( $_POST['category_status'] ) ) { update_term_meta( $term_id, 'category_status', sanitize_text_field( $_POST['category_status'] ) ); } } // 前台查询时排除草稿分类 function exclude_draft_product_categories( $query ) { if ( ! is_admin() && $query->is_main_query() && ( is_shop() || is_product_category() || is_tax( 'product_cat' ) ) ) { $draft_cats = get_terms( array( 'taxonomy' => 'product_cat', 'meta_query' => array( array( 'key' => 'category_status', 'value' => 'draft', 'compare' => '=' ) ), 'fields' => 'ids' ) ); if ( ! empty( $draft_cats ) ) { $tax_query = $query->get( 'tax_query', array() ); $tax_query[] = array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $draft_cats, 'operator' => 'NOT IN' ); $query->set( 'tax_query', $tax_query ); } } return $query; }
这段代码会给产品分类添加「草稿」状态,设置为草稿的分类会自动在前台隐藏,后台可正常编辑管理。
方案2:直接隐藏指定ID的分类
如果只是临时隐藏少数几个分类,用这段更简洁的代码即可:
// 前台隐藏指定ID的产品分类 function exclude_specific_product_categories( $query ) { if ( ! is_admin() && $query->is_main_query() && ( is_shop() || is_product_category() ) ) { $hidden_cat_ids = array( 12, 34 ); // 替换成你需要隐藏的分类ID $query->set( 'tax_query', array( array( 'taxonomy' => 'product_cat', 'field' => 'term_id', 'terms' => $hidden_cat_ids, 'operator' => 'NOT IN' ) ) ); } return $query; } add_action( 'pre_get_posts', 'exclude_specific_product_categories' );
把$hidden_cat_ids里的数值替换成目标分类的ID,就能让这些分类在前台消失,后台仍可正常操作。
内容的提问来源于stack exchange,提问作者Alex Framuga
相关产品推荐
相关产品推荐

