我正在用WordPress构建由Custom Post types控制的LMS类型系统。
帖子类型称为Lessons(带有courses的子弹),并且具有一个名为custom taxonomycourses(类别)。

域网址结构现在显示为:

domain.com/courses/lesson-name

我希望它成为:

domain.com/courses/[course-name{category}]/lesson-name

或本质上:

/[cpt]/%category%/%postname%/

这是我编写的现在控制CPTs的插件。

function rflms_post_type() {
    $labels = array(
        'name'                => _x( 'Lessons', 'Post Type General Name', 'text_domain' ),
        'singular_name'       => _x( 'Lesson', 'Post Type Singular Name', 'text_domain' ),
        'menu_name'           => __( 'Lessons', 'text_domain' ),
        'parent_item_colon'   => __( 'Parent Product:', 'text_domain' ),
        'all_items'           => __( 'All Lessons', 'text_domain' ),
        'view_item'           => __( 'View Lesson', 'text_domain' ),
        'add_new_item'        => __( 'Add New Lesson', 'text_domain' ),
        'add_new'             => __( 'New Lesson', 'text_domain' ),
        'edit_item'           => __( 'Edit Lesson', 'text_domain' ),
        'update_item'         => __( 'Update Lesson', 'text_domain' ),
        'search_items'        => __( 'Search Lessions', 'text_domain' ),
        'not_found'           => __( 'No Lessons Found', 'text_domain' ),
        'not_found_in_trash'  => __( 'No Lessons Found in Trash', 'text_domain' ),
    );

    $args = array(
        'label'               => __( 'Lessons', 'text_domain' ),
        'description'         => __( 'Referable Lessons', 'text_domain' ),
        'labels'              => $labels,
        'hierarchical'        => false,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'show_in_nav_menus'   => true,
        'show_in_admin_bar'   => true,
        'supports'        => array('premise-member-access', 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'),
        'menu_position'       => 5,
        'menu_icon'           => null,
        'can_export'          => true,
        'has_archive'         => true,
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'capability_type'     => 'post',
        'rewrite'                    => array('slug' => 'courses'),
    );

    register_post_type( 'lessons', $args );


// Hook into the 'init' action

}
add_action( 'init', 'rflms_post_type', 0 );

// Register Custom Taxonomy
function custom_taxonomy()  {
    $labels = array(
        'name'                       => _x( 'Courses', 'Taxonomy General Name', 'text_domain' ),
        'singular_name'              => _x( 'Course', 'Taxonomy Singular Name', 'text_domain' ),
        'menu_name'                  => __( 'Courses', 'text_domain' ),
        'all_items'                  => __( 'All Courses', 'text_domain' ),
        'parent_item'                => __( 'Parent Course', 'text_domain' ),
        'parent_item_colon'          => __( 'Parent Course:', 'text_domain' ),
        'new_item_name'              => __( 'New Course Name', 'text_domain' ),
        'add_new_item'               => __( 'Add New Course', 'text_domain' ),
        'edit_item'                  => __( 'Edit Course', 'text_domain' ),
        'update_item'                => __( 'Update Course', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separate Courses with commas', 'text_domain' ),
        'search_items'               => __( 'Search Courses', 'text_domain' ),
        'add_or_remove_items'        => __( 'Add or Remove Courses', 'text_domain' ),
        'choose_from_most_used'      => __( 'Choose from Most Used courses', 'text_domain' ),
    );

    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => false,
        'rewrite'                    => array('slug' => 'courses'),
    );

    register_taxonomy( 'course', 'lessons', $args );
}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );


评论

最近,我面临这个问题。解决了! [#188834] [1] [1]:wordpress.stackexchange.com/questions/94817/…

解! (经过无休止的研究)

,您应该修改post_type_link过滤器。更多信息,请访问:wordpress.stackexchange.com/a/167992/33667)

如何更改自定义帖子类型的永久链接结构及其分类的可能重复项?

#1 楼

更改您的重写以添加课程查询var:

'rewrite' => array('slug' => 'courses/%course%')


然后过滤器post_type_link将所选课程插入到永久链接中: />
还有自定义帖子类型固定链接等插件可以为您完成此任务。

评论


谢谢,感谢您的迅速答复。这完全有道理。不过我很好奇,我应该在哪里插入过滤器post_type_link?我可以只浏览整个文档的底部吗?

–扎克·罗素(Zach Russell)
13年4月6日在16:26

我将其添加到底部,它是404的页面。

–扎克·罗素(Zach Russell)
13年4月6日在16:31

您必须清除重写,请访问永久链接设置页面。

–米洛
13年4月6日在17:09

还请注意,您可能会与分类法和帖子类型发生冲突,而两者均共享相同的标签。

–米洛
13年4月6日在17:13

下载-存档页面404

–开发
20年4月4日在1:06

#2 楼

对我来说,解决方案包括三个部分。在我的情况下,帖子类型称为trainings


'rewrite' => array('slug' => 'trainings/%cat%')添加到register_post_type函数中。
将子弹头更改为具有动态类别。

因此,这是如何动态更改给定帖子类型的永久链接。添加到functions.php中:

function vx_soon_training_post_link( $post_link, $id = 0 ) {
    $post = get_post( $id );
    if ( is_object( $post ) ) {
        $terms = wp_get_object_terms( $post->ID, 'training_cat' );
        if ( $terms ) {
            return str_replace( '%cat%', $terms[0]->slug, $post_link );
        }
    }

    return $post_link;
}

add_filter( 'post_type_link', 'vx_soon_training_post_link', 1, 3 );


...这是如何在新的动态URL上加载适当的模板的方法。添加到functions.php中:

function archive_rewrite_rules() {
    add_rewrite_rule(
        '^training/(.*)/(.*)/?$',
        'index.php?post_type=trainings&name=$matches[2]',
        'top'
    );
    //flush_rewrite_rules(); // use only once
}

add_action( 'init', 'archive_rewrite_rules' );


就这样!请记住通过在后端再次保存永久链接来刷新永久链接。或使用flush_rewrite_rules()函数。

#3 楼



要具有用于自定义帖子类型的分层永久链接,请安装“自定义帖子类型永久链接”(https://wordpress.org/plugins/custom-post-type-permalinks/)插件。 >
更新注册的帖子类型。我将帖子类型名称作为帮助中心

function help_centre_post_type(){
    register_post_type('helpcentre', array( 
        'labels'            =>  array(
            'name'          =>      __('Help Center'),
            'singular_name' =>      __('Help Center'),
            'all_items'     =>      __('View Posts'),
            'add_new'       =>      __('New Post'),
            'add_new_item'  =>      __('New Help Center'),
            'edit_item'     =>      __('Edit Help Center'),
            'view_item'     =>      __('View Help Center'),
            'search_items'  =>      __('Search Help Center'),
            'no_found'      =>      __('No Help Center Post Found'),
            'not_found_in_trash' => __('No Help Center Post in Trash')
                                ),
        'public'            =>  true,
        'publicly_queryable'=>  true,
        'show_ui'           =>  true, 
        'query_var'         =>  true,
        'show_in_nav_menus' =>  false,
        'capability_type'   =>  'page',
        'hierarchical'      =>  true,
        'rewrite'=> [
            'slug' => 'help-center',
            "with_front" => false
        ],
        "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
        'menu_position'     =>  21,
        'supports'          =>  array('title','editor', 'thumbnail'),
        'has_archive'       =>  true
    ));
    flush_rewrite_rules();
}
add_action('init', 'help_centre_post_type');


这是注册分类法

function themes_taxonomy() {  
    register_taxonomy(  
        'help_centre_category',  
        'helpcentre',        
        array(
            'label' => __( 'Categories' ),
            'rewrite'=> [
                'slug' => 'help-center',
                "with_front" => false
            ],
            "cptp_permalink_structure" => "/%help_centre_category%/",
            'hierarchical'               => true,
            'public'                     => true,
            'show_ui'                    => true,
            'show_admin_column'          => true,
            'show_in_nav_menus'          => true,
            'query_var' => true
        ) 
    );  
}  
add_action( 'init', 'themes_taxonomy');


使您的永久链接正常工作

"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",


您可以删除%post_id%并保留/%help_centre_category%/%postname%/"

别忘了从仪表板上清除永久链接。 >

#4 楼

您需要在使用register_post_type函数注册自定义帖子类型的行下面进行更新。 >
要动态更改帖子类型的永久链接,必须在functions.php文件中添加以下代码:

function change_link( $post_link, $id = 0 ) {
    $post = get_post( $id );
    if( $post->post_type == 'courses' ) 
    {
       if ( is_object( $post ) ) {
          $terms = wp_get_object_terms( $post->ID, array('course') );
          if ( $terms ) {
             return str_replace( '%cat%', $terms[0]->slug, $post_link );
         }
      }
    }
    return   $post_link ;
}
add_filter( 'post_type_link', 'change_link', 1, 3 );

//load the template on the new generated URL otherwise you will get 404's the page

function generated_rewrite_rules() {
   add_rewrite_rule(
       '^courses/(.*)/(.*)/?$',
       'index.php?post_type=courses&name=$matches[2]',
       'top'
   );
}
add_action( 'init', 'generated_rewrite_rules' );


之后,您需要刷新重写永久链接,转到wp-admin>设置>永久链接。只需使用“保存更改”按钮更新永久链接设置。

它将返回如下网址:


domain.com/courses/ [课程名称{类别}] /课程名称

谢谢!

评论


否决票-单一CPT和CTP存档页面类型均为404

–开发
20-4-4在1:07



@dev是否遵循我在回答中提到的所有步骤?您是否刷新了重写永久链接?我已经测试过,并且工作正常。

– Chetan Vaghela
20年4月4日,下午3:57

#5 楼

是的经过大量研究,我得到了插件“ Custom Permalinks”。满足我的要求的方面-自定义URL,例如


用于类别
用于帖子
用于自定义帖子
用于自定义分类法等br />
喜欢这个自定义帖子类型-帖子:



#6 楼

这对我有用:

'rewrite' => array(
        'slug' => 'portfolio',
        'with_front' => false,
        'hierarchical' => true // to display category/subcategroy
    ),


评论


这不使用类别或它们的路径,而只是使自定义帖子类型成为分层。

– Joris Kroos
17年8月25日在11:53

#7 楼

对于对解决方案感兴趣的任何人,而不必修改原始的PHP代码,我强烈推荐Maciej Bis的插件Permalink Manager Lite。它可以拯救生命。

它具有可视化机制,可基于“永久结构”在自定义帖子类型的URL中删除或添加所需的任何部分: (由于涉及使用自定义帖子类型进行简单URL结构的所有痛苦,我们将放弃WP而转到另一个CMS。但是,此插件与ACF和CPTUI或Pods结合使用使Wordpress相当专业。)

#8 楼

如果您使用的是get_post_type_archive_link(),则可能需要使用/%cat%/过滤器从网址中删除post_type_archive_link

#9 楼

我发现@ chetan-vaghela的答案几乎是完美的;在我的用例中,我还希望能够看到该帖子类型的所有帖子列表,例如典型的存档页面(即/ courses /,后面没有任何分类法)。我只需要添加一个附加的重写规则,如下所示:
function generated_rewrite_rules() {
    add_rewrite_rule(
        '^courses/(.*)/(.*)/?$',
        'index.php?post_type=courses&name=$matches[2]',
        'top'
    );
}