如何修改PHP代码实现WordPress单页父子分类列表指定格式输出
解决WordPress single.php中分类列表按父分类分组显示的问题
要实现每个父分类对应一个<ul>,父分类标题带parent_cat_title类,子分类带child_cat类的格式,需要重构现有代码,不再依赖wp_list_categories的默认输出,而是手动整理分类结构并渲染:
修改后的完整代码
<?php $taxonomy = 'category'; // 获取当前文章关联的所有分类,包含完整分类数据 $post_terms = wp_get_object_terms(get_the_ID(), $taxonomy, array( 'fields' => 'all', 'orderby' => 'parent', 'order' => 'ASC' )); if (!empty($post_terms) && !is_wp_error($post_terms)) { $parent_cats = array(); // 整理父分类和对应的子分类 foreach ($post_terms as $term) { // 处理顶级分类(父ID为0) if ($term->parent == 0) { $parent_cats[$term->term_id] = array( 'term' => $term, 'children' => array() ); } else { // 处理子分类,归属到对应的父分类下 if (isset($parent_cats[$term->parent])) { $parent_cats[$term->parent]['children'][] = $term; } else { // 如果父分类未关联到当前文章,也单独作为父分类处理 $parent_cats[$term->term_id] = array( 'term' => get_term($term->parent, $taxonomy), 'children' => array($term) ); } } } // 循环输出每个父分类的结构 foreach ($parent_cats as $parent) { if (empty($parent['term'])) continue; ?> <ul> <li class="parent_cat_title"><?php echo esc_html($parent['term']->name); ?></li> <?php foreach ($parent['children'] as $child) : ?> <li class="child_cat"> <a href="<?php echo esc_url(get_term_link($child)); ?>"><?php echo esc_html($child->name); ?></a> </li> <?php endforeach; ?> </ul> <?php } } ?>
代码关键说明
- 获取完整分类数据:修改
wp_get_object_terms的fields参数为all,拿到分类的完整信息(包括父ID、名称、链接等),方便后续分组。 - 分类分组逻辑:遍历所有分类,将顶级分类(parent=0)作为父分类容器,子分类归属到对应的父分类下;如果子分类的父分类未关联到当前文章,也自动获取父分类信息并创建分组。
- 安全输出:使用
esc_html()和esc_url()确保输出内容符合WordPress安全规范,避免XSS风险。 - 结构渲染:循环每个父分类,输出对应的
<ul>结构,父分类名称作为标题项,子分类生成带链接的列表项。
内容的提问来源于stack exchange,提问作者Paul Moffatt
相关产品推荐
相关产品推荐

