从URL中删除自定义POST类型slug

时间:2012-09-28 作者:Rob Bennet

还没有找到一个有用的答案。我知道冲突问题以及由此可能导致的所有问题,我很好奇是否可以不建议。这将需要WP重写,我知道这么多。

基本上,假设我们有一个“事件”的CPT。我想让单个事件的页面具有URLhttp://domain.com/single-event-name 而不是http://domain.com/events/single-event-name. 有什么办法吗?

4 个回复
SO网友:Bartosz

这就是你如何做第一部分工作的方法——去掉帖子链接中的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\');
然后我们需要刷新重写规则,所以请转到设置-永久链接并保存更改。

SO网友:swtshweta

您可以尝试此插件(http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ ) 用于删除段塞,但它仅在permalink结构为“/%postname%”时有效/

SO网友:kristina childs

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重写,然后编辑。htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]

SO网友:Zakalwe

你可以随时加入;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同名的帖子名称,否则,帖子将永远不会出现,因为它首先与事件类型匹配。

结束

相关推荐