WordPress自定义文章类型与分类法URL结构配置问题求助
解决WordPress自定义文章类型与分类法的URL结构问题
我明白你想要实现的是:将projects自定义文章类型的单篇文章URL设置为websitename/[company分类项]/projects/项目名(比如websitename/film/projects/我的项目),但目前只显示websitename/projects/项目名。看了你提供的Movies和Genres的代码,里面有几处配置错误导致URL规则不生效,我来帮你修正并适配你的projects和company需求:
第一步:修正自定义文章类型(Projects)的注册代码
你原来的代码里rewrite参数被错误嵌套在taxonomies数组中,还重复设置了has_archive,这会直接导致URL结构失效。下面是修正后的注册代码:
// 注册自定义文章类型 Projects function register_projects_post_type() { $labels = array( 'name' => _x( '项目', 'Post Type General Name', 'text_domain' ), 'singular_name' => _x( '项目', 'Post Type Singular Name', 'text_domain' ), 'menu_name' => __( '项目', 'text_domain' ), 'name_admin_bar' => __( '项目', 'text_domain' ), 'archives' => __( '项目归档', 'text_domain' ), 'add_new_item' => __( '添加新项目', 'text_domain' ), 'add_new' => __( '添加新项目', 'text_domain' ), 'new_item' => __( '新项目', 'text_domain' ), 'edit_item' => __( '编辑项目', 'text_domain' ), 'update_item' => __( '更新项目', 'text_domain' ), 'view_item' => __( '查看项目', 'text_domain' ), 'search_items' => __( '搜索项目', 'text_domain' ), 'not_found' => __( '未找到项目', 'text_domain' ), 'not_found_in_trash' => __( '回收站中未找到项目', 'text_domain' ), ); $args = array( 'label' => __( '项目', 'text_domain' ), 'description' => __( '自定义项目文章类型', 'text_domain' ), 'labels' => $labels, 'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes' ), 'taxonomies' => array( 'company' ), // 关联company分类法 'rewrite' => array( 'slug' => '%company%/projects', // 定义URL结构为「分类项/projects」 'with_front' => false ), 'hierarchical' => true, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => 'projects', // 项目归档页URL为 websitename/projects 'exclude_from_search' => false, 'publicly_queryable' => true, 'capability_type' => 'page', ); register_post_type( 'projects', $args ); } add_action( 'init', 'register_projects_post_type', 0 );
第二步:修正自定义分类法(Company)的注册代码
同样,你原来的代码里rewrite参数位置错误,需要调整规则让它和文章类型的URL匹配:
// 注册自定义分类法 Company function register_company_taxonomy() { $labels = array( 'name' => _x( '公司分类', 'Taxonomy General Name', 'text_domain' ), 'singular_name' => _x( '公司分类', 'Taxonomy Singular Name', 'text_domain' ), 'menu_name' => __( '公司分类', 'text_domain' ), 'all_items' => __( '所有公司分类', 'text_domain' ), 'new_item_name' => __( '新分类名称', 'text_domain' ), 'add_new_item' => __( '添加新分类', 'text_domain' ), 'edit_item' => __( '编辑分类', 'text_domain' ), 'update_item' => __( '更新分类', 'text_domain' ), 'view_item' => __( '查看分类', 'text_domain' ), 'search_items' => __( '搜索分类', 'text_domain' ), 'not_found' => __( '未找到分类', 'text_domain' ), 'no_terms' => __( '没有分类项', 'text_domain' ), ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'public' => true, 'show_ui' => true, 'rewrite' => array( 'slug' => '', // 留空,因为文章类型的rewrite已包含分类项路径 'with_front' => false, 'hierarchical' => true // 若分类有层级结构,开启此选项 ), 'query_var' => true, 'publicly_queryable' => true, 'show_admin_column' => true, 'show_in_nav_menus' => true, 'show_tagcloud' => false, ); register_taxonomy( 'company', array( 'projects' ), $args ); // 仅关联projects文章类型 } add_action( 'init', 'register_company_taxonomy', 0 );
第三步:修正URL替换的过滤器函数
这个函数负责把文章类型URL里的%company%占位符替换成实际的分类项slug,同时处理分类项不存在的情况:
function replace_projects_company_permalink( $post_link, $post ){ // 仅处理projects类型的文章 if ( is_object( $post ) && $post->post_type == 'projects' ){ $terms = wp_get_object_terms( $post->ID, 'company' ); // 确保分类项存在且有效 if( !empty($terms) && !is_wp_error($terms) ){ return str_replace( '%company%' , $terms[0]->slug , $post_link ); } // 若未分配分类,返回默认URL(可根据需求自定义) return str_replace( '%company%/projects', 'projects', $post_link ); } return $post_link; } add_filter( 'post_type_link', 'replace_projects_company_permalink', 10, 2 );
最后一步:刷新固定链接设置
完成代码修改后,务必进入WordPress后台的 设置 → 固定链接 页面,无需修改任何配置,直接点击「保存更改」按钮。这会刷新WordPress的URL重写规则,让新的URL结构正式生效。
额外注意事项
- 如果一个项目属于多个company分类,上述代码会自动使用第一个分类的slug作为URL的一部分。若需要让用户自定义选择主分类,可以添加一个自定义字段来实现。
- 确保你的固定链接设置不是「朴素」模式,推荐使用「文章名称」或自定义结构。
内容的提问来源于stack exchange,提问作者Duggy G
相关产品推荐
相关产品推荐

