现在,我已经花了几个小时试图完成这项工作,却没有找到合适的解决方案。
WHAT I WANT TO ACHIEVE
我希望WP使用以下URL结构:
1) Posts -> /%category%/articles/%postname%/
2) CPT -> /%category%/CPT/%postname%/
其中%category%位是帖子中使用的默认类别分类法
WHAT I DID SO FAR
要将默认类别分类添加到CPT,在注册CPT时添加了此位
\'taxonomies\' => array(\'category\'),
鉴于以下是重写参数
$rewrite_args = array( \'slug\' => \'%category%/test\', \'with_front\' => false, \'feeds\' => false, \'pages\' => false );
CHANGING THE DEFAULT POST
我知道最明显的解决方案是改变设置面板中的permalink结构。无论如何都需要这样做,否则我将描述的任何东西都会起作用。
因此,我的Permalink结构设置为
/%category%/articles/%postname%/
WHAT\'S HAPPENING
如果我离开基本配置,没有挂钩,什么都没有。立柱按预期工作。
当我挂接post\\u type\\u链接以使我的CPT替换%类别%时,默认配置停止工作。
我试图重新注册帖子类型;这似乎提供了更好的结果(虽然在管理栏中两次查看“posts”项目会带来不便),但由于某种原因,当我这样做时,CPT自定义slug停止工作。
你有什么特别的提示吗?ThanksAndrea公司
最合适的回答,由SO网友:Milo 整理而成
您必须添加自己的重写规则才能使其正常工作,这是无法避免的。
首先,不要使用%category%
重写标记,注册您自己的标记,并将其用于CPT类别:
function wpd_query_vars( $qvars ) {
$qvars[] = \'cptcat\';
return $qvars;
}
add_filter( \'query_vars\', \'wpd_query_vars\' );
然后,可以将该标记替换为中的类别
post_type_link
. 请注意,这只处理一个级别的术语。如果要进行父/子术语永久链接,则必须修改此函数并添加重写规则以捕获术语层次结构的每一层。
function wpd_test_post_link( $post_link, $id = 0 ){
$post = get_post($id);
if ( is_object( $post ) && $post->post_type == \'your_cpt\' ){
$terms = wp_get_object_terms( $post->ID, \'category\' );
if( $terms ){
foreach( $terms as $term ){
if( 0 == $term->parent ){
return str_replace ( \'%cptcat%\' , $term->slug , $post_link );
}
}
} else {
return str_replace ( \'%cptcat%\' , \'uncategorized\', $post_link );
}
}
return $post_link;
}
add_filter( \'post_type_link\', \'wpd_test_post_link\', 1, 2 );
现在这仍然行不通,因为WordPress认为您的永久链接是一个父/子类别请求。添加重写规则以覆盖:
function wpd_test_rewrites(){
add_rewrite_rule(
\'([^/]+)/CPT/([^/]+)/?$\',
\'index.php?your_cpt=$matches[2]\',
\'top\'
);
}
add_action( \'init\', \'wpd_test_rewrites\' );