diff --git a/src/main/java/run/halo/app/theme/finders/CategoryFinder.java b/src/main/java/run/halo/app/theme/finders/CategoryFinder.java
index ae21df785..9f95646a5 100644
--- a/src/main/java/run/halo/app/theme/finders/CategoryFinder.java
+++ b/src/main/java/run/halo/app/theme/finders/CategoryFinder.java
@@ -26,4 +26,6 @@ public interface CategoryFinder {
     Flux<CategoryVo> listAll();
 
     Flux<CategoryTreeVo> listAsTree();
+
+    Flux<CategoryTreeVo> listAsTree(String name);
 }
diff --git a/src/main/java/run/halo/app/theme/finders/impl/CategoryFinderImpl.java b/src/main/java/run/halo/app/theme/finders/impl/CategoryFinderImpl.java
index 723049c0e..0af4762e0 100644
--- a/src/main/java/run/halo/app/theme/finders/impl/CategoryFinderImpl.java
+++ b/src/main/java/run/halo/app/theme/finders/impl/CategoryFinderImpl.java
@@ -10,6 +10,7 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 import run.halo.app.core.extension.content.Category;
@@ -72,6 +73,15 @@ public class CategoryFinderImpl implements CategoryFinder {
 
     @Override
     public Flux<CategoryTreeVo> listAsTree() {
+        return this.toCategoryTreeVoFlux(null);
+    }
+
+    @Override
+    public Flux<CategoryTreeVo> listAsTree(String name) {
+        return this.toCategoryTreeVoFlux(name);
+    }
+
+    Flux<CategoryTreeVo> toCategoryTreeVoFlux(String name) {
         return listAll()
             .collectList()
             .flatMapIterable(categoryVos -> {
@@ -80,7 +90,7 @@ public class CategoryFinderImpl implements CategoryFinder {
                     .collect(Collectors.toMap(categoryVo -> categoryVo.getMetadata().getName(),
                         Function.identity()));
 
-                nameIdentityMap.forEach((name, value) -> {
+                nameIdentityMap.forEach((nameKey, value) -> {
                     List<String> children = value.getSpec().getChildren();
                     if (children == null) {
                         return;
@@ -88,15 +98,15 @@ public class CategoryFinderImpl implements CategoryFinder {
                     for (String child : children) {
                         CategoryTreeVo childNode = nameIdentityMap.get(child);
                         if (childNode != null) {
-                            childNode.setParentName(name);
+                            childNode.setParentName(nameKey);
                         }
                     }
                 });
-                return listToTree(nameIdentityMap.values());
+                return listToTree(nameIdentityMap.values(), name);
             });
     }
 
-    static List<CategoryTreeVo> listToTree(Collection<CategoryTreeVo> list) {
+    static List<CategoryTreeVo> listToTree(Collection<CategoryTreeVo> list, String name) {
         Map<String, List<CategoryTreeVo>> parentNameIdentityMap = list.stream()
             .filter(categoryTreeVo -> categoryTreeVo.getParentName() != null)
             .collect(Collectors.groupingBy(CategoryTreeVo::getParentName));
@@ -111,7 +121,8 @@ public class CategoryFinderImpl implements CategoryFinder {
             node.setChildren(children);
         });
         return list.stream()
-            .filter(v -> v.getParentName() == null)
+            .filter(v -> StringUtils.isEmpty(name) ? v.getParentName() == null
+                : StringUtils.equals(v.getMetadata().getName(), name))
             .sorted(defaultTreeNodeComparator())
             .collect(Collectors.toList());
     }
diff --git a/src/test/java/run/halo/app/theme/finders/impl/CategoryFinderImplTest.java b/src/test/java/run/halo/app/theme/finders/impl/CategoryFinderImplTest.java
index 872ca79f6..3d5bc1280 100644
--- a/src/test/java/run/halo/app/theme/finders/impl/CategoryFinderImplTest.java
+++ b/src/test/java/run/halo/app/theme/finders/impl/CategoryFinderImplTest.java
@@ -101,6 +101,17 @@ class CategoryFinderImplTest {
         assertThat(treeVos).hasSize(1);
     }
 
+    @Test
+    void listSubTreeByName() {
+        when(client.list(eq(Category.class), eq(null), any()))
+            .thenReturn(Flux.fromIterable(categoriesForTree()));
+        List<CategoryTreeVo> treeVos = categoryFinder.listAsTree("E").collectList().block();
+        assertThat(treeVos.get(0).getMetadata().getName()).isEqualTo("E");
+        assertThat(treeVos.get(0).getChildren()).hasSize(2);
+        assertThat(treeVos.get(0).getChildren().get(0).getMetadata().getName()).isEqualTo("A");
+        assertThat(treeVos.get(0).getChildren().get(1).getMetadata().getName()).isEqualTo("C");
+    }
+
     /**
      * Test for {@link CategoryFinderImpl#listAsTree()}.
      *