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的单个页面以及存档页面,基本上完全隐藏在前端,但是只能用于自定义帖子。
^最适合您只需要用于管理员/后端使用的自定义帖子的情况。
#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 楼
一种简单的方法是在注册自定义帖子类型时传递以下argsregister_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
评论
一个好的解决方案。通过检查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