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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:59