如何在WordPress中列出指定父页面子页面使用的分类?
解决WordPress父页面展示子页面所用分类的问题
要实现页面ID30展示其所有子页面使用的分类,核心思路是先获取子页面集合→收集所有子页面关联的分类→去重后输出分类信息,以下是具体实现方案:
步骤1:获取指定父页面的所有子页面
使用get_pages()函数筛选出父ID为30的所有已发布子页面:
$child_pages = get_pages(array( 'parent' => 30, // 指定父页面ID 'post_type' => 'page', 'post_status' => 'publish' ));
步骤2:收集子页面关联的分类ID并去重
遍历子页面,用wp_get_post_terms()获取每个页面绑定的分类(前提是已给页面类型开启分类支持),收集ID后去重避免重复展示:
$category_ids = array(); foreach ($child_pages as $page) { // 获取当前页面的分类ID集合 $page_categories = wp_get_post_terms($page->ID, 'category', array('fields' => 'ids')); if (!empty($page_categories)) { $category_ids = array_merge($category_ids, $page_categories); } } // 去重处理 $unique_category_ids = array_unique($category_ids);
步骤3:获取分类详细信息并输出
用get_terms()(比get_categories()更灵活)根据去重后的ID获取分类数据,循环输出分类列表:
if (!empty($unique_category_ids)) { $categories = get_terms(array( 'taxonomy' => 'category', 'include' => $unique_category_ids, 'hide_empty' => false // 即使分类下无内容也显示 )); // 输出分类列表 echo '<ul class="child-page-categories">'; foreach ($categories as $cat) { echo '<li><a href="' . esc_url(get_category_link($cat->term_id)) . '">' . esc_html($cat->name) . '</a></li>'; } echo '</ul>'; } else { echo '<p>暂无子页面使用的分类</p>'; }
完整短代码封装(方便页面编辑器调用)
如果想直接在页面编辑器中插入调用,可将代码封装为短代码,添加到主题functions.php:
add_shortcode('show_child_page_categories', function() { $child_pages = get_pages(array( 'parent' => 30, 'post_type' => 'page', 'post_status' => 'publish' )); $category_ids = array(); foreach ($child_pages as $page) { $page_categories = wp_get_post_terms($page->ID, 'category', array('fields' => 'ids')); if (!empty($page_categories)) { $category_ids = array_merge($category_ids, $page_categories); } } $unique_category_ids = array_unique($category_ids); if (empty($unique_category_ids)) { return '<p>暂无子页面使用的分类</p>'; } $categories = get_terms(array( 'taxonomy' => 'category', 'include' => $unique_category_ids, 'hide_empty' => false )); $output = '<ul class="child-page-categories">'; foreach ($categories as $cat) { $output .= '<li><a href="' . esc_url(get_category_link($cat->term_id)) . '">' . esc_html($cat->name) . '</a></li>'; } $output .= '</ul>'; return $output; });
添加完成后,在页面ID30的编辑器中插入[show_child_page_categories]即可显示分类列表。
注意事项
- 若页面未开启分类支持,需在
functions.php中添加以下代码开启:add_action('init', function() { register_taxonomy_for_object_type('category', 'page'); }); - 代码中使用
esc_url()和esc_html()做安全转义,避免XSS风险。
内容的提问来源于stack exchange,提问作者dubbs
相关产品推荐
相关产品推荐

