WooCommerce子分类切换分页后消失问题排查求助
问题分析与解决方案
核心原因
woocommerce_maybe_show_product_subcategories() 这个WooCommerce内置函数默认只在分类页的第一页显示子分类。它内部会检查 is_paged() 函数的返回值:当处于分页页面(比如paged=2)时,is_paged() 返回true,函数会直接返回空内容,导致子分类消失。
WooCommerce的这个设计逻辑是默认认为用户进入分页后,更关注产品列表而非重复显示子分类导航。
解决办法
方法1:手动获取子分类(推荐,灵活可控)
放弃依赖原函数,直接通过get_terms()获取当前分类的子分类,不受分页状态影响。替换你原来的代码为:
<?php // 获取当前访问的分类对象 $current_cat = get_queried_object(); // 验证当前是否是产品分类页 if ( $current_cat && is_a( $current_cat, 'WP_Term' ) && $current_cat->taxonomy === 'product_cat' ) { // 获取当前分类的子分类(可根据需求调整参数) $subcats = get_terms([ 'taxonomy' => 'product_cat', 'parent' => $current_cat->term_id, 'hide_empty' => true, // 仅显示有产品的子分类,改为false则显示所有子分类 'orderby' => 'name', 'order' => 'ASC' ]); if ( ! empty( $subcats ) && ! is_wp_error( $subcats ) ) { echo '<div class="products subcategories row custom-category-align-and-border">'; foreach ( $subcats as $subcat ) { $subcat_link = get_term_link( $subcat ); // 获取子分类缩略图 $thumb_id = get_term_meta( $subcat->term_id, 'thumbnail_id', true ); $thumb_img = wp_get_attachment_image_src( $thumb_id, 'woocommerce_thumbnail' ); ?> <div class="product-category product"> <?php if ( $thumb_img ) : ?> <img src="<?php echo esc_url( $thumb_img[0] ); ?>" alt="<?php echo esc_attr( $subcat->name ); ?>" /> <?php endif; ?> <h2 class="woocommerce-loop-category__title"> <a href="<?php echo esc_url( $subcat_link ); ?>"><?php echo esc_html( $subcat->name ); ?></a> </h2> <span class="count"><?php echo esc_html( $subcat->count ); ?> <?php esc_html_e( 'products', 'woocommerce' ); ?></span> </div> <?php } echo '</div>'; } } ?>
方法2:修改原函数的判断逻辑(不推荐,影响全局)
如果一定要保留原函数的使用方式,可以通过钩子强制它在所有分页显示子分类,将以下代码添加到主题的functions.php文件中:
add_filter( 'woocommerce_maybe_show_product_subcategories', 'show_subcats_on_all_paged_pages', 10, 1 ); function show_subcats_on_all_paged_pages( $output ) { // 仅在产品分类页生效 if ( is_product_category() ) { $current_cat = get_queried_object(); ob_start(); // 调用WooCommerce内置的子分类输出模板 woocommerce_product_subcategories( ['parent_id' => $current_cat->term_id] ); $output = ob_get_clean(); } return $output; }
注意:这个方法会修改WooCommerce全局的子分类显示逻辑,可能影响其他页面的表现,需谨慎使用。
内容的提问来源于stack exchange,提问作者Miroslav Vasicek
相关产品推荐
相关产品推荐

