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

WordPress WooCommerce:主分类无商品时仍显示子分类并隐藏子分类商品

解决方案:WooCommerce主分类页面仅显示子分类(无商品时也生效)

问题原因

你之前的代码通过修改tax_query的include_children参数限制商品查询范围,但当主分类下无商品时,WooCommerce默认逻辑会跳过子分类的显示流程,导致子分类无法正常展示。

解决步骤

1. 隐藏主分类页面的商品列表

替换原有的pre_get_posts钩子函数,直接让主查询返回0个商品,彻底隐藏商品列表:

function hide_products_in_parent_cat( $wp_query ) {
    if ( isset( $wp_query->query_vars['product_cat'] ) && $wp_query->is_main_query() && $wp_query->is_tax( 'product_cat' ) ) {
        // 设置每页商品数为0,隐藏所有商品
        $wp_query->set( 'posts_per_page', 0 );
    }
}
add_action( 'pre_get_posts', 'hide_products_in_parent_cat' );

2. 强制显示子分类(无论是否有商品)

添加钩子函数,主动获取并显示当前分类的子分类,通过hide_empty => false确保即使子分类无商品也能展示:

function display_child_product_cats() {
    // 仅在商品分类页面执行
    if ( ! is_tax( 'product_cat' ) ) return;

    $current_cat = get_queried_object();
    // 获取当前分类的所有子分类
    $child_cats = get_terms( array(
        'taxonomy'   => 'product_cat',
        'parent'     => $current_cat->term_id,
        'hide_empty' => false, // 即使子分类无商品也显示
        'orderby'    => 'name',
        'order'      => 'ASC'
    ) );

    if ( empty( $child_cats ) || is_wp_error( $child_cats ) ) return;

    // 输出子分类列表,匹配WooCommerce默认样式
    echo '<div class="woocommerce columns-' . esc_attr( wc_get_loop_prop( 'columns' ) ) . '">';
    echo '<ul class="products">';
    foreach ( $child_cats as $child_cat ) {
        $thumbnail_id = get_term_meta( $child_cat->term_id, 'thumbnail_id', true );
        $image_url = $thumbnail_id ? wp_get_attachment_url( $thumbnail_id ) : wc_placeholder_img_src();
        $cat_link = get_term_link( $child_cat );

        echo '<li class="product-category product">';
        echo '<a href="' . esc_url( $cat_link ) . '" class="woocommerce-LoopProduct-link">';
        echo '<img src="' . esc_url( $image_url ) . '" alt="' . esc_attr( $child_cat->name ) . '" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" />';
        echo '<h2 class="woocommerce-loop-category__title">' . esc_html( $child_cat->name ) . '</h2>';
        if ( $child_cat->description ) {
            echo '<p class="woocommerce-loop-category__description">' . esc_html( wp_trim_words( $child_cat->description, 10 ) ) . '</p>';
        }
        echo '</a>';
        echo '</li>';
    }
    echo '</ul>';
    echo '</div>';
}

// 在商品列表区域之前显示子分类
add_action( 'woocommerce_before_shop_loop', 'display_child_product_cats', 5 );
// 当主分类无商品时,在空状态区域显示子分类
add_action( 'woocommerce_no_products_found', 'display_child_product_cats', 5 );

3. 可选:样式调整(按需使用)

如果子分类显示样式和主题不匹配,可添加以下CSS调整:

.product-category.product {
    margin-bottom: 2em;
}
.product-category.product img {
    width: 100%;
    height: auto;
}

说明

  • 该方案不依赖主分类是否有商品,无论主分类下是否存在商品,都会主动加载并展示所有子分类。
  • 子分类显示样式与WooCommerce默认分类样式保持一致,无需大幅调整即可适配多数主题。
  • hide_empty => false参数确保即使子分类下无商品,也会被正常显示。

内容的提问来源于stack exchange,提问作者Alejandro Ojeda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:45:24