从网址中删除自定义帖子类型


15

尚未找到有用的答案。我知道冲突问题以及可能引起的所有问题,我很好奇它是否可能被建议。这将需要WP重写,我很了解。

基本上,假设我们有一个“事件”的CPT。我想让一个活动的页面具有URL http://domain.com/single-event-name而不是URL http://domain.com/events/single-event-name。关于如何处理的任何想法?


一直想找出答案,从来没有想过要问的问题。谢谢!
fischi 2012年

@robbennet在2015年似乎仍然没有合法的方式来做到这一点。
Ben Racicot 2015年

Answers:


9

这样您就可以完成工作的第一部分-摆脱帖子链接中的CPT标记(例如新闻帖子类型)。

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');

然后,我们需要刷新重写规则,因此请转到“设置”“永久链接”并保存更改。


1
您不应该在init上添加重写规则。您应该将规则添加到当前规则中。
Chris_O

2
@Chris_O您能详细说明吗?如何将规则添加到当前规则中?
Desi 2015年

添加此代码后,我所有具有URLS作为example.com/about-us的页面都停止了工作?有什么解决办法吗?
拉胡尔·古普塔

4

您可以尝试使用此插件(http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/)来删除该插件,但只有当永久链接结构为“ /%postname”时,该插件才有效%/


确实,这个插件很棒!我是这个插件的经验丰富的用户,我完全推荐它!这里的插件的网站,其解释它在深度链接ultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary

这是一个不错的插件,并且具有我一直在寻找的功能。@bartosz解决方案专门针对一种CPT,尽管您也从中获得了总体思路。深入研究此插件后,现在一切都清楚了,谢谢!
fischi 2012年

0

您始终可以连接到“ parse_request”以进行检查,以查看是否存在具有所请求名称的自定义类型,然后适当地修改query_vars。您还需要类似@Bartosz响应的内容来生成永久链接:

 add_filter('parse_request', "t21_parse_request" , 1, 1);

 function t21_parse_request($wbobj)
 {
      $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;
      }
 }

但是,这确实假定您将没有与该帖子名称同名的任何帖子名称,否则,该帖子将永远不会出现,因为它首先与事件类型匹配。


0
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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.