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

能否将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:33:36