Custom Post types
控制的LMS类型系统。帖子类型称为
Lessons
(带有courses
的子弹),并且具有一个名为custom taxonomy
的courses
(类别)。 域网址结构现在显示为:
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 );
#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'
);
}
评论
最近,我面临这个问题。解决了! [#188834] [1] [1]:wordpress.stackexchange.com/questions/94817/…解! (经过无休止的研究)
,您应该修改post_type_link过滤器。更多信息,请访问:wordpress.stackexchange.com/a/167992/33667)
如何更改自定义帖子类型的永久链接结构及其分类的可能重复项?