WordPress自定义分类列表

代码

请将下列代码拷贝到模板文件function.php中,通过简码引用。

// 增强版分类目录树短代码(无样式版)
function category_tree_shortcode($atts) {
    // 获取短代码属性
    $atts = shortcode_atts(array(
        'parent_id' => '0',           // 默认显示所有顶级分类
        'show_count' => '1',          // 默认显示文章数量
        'depth' => '0',               // 默认显示所有层级 (0=全部, 1=仅一级子分类)
        'exclude' => '',              // 排除的分类ID,用逗号分隔
        'include' => '',              // 只包含的分类ID,用逗号分隔
        'orderby' => 'name',          // 排序字段 (name, count, id, slug)
        'order' => 'ASC'              // 排序方式 (ASC, DESC)
    ), $atts);
    
    // 开始输出缓冲
    ob_start();
    
    // 调用分类目录显示函数
    display_enhanced_category_tree($atts);
    
    // 返回缓冲内容
    return ob_get_clean();
}
add_shortcode('category_tree', 'category_tree_shortcode');

// 增强版分类目录显示函数
function display_enhanced_category_tree($args) {
    $parent_id = intval($args['parent_id']);
    $show_count = boolval($args['show_count']);
    $depth = intval($args['depth']);
    $exclude = !empty($args['exclude']) ? array_map('intval', explode(',', $args['exclude'])) : array();
    $include = !empty($args['include']) ? array_map('intval', explode(',', $args['include'])) : array();
    $orderby = sanitize_text_field($args['orderby']);
    $order = sanitize_text_field($args['order']);
    
    // 构建查询参数
    $cat_args = array(
        'hide_empty' => false,
        'orderby' => $orderby,
        'order' => $order
    );
    
    // 处理包含/排除分类
    if (!empty($exclude)) {
        $cat_args['exclude'] = $exclude;
    }
    if (!empty($include)) {
        $cat_args['include'] = $include;
    }
    
    // 根据模式获取分类
    if ($depth == 1) {
        // 模式2: 仅显示一级子分类
        $cat_args['parent'] = $parent_id;
        $categories = get_categories($cat_args);
        

    } else {
        // 模式1: 显示完整树形结构
        if ($parent_id == 0) {
            $cat_args['parent'] = 0;
            $categories = get_categories($cat_args);
        } else {
            $cat_args['child_of'] = $parent_id;
            $categories = get_categories($cat_args);
            // 添加父分类
            $parent_category = get_category($parent_id);
            if ($parent_category && !is_wp_error($parent_category)) {
                array_unshift($categories, $parent_category);
            }
        }
    }
    
    // 显示分类
    if ($categories) {

        
        if ($depth == 1) {
            // 一级子分类模式 - 简单列表
            echo '<ul class="wp-block-categories-list wp-block-categories">';
            foreach ($categories as $category) {
                echo '<li class="cat-item">';
                echo '<a href="' . get_category_link($category->term_id) . '">' . $category->name . '</a>';
                if ($show_count) {
                    echo ' (' . $category->count . ')';
                }
                echo '</li>';
            }
            echo '</ul>';
        } else {
            // 完整树形模式
            echo '<ul class="wp-block-categories-list wp-block-categories">';
            display_categories_recursive($categories, $parent_id, $show_count, $depth);
            echo '</ul>';
        }
        

    } else {
        echo '<p>暂无分类目录</p>';
    }
}

// 递归显示分类目录(完整树形模式使用)
function display_categories_recursive($categories, $parent_id = 0, $show_count = 1, $depth = 0, $current_depth = 0) {
    $children = array_filter($categories, function($cat) use ($parent_id) {
        return $cat->parent == $parent_id;
    });
    
    if (empty($children)) return;
    
    // 检查深度限制
    if ($depth > 0 && $current_depth >= $depth) return;
    
    foreach ($children as $category) {
        $has_children = count(array_filter($categories, function($cat) use ($category) {
            return $cat->parent == $category->term_id;
        })) > 0;
        
        echo '<li class="cat-item">';

        echo '<a href="' . get_category_link($category->term_id) . '">' . $category->name . '</a>';
        if ($show_count) {
            echo '<span>(' . $category->count . ')</span>';
        }

        
        if ($has_children) {
            echo '<ul class="children">';
            display_categories_recursive($categories, $category->term_id, $show_count, $depth, $current_depth + 1);
            echo '</ul>';
        }
        
        echo '</li>';
    }
}

使用示例

显示完整树形结构

[category_tree parent_id="1"]

仅显示一级子分类

[category_tree parent_id="1" depth="1"]

更多用法示例

排除特定分类

[category_tree parent_id="1" depth="1" exclude="5,10,15"]

只包含特定分类

[category_tree include="2,3,7" show_count="1"]

按文章数量排序

[category_tree parent_id="1" depth="1" orderby="count" order="DESC"]

显示所有顶级分类

[category_tree parent_id="0" show_count="1"]

参数说明

参数 说明默认值
parent_id父分类ID,0表示所有顶级分类0
show_count 是否显示文章数量(1/0) 1
depth 显示深度,0=全部层级,1=仅一级子分类0
exclude排除的分类ID,用逗号分隔
include只包含的分类ID,用逗号分隔
orderby排序字段(name/count/id/slug)name
order排序方式(ASC/DESC)ASC

文章目录