如何禁用自定义帖子类型的单一视图?


47

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

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文件来设置空白页。

Answers:


42

您可以使用template_redirect钩子来重定向自定义帖子类型,可以使用要替换的任何其他URL home_url()以及其他自变量中的错误代码。

<?php
add_action( 'template_redirect', 'wpse_128636_redirect_post' );

function wpse_128636_redirect_post() {
  $queried_post_type = get_query_var('post_type');
  if ( is_single() && 'sample_post_type' ==  $queried_post_type ) {
    wp_redirect( home_url(), 301 );
    exit;
  }
}
?>

更新:

一种替代方法是设置:

'publicly_queryable'  => false`

在注册@gustavo前面提到的自定义帖子时。但是它只是完全删除了页面并将您重定向到404页面。它还隐藏单个页面和存档页面,基本上完全从前端隐藏,并且只能设置为自定义帖子。

^如果您想注册仅用于管理员/后端使用的自定义帖子,则此方法有效


一个好的解决方案。我发现这是有帮助的,只执行此重定向对于非认证的用户,通过检查,看是否get_current_user_id()计算结果为0
RevNoah

2
请检查答案表格@Gustavo
理查德(Richard)

2
为什么不只is_singular('post-type-slug')if()条件中而不是2个条件中使用?
Akash K.

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

74

只是设置参数

'publicly_queryable'  => false

当您调用register_post_type()


1
看起来这是阻止CPT创建实际网页同时仍创建所有数据库引用的答案。
Ben Racicot 2015年

27
这也隐藏了档案馆
太空人

1
这应该是公认的答案。
SinisterBeard

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

8

一种简单的方法是在注册自定义帖子类型时传递以下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
));

1
publically_querable为了使Post Type Archives正常工作,您实际上需要真实。
Howdy_McGee

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

7

一。从您的功能文件。

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

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

2

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

(顺便说一句,我认为设置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' );

2

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

为了使存档可访问并列出项目,并且单个帖子不可访问并自动重定向到404集

'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属性。
powerbuoy

0

如果您想完全禁用前端上的自定义帖子类型单一视图,但能够显示存档页面,则事情会变得有些复杂。

设置publicly_queryablefalserewritefalse防止用于显示单和归档视图。register_post_type函数参数中没有标志,以防止仅创建单个视图重写规则。

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

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

/**
 * Register event post type
 */
function wpse_128636_register_event_post_type() {

    $labels = array(
        'name' => __( 'Events' ),
        'singular_name' => __( 'Event' ),
        'add_new' => __( 'Add new' ),
        'add_new_item' => __( 'Add new' ),
        'edit_item' => __( 'Edit' ),
        'new_item' => __( 'New' ),
        'view_item' => __( 'View' ),
        'search_items' => __( 'Search' ),
        'not_found' => __( 'Not found' ),
        'not_found_in_trash' => __( 'Not found Events in trash' ),
        'parent_item_colon' => __( 'Parent' ),
        'menu_name' => __( 'Events' ),

    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'supports' => array( 'title', 'page-attributes' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'event'),
        'capability_type' => 'post',
    );

    register_post_type( 'event', $args );
    remove_rewrite_tag( '%event%' ); // This line will remove event rewrite rules for single view
}

add_action( 'init', 'wpse_128636_register_event_post_type' );

另一个好处是,从现在开始,您可以使用事件发布类型的永久链接结构(event/simple-page)创建简单的WordPress页面,这对复杂的网站很有用。

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

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.