WordPress中如何通过标签(学期)展示分类(课程)的子分类(科目)?
实现思路与代码示例
嘿,这个需求我之前做教育类WordPress站点时碰到过,核心是要先建立学期标签和科目子分类的关联,然后通过循环查询把它们对应起来展示。下面是具体步骤和代码:
1. 建立学期与科目的关联
默认WordPress里标签和分类是独立的,所以我们需要给每个科目(子分类)添加自定义字段,用来绑定对应的学期标签。
方法一:用插件快速实现(推荐)
安装并启用Advanced Custom Fields插件,创建一个名为关联学期的字段组,字段类型选标签(Tag),然后设置这个字段组只在“分类编辑”页面显示,并且限定只针对子分类(可以通过ACF的规则设置,比如“分类父项不等于无”)。这样编辑每个科目子分类时,就能选择它所属的学期标签了。方法二:手动添加自定义字段(无需插件)
在主题的functions.php里添加以下代码,开启分类的自定义字段功能:add_action('edit_category_form_fields', 'add_term_custom_field'); add_action('edited_category', 'save_term_custom_field'); function add_term_custom_field($term) { // 只给子分类显示 if ($term->parent != 0) { $selected_term = get_term_meta($term->term_id, 'related_semester', true); ?> <tr class="form-field"> <th scope="row" valign="top"><label for="related_semester">关联学期</label></th> <td> <?php wp_dropdown_categories(array( 'taxonomy' => 'post_tag', 'name' => 'related_semester', 'selected' => $selected_term, 'show_option_none' => '选择学期', 'hide_empty' => false )); ?> </td> </tr> <?php } } function save_term_custom_field($term_id) { if (isset($_POST['related_semester'])) { update_term_meta($term_id, 'related_semester', $_POST['related_semester']); } }这样在编辑科目子分类时,就能看到“关联学期”的下拉框,选择对应的学期标签即可。
2. 查询并展示学期与对应科目
假设你的课程父分类(比如BBA)ID是5,可以在学生登录后的页面模板(比如student-dashboard.php)里添加以下代码:
<?php // 检查用户是否登录且是学生角色(假设学生角色是student) if (is_user_logged_in() && current_user_can('student')) { // 查询所有学期标签(可以按名称排序) $semesters = get_terms(array( 'taxonomy' => 'post_tag', 'hide_empty' => false, 'orderby' => 'name', 'order' => 'ASC' )); if (!empty($semesters)) { foreach ($semesters as $semester) { echo '<h3>' . $semester->name . '</h3>'; // 查询关联该学期的科目子分类(父分类为BBA,ID=5) $subjects = get_terms(array( 'taxonomy' => 'category', 'parent' => 5, // 替换成你的课程父分类ID 'hide_empty' => false, 'meta_query' => array( array( 'key' => 'related_semester', 'value' => $semester->term_id, 'compare' => '=' ) ) )); if (!empty($subjects)) { echo '<ul>'; foreach ($subjects as $subject) { echo '<li>' . $subject->name . '</li>'; // 如果需要链接到科目页面,可以用get_term_link($subject) // echo '<li><a href="' . get_term_link($subject) . '">' . $subject->name . '</a></li>'; } echo '</ul>'; } else { echo '<p>该学期暂无科目</p>'; } } } else { echo '<p>暂无学期数据</p>'; } } else { echo '<p>请登录后查看</p>'; } ?>
3. 注意事项
- 替换代码中的
parent => 5为你实际的课程父分类ID(比如BBA的分类ID),可以在WordPress后台“分类”页面查看。 - 如果你的学生角色不是
student,需要替换current_user_can('student')为对应的角色权限或判断条件。 - 如果你用ACF插件添加的自定义字段,字段键要和代码里的
related_semester一致,否则查询不到数据。
这样就能实现每个学期标签下展示对应的科目子分类了,比如BBA的6个学期,每个学期下都会列出关联的科目~
内容的提问来源于stack exchange,提问作者Shibi
相关产品推荐
相关产品推荐

