如何获取WooCommerce三级以内的商品分类及子分类?
解决WooCommerce商品分类仅展示三级层级的问题
我清楚你想要实现的是只保留主分类→一级子分类→二级子分类这三级结构,四级及更深层级的分类需要完全隐藏。咱们先拆解下现有代码的问题:它在遍历二级子分类后没有停止,还会继续尝试获取更深的层级,而且HTML标签的嵌套逻辑也有小问题,容易导致页面结构混乱。
下面是调整后的代码,我针对性做了这些优化:
- 严格控制遍历层级:只处理主分类(层级0)、一级子分类(层级1)、二级子分类(层级2),彻底跳过四级及以下分类
- 修复HTML标签嵌套错误,确保
<ul>和<li>正确闭合 - 加入安全转义函数,符合WordPress的开发规范
- 增加非空和错误判断,避免出现PHP警告
<?php // 获取所有主分类(层级0) $args = array( 'taxonomy' => 'product_cat', 'hide_empty' => false, 'parent' => 0 ); $product_cats = get_terms($args); if (!empty($product_cats) && !is_wp_error($product_cats)) { echo '<ul class="nav-menu__cats">'; foreach ($product_cats as $parent_cat) { echo '<li><a href="' . esc_url(get_term_link($parent_cat->term_id)) . '">' . esc_html($parent_cat->name) . '</a>'; // 获取一级子分类(层级1,父级为主分类) $child_args = array( 'taxonomy' => 'product_cat', 'hide_empty' => false, 'parent' => $parent_cat->term_id ); $child_cats = get_terms($child_args); if (!empty($child_cats) && !is_wp_error($child_cats)) { echo '<ul>'; foreach ($child_cats as $child_cat) { echo '<li><a href="' . esc_url(get_term_link($child_cat->term_id)) . '">' . esc_html($child_cat->name) . '</a>'; // 获取二级子分类(层级2,父级为一级子分类) $grandchild_args = array( 'taxonomy' => 'product_cat', 'hide_empty' => false, 'parent' => $child_cat->term_id ); $grandchild_cats = get_terms($grandchild_args); if (!empty($grandchild_cats) && !is_wp_error($grandchild_cats)) { echo '<ul>'; foreach ($grandchild_cats as $grandchild_cat) { // 仅输出二级子分类,不再向下获取更深层级 echo '<li><a href="' . esc_url(get_term_link($grandchild_cat->term_id)) . '">' . esc_html($grandchild_cat->name) . '</a></li>'; } echo '</ul>'; } echo '</li>'; } echo '</ul>'; } echo '</li>'; } echo '</ul>'; } ?>
关键说明:
- 每一层级都做了
!empty()和!is_wp_error()判断,避免因分类为空或获取失败导致的页面报错 - 使用
esc_url()和esc_html()对链接和分类名称做转义处理,防止XSS攻击,符合WordPress安全标准 - 明确在二级子分类层级停止遍历,不会触发四级分类的获取逻辑,完全符合你要的三级结构要求
这样修改后,你的商品分类导航就会严格按照三级层级展示,四级及以下的分类不会再出现在页面中了。
内容的提问来源于stack exchange,提问作者mat
相关产品推荐
相关产品推荐

