You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:55:15