还没有找到一个有用的答案。我知道冲突问题以及由此可能导致的所有问题,我很好奇是否可以不建议。这将需要WP重写,我知道这么多。
基本上,假设我们有一个“事件”的CPT。我想让单个事件的页面具有URLhttp://domain.com/single-event-name 而不是http://domain.com/events/single-event-name. 有什么办法吗?
还没有找到一个有用的答案。我知道冲突问题以及由此可能导致的所有问题,我很好奇是否可以不建议。这将需要WP重写,我知道这么多。
基本上,假设我们有一个“事件”的CPT。我想让单个事件的页面具有URLhttp://domain.com/single-event-name 而不是http://domain.com/events/single-event-name. 有什么办法吗?
这就是你如何做第一部分工作的方法——去掉帖子链接中的CPT slug(例如新闻帖子类型)。
function df_custom_post_type_link( $post_link, $id = 0 ) {
$post = get_post($id);
if ( is_wp_error($post) || \'news\' != $post->post_type || empty($post->post_name) )
return $post_link;
return home_url(user_trailingslashit( "$post->post_name" ));
}
add_filter( \'post_type_link\', \'df_custom_post_type_link\' , 10, 2 );
现在应该有一个重写“新闻”的规则,因为你会得到一个404错误。添加如下重写规则:
function df_custom_rewrite_rule() {
add_rewrite_rule(\'(.*?)$\', \'index.php?news=$matches[1]\', \'top\');
}
add_action(\'init\', \'df_custom_rewrite_rule\');
然后我们需要刷新重写规则,所以请转到设置-永久链接并保存更改。您可以尝试此插件(http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ ) 用于删除段塞,但它仅在permalink结构为“/%postname%”时有效/
function register_cpt_type() {
register_post_type(\'cpt\', array(
\'rewrite\' => array("slug" => "/cpt", "with_front" => false),
));
}
add_action(\'init\', \'register_cpt_type\')
function cpt_rewrite_rule() {
add_rewrite_rule(\'(.*?)$\', \'index.php?cpt=$matches[1]\', \'top\');
}
add_action(\'after_theme_setup\', \'cpt_rewrite_rule\');
刷新/回收url重写,然后编辑。htaccessRewriteRule ^cpt/(.+)$ /$1 [R=301,L]
你可以随时加入;parse\\u请求“;执行检查以查看是否存在具有请求名称的自定义类型,然后适当修改query\\u vars。此外,您还需要按照@Bartosz的反应生成永久链接:
add_filter(\'parse_request\', "t21_parse_request" , 1, 1);
function t21_parse_request($wpobj)
{
$query_vars = $wpobj->query_vars;
$slug = $query_vars[\'pagename\'];
$posts = get_posts(array(
"post_type" => "event",
"post_name" => $slug
));
if($posts)
{
//we know your "event" entry exists so we now amend the query_vars
//first unset the \'page\' and \'pagename\'
unset($query_vars[\'page\']);
unset($query_vars[\'pagename\']);
//now rebuild the query_vars
$query_vars[\'post_type\'] = "event"; //CPT name
$query_vars[\'name\'] = $slug;
$query_vars[\'event\'] = $slug; //again - this constructs the "event=myevent" query string
}
else
{
//just return $wpobj since we know that there is no "event"
return $wpobj;
}
}
但是,这确实假设您不会有任何与postname同名的帖子名称,否则,帖子将永远不会出现,因为它首先与事件类型匹配。