WordPress:用Custom Post Types与Custom Taxonomies实现体育俱乐部Permalink
实现WordPress中体育俱乐部队伍的层级Permalink结构
你提到的http://www.example.com/football/senior/men/first-team这种层级结构完全可以实现,核心思路是自定义文章类型(CPT)+ 分层自定义分类法 + 自定义重写规则/占位符替换,之前的思路方向是对的,只是需要调整分类法的层级和permalink的配置方式,下面我分两种方案详细说明:
方案一:纯代码实现(适合开发者)
这种方式灵活性最高,不需要依赖插件,完全通过主题的functions.php或自定义插件来配置。
1. 注册自定义文章类型和分层分类法
首先,我们需要创建:
- 一个
team自定义文章类型:对应每支具体队伍(比如First Team) - 一个
sport分层分类法:顶级分类为Football、Handball、Volleyball、Tennis - 一个
team_group分层分类法:顶级分类为Senior、Junior,每个顶级项下再创建子分类(Senior下的Men、Ladies;Junior下的Boys、Girls)
把以下代码添加到你的主题functions.php文件中:
// 注册队伍自定义文章类型 function register_team_cpt() { $args = array( 'public' => true, 'label' => 'Teams', 'menu_icon' => 'dashicons-groups', 'rewrite' => array( 'slug' => '%sport%/%team_group%' ), // 预留占位符 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ), 'has_archive' => true, ); register_post_type( 'team', $args ); } add_action( 'init', 'register_team_cpt' ); // 注册运动项目分类法 function register_sport_taxonomy() { $args = array( 'hierarchical' => true, 'label' => 'Sports', 'rewrite' => array( 'slug' => 'sport' ), 'show_admin_column' => true, ); register_taxonomy( 'sport', 'team', $args ); } add_action( 'init', 'register_sport_taxonomy' ); // 注册队伍组别分类法(分层结构:Senior > Men) function register_team_group_taxonomy() { $args = array( 'hierarchical' => true, 'label' => 'Team Groups', 'rewrite' => array( 'slug' => 'team-group' ), 'show_admin_column' => true, ); register_taxonomy( 'team_group', 'team', $args ); } add_action( 'init', 'register_team_group_taxonomy' );
2. 替换Permalink中的占位符
上面的代码里我们给team的permalink设置了%sport%和%team_group%占位符,现在需要编写过滤器来替换这些占位符,把它们换成实际的分类slug(注意team_group需要拼接父分类和子分类的slug,比如senior/men):
// 自定义队伍Permalink的占位符替换 function custom_team_permalink( $permalink, $post ) { // 只处理team类型的文章 if ( $post->post_type !== 'team' ) { return $permalink; } // 获取当前队伍对应的运动项目slug $sports = wp_get_post_terms( $post->ID, 'sport', array( 'fields' => 'slug' ) ); $sport_slug = ! empty( $sports ) ? $sports[0] : 'football'; // 设置默认值 // 获取当前队伍对应的组别(父分类+子分类slug) $groups = wp_get_post_terms( $post->ID, 'team_group', array( 'fields' => 'all' ) ); $group_slug = ''; if ( ! empty( $groups ) ) { $group = $groups[0]; // 如果是子分类,拼接父分类和子分类的slug if ( $group->parent ) { $parent_group = get_term( $group->parent, 'team_group' ); $group_slug = $parent_group->slug . '/' . $group->slug; } else { $group_slug = $group->slug; } } else { $group_slug = 'senior/men'; // 设置默认值 } // 替换占位符 $permalink = str_replace( '%sport%', $sport_slug, $permalink ); $permalink = str_replace( '%team_group%', $group_slug, $permalink ); return $permalink; } add_filter( 'post_type_link', 'custom_team_permalink', 10, 2 );
3. 添加自定义重写规则(处理归档页面)
如果需要支持/football/senior/men这样的归档页面(显示该组别下的所有队伍),需要添加以下重写规则:
// 添加自定义重写规则,支持层级归档链接 function custom_team_rewrite_rules() { // 匹配 /运动项目/组别父分类/组别子分类 结构,指向对应归档 add_rewrite_rule( '^([^/]+)/([^/]+)/([^/]+)/?$', 'index.php?sport=$1&team_group=$3', 'top' ); // 匹配 /运动项目/组别父分类 结构,指向对应归档 add_rewrite_rule( '^([^/]+)/([^/]+)/?$', 'index.php?sport=$1&team_group=$2', 'top' ); // 匹配 /运动项目 结构,指向对应归档 add_rewrite_rule( '^([^/]+)/?$', 'index.php?sport=$1', 'top' ); } add_action( 'init', 'custom_team_rewrite_rules' );
4. 刷新重写规则
完成以上代码添加后,进入WordPress后台的设置 → 固定链接页面,随便修改一下设置(比如切换到另一种结构再切回来),然后点击「保存更改」,这样新的重写规则就会生效。
方案二:插件实现(适合非开发者)
如果你不想写代码,可以用插件组合来快速实现:
- Custom Post Type UI:可视化创建
team自定义文章类型,以及sport和team_group两个分层分类法 - Custom Post Type Permalinks:支持在CPT的Permalink中插入分类slug,包括分层分类的父/子slug
操作步骤:
- 安装并激活上述两个插件
- 用Custom Post Type UI创建
teamCPT,开启「归档」和「重写」选项 - 创建
sport分层分类法(关联到team),添加Football等顶级分类 - 创建
team_group分层分类法(关联到team),添加Senior、Junior顶级分类,再在其下添加Men、Ladies等子分类 - 进入Custom Post Type Permalinks的设置页面,找到
team的Permalink设置,填写为:/%sport%/%team_group%/%postname%/ - 同样需要刷新固定链接规则,确保设置生效
注意事项
- 每个队伍只能分配一个运动项目和一个子组别分类(比如Senior下的Men),否则Permalink会出现问题
- 分类的slug要保证唯一,避免不同层级的分类slug重复导致链接冲突
- 如果出现404错误,优先检查重写规则是否刷新,或者分类slug是否配置正确
内容的提问来源于stack exchange,提问作者Gert-Jan Kooijmans
相关产品推荐
相关产品推荐

