博客 / WordPress教程

ACF分类法层级循环输出

在 WordPress 中,使用 get_terms() 获取 product-category 这个自定义分类法的所有分类,并按照层级关系输出,可以使用递归的方式来处理。以下是实现方法:

function display_product_categories_hierarchy($parent = 0, $taxonomy = 'product-category', $level = 0) {
    $args = array(
        'taxonomy'   => $taxonomy,
        'parent'     => $parent,
        'hide_empty' => false, // 是否隐藏没有文章的分类
    );

    $terms = get_terms($args);

    if (!empty($terms) && !is_wp_error($terms)) {
        echo '<ul>';
        foreach ($terms as $term) {
            echo '<li>' . str_repeat('--', $level) . '<a href="' . get_term_link($term) . '">' . $term->name . '</a></li>';
            
            // 递归调用获取子分类
            display_product_categories_hierarchy($term->term_id, $taxonomy, $level + 1);
        }
        echo '</ul>';
    }
}

// 在适当的位置调用函数,比如放在 template 或者 functions.php
display_product_categories_hierarchy();

代码解析

  1. get_terms() 获取 product-category 分类法的分类列表。
  2. parent 参数用于获取指定父级 ID 下的子分类:
    • 0 代表获取顶级分类。
    • 递归调用时,传递子分类的 ID 作为 parent 参数,以获取其下级分类。
  3. str_repeat('--', $level) 作用是让不同级别的分类在 HTML 结构中有层级缩进(可选)。
  4. get_term_link($term) 获取分类的链接,使其可点击跳转。

示例输出

如果你的 product-category 结构如下:

- 电子产品
  - 手机
    - 苹果手机
    - 安卓手机
  - 电脑
    - 笔记本电脑
    - 台式电脑
- 家电
  - 洗衣机
  - 冰箱

前端 HTML 结构将会是:

<ul>
    <li><a href="电子产品链接">电子产品</a></li>
    <ul>
        <li>--<a href="手机链接">手机</a></li>
        <ul>
            <li>----<a href="苹果手机链接">苹果手机</a></li>
            <li>----<a href="安卓手机链接">安卓手机</a></li>
        </ul>
        <li>--<a href="电脑链接">电脑</a></li>
        <ul>
            <li>----<a href="笔记本电脑链接">笔记本电脑</a></li>
            <li>----<a href="台式电脑链接">台式电脑</a></li>
        </ul>
    </ul>
    <li><a href="家电链接">家电</a></li>
    <ul>
        <li>--<a href="洗衣机链接">洗衣机</a></li>
        <li>--<a href="冰箱链接">冰箱</a></li>
    </ul>
</ul>

这样就可以完整地输出 product-category 分类法的 1 级、2 级和 3 级分类。你可以在 archive-product-category.phptaxonomy-product-category.php 模板中调用它。

如果你需要自定义 CSS 让它显示得更整齐,也可以给 ulli 添加 class 方便样式调整。

如果你有更复杂的需求,比如只显示特定层级的分类,或者自定义排序方式,可以修改 get_terms() 里的参数,比如 orderbyorder 等。

评论留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注