我创建了一个自定义帖子类型:

register_post_type('sample_post_type',array(
    'labels' => array(
        'name' => _x('Sample Posts', 'post type general name'),
        'singular_name' => _x('Sample Post', 'post type singular name')
    ),
    'public' => true,
    'show_in_nav_menus' => false,
    'exclude_from_search' => true
));


如何禁用此特定帖子类型的单个帖子视图?显示简单的404很好,或重定向到主页。这是在插件内部,因此我无法创建single-sample_post_type.php文件来设置空白页。

#1 楼

方法1:
重定向到单个视图的自定义URL,存档页面仍可公开访问。
您可以使用template_redirect钩子重定向到自定义帖子类型,也可以在其中使用任何其他URL
<?php
add_action( 'template_redirect', 'wpse_128636_redirect_post' );

function wpse_128636_redirect_post() {
  if ( is_singular( 'sample_post_type' ) ) {
    wp_redirect( home_url(), 301 );
    exit;
  }
}
?>

方法2:
从前端完全禁用单个页面或存档页面;仅适用于自定义帖子。
另一种方法是,如果可以显示404页面,则在注册自定义帖子时为参数home_url()指定值。 [谢谢@gustavo]
'publicly_queryable'  => false`

它隐藏了CPT的单个页面以及存档页面,基本上完全隐藏在前端,但是只能用于自定义帖子。
^最适合您只需要用于管理员/后端使用的自定义帖子的情况。

评论


一个好的解决方案。通过检查get_current_user_id()的计算结果是否为0,我发现仅对未经身份验证的用户执行此重定向是有帮助的。

– RevNoah
15年6月29日在13:25

请检查答案表格@Gustavo

–理查德
16年11月18日在9:17

为什么不在if()条件中仅使用is_singular('post-type-slug')而不是2个条件?

– Akash K.
18-10-22在20:36

@AkashK。是的,它也可以正常工作,但并不知道该功能。

–库马尔
18-10-23在6:26

代码中缺少右括号-应该为... if(is_singular('sample_post_type'))

– neilgee
8月18日4:31



#2 楼

只需设置参数

'publicly_queryable'  => false


,当您调用register_post_type()

评论


这似乎是阻止CPT创建实际网页同时仍创建所有数据库引用的答案。

– Ben Racicot
2015年9月17日在18:11

这也隐藏档案

–太空人
16-10-11在16:12

这应该是公认的答案。

–SinisterBeard
18年3月16日在10:26

对我来说,这会导致重定向到首页,而不是404。为什么?如果相关,我正在用Piklist注册post_type。

–emersonthis
18年9月9日在21:27

#3 楼

一种简单的方法是在注册自定义帖子类型时传递以下args

register_post_type('sample_post_type',array(
'labels' => array(
    'name' => _x('Sample Posts', 'post type general name'),
    'singular_name' => _x('Sample Post', 'post type singular name')
),
'public' => true,
'exclude_from_search' => true,
'show_in_admin_bar'   => false,
'show_in_nav_menus'   => false,
'publicly_queryable'  => false,
'query_var'           => false
));


评论


为了使Post Type Archives正常工作,您实际上需要publicpublic_querable为true。

– Howdy_McGee♦
2014年11月12日19:42

这对我不起作用。尝试转到存档时,它会将重定向重定向回首页

– Yahya Uddin
15年7月15日在15:51



#4 楼

一。从您的功能文件。

add_action( 'template_redirect', 'redirect_cpt_singular_posts' );
    function redirect_cpt_singular_posts() {
      if ( is_singular('your-cpt-slug') ) {
        wp_redirect( home_url(), 302 );
        exit;
      }
    }


两个。从您的single.cpt.php文件中:

<?php wp_redirect( home_url() ); exit; ?>


评论


我喜欢第二种选择。但是我需要知道第二种选择是否有任何缺点。

–user2584538
17-10-10在6:27

@ user2584538如果您没有自定义的single-cpt_name.php文件,则无法这样做。如果将功能放在简单的插件文件中,则可以在不编辑任何文件的情况下激活/停用。

– EliasNS
18-2-5在10:12



#5 楼

测试了上面提到的所有内容,并且实际解决方案比建议的任何重定向都简单。

为了使存档可访问并列出项目,并且无法访问单个帖子并将其自动重定向到404 set

'query_var' => false

注册CPT时。如果将publicly_queryable设置为false,则您的档案将被重定向到主目录,其他任何组合都将无法使用。设置query_var为false就是这样。

此处是完整的CPT https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a

请参见第50行https://gist.github.com/danyj/bfd038d3c8d578548c4d700bd0a7942a# file-thz_cpt_items_single_view_redirect-php-L50

此处所述

https://codex.wordpress.org/Function_Reference/register_post_type



注意:如果query_var为空,为null或为布尔值FALSE,WordPress将仍然
尝试对其进行解释(4.2.2),并且您的
自定义帖子的预览/视图将返回404。


评论


感觉有点像骇客,但似乎可行。希望他们只是添加一个专用的has_single属性以及现有的has_archive属性。

–动力浮标
19年1月31日在13:40

嗨,我尝试做同样的事情,但是没有用。尽管将query_var添加为false,我仍然可以访问单页链接。你能帮我吗?

–iSaumya
10月13日12:08

#6 楼

如果您想完全禁用前端上的自定义帖子类型单一视图,但又能够显示存档页面,事情会变得有些复杂。和存档视图。 publicly_queryable函数参数中没有标记,以防止仅创建单个视图重写规则。

https://github.com/WordPress/WordPress/blob/5.2.3/wp-includes/class-wp -post-type.php#L540

但是,您可以在注册帖子类型后删除重写标签,这将使归档视图重写规则保持不变,而仅删除单个视图重写规则。

 false 


另一个好处是,从现在开始,您可以使用事件发布类型的永久链接结构(rewrite)创建简单的WordPress页面。

记住修改代码后刷新刷新规则。

评论


这应该是公认的答案,它简短,简单并且不会与存档页面混淆。

–辛西娅·拉拉(Cynthia Lara)
6月12日20:17

#7 楼

从Sven的非常好的答案出发,我重写了他的功能,以使其更容易在if语句中使用in_array()添加多个帖子类型,然后重定向到存档页面而不是首页。

(by顺便说一句,我认为将query_var和/或publically_queryable设置为false不仅会禁用单个视图,还会禁用本机存档视图,从而覆盖'has_archive' => true。在这种情况下,您仍然可以设置自定义WP_query并创建自己的存档页面,在模板中,但主要查询不会再这样做了吗?)

function fq_disable_single_cpt_views() {
  $queried_post_type = get_query_var('post_type');
  $cpts_without_single_views = array( 'my-post-type', 'my-other-post-type' );
  if ( is_single() && in_array( $queried_post_type, $cpts_without_single_views )  ) {
    wp_redirect( home_url( '/' . $queried_post_type . '/' ), 301 );
    exit;
  }
}

add_action( 'template_redirect', 'fq_disable_single_cpt_views' );


评论


这是个好主意,但是如果您更改了cpt的重定向,该方法将不起作用

– rudtek
3月23日17:57

我将您的wp_redirect行更改为wp_redirect(get_post_type_archive_link($ queried_post_type),301);很有魅力!

– rudtek
3月23日18:06

真好良好的改进。

– slashbob
3月24日21:18