问题是我想继续使用340个现有类别。我曾经能够看到/ category / subcategory / postname
现在我有了customposttype / postname的标签。选择类别不再显示在永久链接中...我没有将admin中的永久链接设置更改为其他任何内容。
是否缺少某些内容或需要添加到此代码中? br />
function jcj_club_post_types() {
register_post_type( 'jcj_club', array(
'labels' => array(
'name' => __( 'Jazz Clubs' ),
'singular_name' => __( 'Jazz Club' ),
'add_new' => __( 'Add New' ),
'add_new_item' => __( 'Add New Jazz Club' ),
'edit' => __( 'Edit' ),
'edit_item' => __( 'Edit Jazz Clubs' ),
'new_item' => __( 'New Jazz Club' ),
'view' => __( 'View Jazz Club' ),
'view_item' => __( 'View Jazz Club' ),
'search_items' => __( 'Search Jazz Clubs' ),
'not_found' => __( 'No jazz clubs found' ),
'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
'parent' => __( 'Parent Jazz Club' ),
),
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 5,
'query_var' => true,
'supports' => array(
'title',
'editor',
'comments',
'revisions',
'trackbacks',
'author',
'excerpt',
'thumbnail',
'custom-fields',
),
'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
'taxonomies' => array( 'category','post_tag'),
'can_export' => true,
)
);
#1 楼
添加自定义帖子类型重写规则时,有2点需要注意:重写规则
当在
wp-includes/rewrite.php
中的WP_Rewrite::rewrite_rules()
中生成重写规则时,会发生这种情况。 WordPress允许您过滤特定元素(例如帖子,页面和各种类型的存档)的重写规则。您在哪里看到posttype_rewrite_rules
部分应该是您的自定义帖子类型的名称。或者,也可以使用posttype
过滤器,只要您也不会破坏标准发布规则。接下来,我们需要该函数实际生成重写规则:
如果您决定玩转这里,需要注意的主要是'Walk directory'布尔值。它为永久结构的每个段生成重写规则,并且可能导致重写规则不匹配。当请求WordPress URL时,将从顶部到底部检查重写规则数组。一旦找到一个匹配项,它将加载遇到的所有内容,例如,如果您的永久性拥有一个贪婪的匹配项,例如。对于
post_rewrite_rules
和walk目录,将为/%category%/%postname%/
和/%category%/%postname%/
输出匹配任何内容的重写规则。如果这种情况发生得太早了,您就被搞砸了。 下一部分是一个简单的示例,该示例理想地是
/%category%/
中找到的get_permalink()
函数的版本。自定义帖子永久链接由wp-includes/link-template.php
生成,它是get_post_permalink()
的精简版本。 get_permalink()
被get_post_permalink()
过滤,因此我们使用它来创建自定义的永久结构。// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );
function add_permastruct( $rules ) {
global $wp_rewrite;
// set your desired permalink structure here
$struct = '/%category%/%year%/%monthnum%/%postname%/';
// use the WP rewrite rule generating function
$rules = $wp_rewrite->generate_rewrite_rules(
$struct, // the permalink structure
EP_PERMALINK, // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
false, // Paged: add rewrite rules for paging eg. for archives (not needed here)
true, // Feed: add rewrite rules for feed endpoints
true, // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
false, // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
true // Add custom endpoints
);
return $rules;
}
如前所述,这是生成自定义重写规则集和永久链接的非常简化的情况,并且不是特别灵活,但足以让您入门。
作弊
我写了一个插件,可以为任何自定义帖子类型定义永久结构,但是就像您可以在永久链接结构中使用
post_type_link
一样,我的插件也支持%category%
用于您拥有的任何自定义分类法,其中%custom_taxonomy_name%
是分类法的名称,例如。 custom_taxonomy_name
。它可以按照您期望的方式使用分层/非分层分类法。
http://wordpress.org/extend/plugins/wp-permastructure/
评论
插件很棒,但是如果没有插件,您能解释一下如何解决问题吗?
– Eugene Manuilov
2012-12-20 13:39
我同意有一个插件来解决这个问题是很棒的(我将它加为书签,这是我首先问到的这个问题),但是从问题的简要概述和插件如何解决它的角度出发,答案将是有益的。 :)
–稀有
2012年12月22日14:30在
@EugeneManuilov好吧,很抱歉,这是一个冗长的答案。这就是我的基本知识!
– sanchothefat
2012年12月24日在2:01
看起来像第一个$ permalink = home_url(...被$ permalink = user_trailingslashit(...覆盖,并且从未使用过。还是我错过了一些东西?$ post_link甚至都没有定义。应该是$ permalink = user_trailingslashit($ permalink,'single');吗?
–伊恩·邓恩
2013年2月5日在23:07
不错,应该是$ permalink而不是$ post_link。干杯:)
– sanchothefat
13年2月6日在10:50
#2 楼
我找到了解决方案!!!!!!(经过无休止的研究。。我可以拥有自定义帖子类型的永久链接,例如:
example.com/category/sub_category/my-post-name
此处的代码(在函数中) .php或插件):
//===STEP 1 (affect only these CUSTOM POST TYPES)
$GLOBALS['my_post_typesss__MLSS'] = array('my_product1','....');
//===STEP 2 (create desired PERMALINKS)
add_filter('post_type_link', 'my_func88888', 6, 4 );
function my_func88888( $post_link, $post, $sdsd){
if (!empty($post->post_type) && in_array($post->post_type, $GLOBALS['my_post_typesss']) ) {
$SLUGG = $post->post_name;
$post_cats = get_the_category($id);
if (!empty($post_cats[0])){ $target_CAT= $post_cats[0];
while(!empty($target_CAT->slug)){
$SLUGG = $target_CAT->slug .'/'.$SLUGG;
if (!empty($target_CAT->parent)) {$target_CAT = get_term( $target_CAT->parent, 'category');} else {break;}
}
$post_link= get_option('home').'/'. urldecode($SLUGG);
}
}
return $post_link;
}
// STEP 3 (by default, while accessing: "EXAMPLE.COM/category/postname"
// WP thinks, that a standard post is requested. So, we are adding CUSTOM POST
// TYPE into that query.
add_action('pre_get_posts', 'my_func4444', 12);
function my_func4444($q){
if ($q->is_main_query() && !is_admin() && $q->is_single){
$q->set( 'post_type', array_merge(array('post'), $GLOBALS['my_post_typesss'] ) );
}
return $q;
}
#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%/"
别忘了从仪表板上清除永久链接。
评论
+1最简单的解决方案是只使用此插件:wordpress.org/plugins/custom-post-type-permalinks完美运行
–法律
17年8月16日在10:49
是的,但是如果您有单个自定义帖子类型,但是如果您在单个主题中有多个自定义帖子类型,那么以上就是解决方案。此外,它还更改了与您的帖子类型信息相同的类别信息。
–瓦尔沙(Varsha Dhadge)
17年8月18日在6:41
#4 楼
您的代码有几个错误。我清理了您现有的代码:<?php
function jcj_club_post_types() {
$labels = array(
'name' => __( 'Jazz Clubs' ),
'singular_name' => __( 'Jazz Club' ),
'add_new' => __( 'Add New' ),
'add_new_item' => __( 'Add New Jazz Club' ),
'edit' => __( 'Edit' ),
'edit_item' => __( 'Edit Jazz Clubs' ),
'new_item' => __( 'New Jazz Club' ),
'view' => __( 'View Jazz Club' ),
'view_item' => __( 'View Jazz Club' ),
'search_items' => __( 'Search Jazz Clubs' ),
'not_found' => __( 'No jazz clubs found' ),
'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
'parent' => __( 'Parent Jazz Club' ),
);
$args = array(
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 5,
'query_var' => true,
'supports' => array( 'title','editor','comments','revisions','trackbacks','author','excerpt','thumbnail','custom-fields' ),
'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
'has_archive' => true
);
register_post_type( 'jcj_club', $args );
}
add_action( 'init','jcj_club_post_types' );
?>
将您的代码替换为上面的代码,看看它是否有效。如果您还有其他问题,请回复。
编辑:
我注意到我遗漏了
'has_archive' => true
。
评论
这可能是一个愚蠢的问题,但是您是否刷新了重写内容?最近,我面临这个问题。解决了! [#188834] [1] [1]:wordpress.stackexchange.com/questions/94817/…