代码
请将下列代码拷贝到模板文件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 |
文章目录
