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

时间:2014-01-05 作者:passatgt

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

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就可以了,或者重定向到主页。这是在插件中,所以我无法创建单个sample\\u post\\u类型。php文件来设置空页面。

7 个回复
最合适的回答,由SO网友:Kumar 整理而成

METHOD 1:

Redirect to a custom URL for single view, archive page is still publicly accessible.

您可以使用template_redirect 钩子以重定向自定义帖子类型,您可以使用任何其他URL来代替home_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;
  }
}
?>

METHOD 2:

Completely disable Single or Archive page from front-end; Works for a Custom post only.

另一种方法是为param指定值publicly_queryable 如果您可以显示404页面,则在注册自定义帖子时。[谢谢@古斯塔沃]

\'publicly_queryable\'  => false
它隐藏CPT的单个页面和归档页面,基本上完全隐藏在前端,但只能用于自定义帖子。

第二种解决方案最适合于只需要为管理/后端使用定制帖子的场景。

SO网友:Gustavo

只是设置参数

\'publicly_queryable\'  => false
调用register\\u post\\u type()时

SO网友:Nosebleed

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

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

SO网友:Benn

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

为了使归档文件可以访问并列出项目,以及单个帖子not 可访问并自动重定向到404集

\'query_var\' => false
注册您的CPT时。如果您设置publicly_queryable 伪造你的档案will be redirected 在家里,任何其他组合都不起作用。设置query_var 虚假,就是这样。

这是完整的CPThttps://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\\u var为空、null或布尔值FALSE,WordPress仍将尝试对其进行解释(4.2.2),自定义帖子的预览/视图将返回404s。

SO网友:Brad Dalton

One. 从函数文件。

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;
      }
    }
Two. 从你的单身。cpt。php文件:

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

SO网友:slashbob

根据Sven的一个非常好的答案,我重写了他的函数,以便使用in_array() 然后重定向到存档页而不是主页。

(顺便说一下,我认为环境query_var 和/或publically_queryable 设置为false将不仅禁用单个视图,而且禁用本机存档视图,覆盖\'has_archive\' => true. 在这种情况下,您仍然可以设置自定义WP\\U查询并在模板中创建自己的存档页,但主查询将不再这样做,对吗?)

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

SO网友:kierzniak

如果您想在前端完全禁用自定义post类型的单一视图,但能够显示归档页面,事情就变得有点复杂了。

背景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 post类型的永久链接结构创建简单的WordPress页面(event/simple-page) 这对复杂的网站很有帮助。

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

结束

相关推荐

custom single.php not working

在过去的一个小时里,我一直试图解决这个问题,但我不知道到底发生了什么。正在尝试创建single-blog.php (我有一些属于“博客”类别的帖子),但Wordpress会自动将这些帖子重定向到single。php!我把permalinks冲走了settings > permalink > save changes 但还是什么都没发生。测试(&A);看看Wordpress是否在单个博客上流行起来。php我使用的代码是:<?php get_header(); ?>