WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I created a custom post type:

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

How can i disable the single post view for this specific post type? Displaying a simple 404 is fine, or redirecting to the homepage. This is inside a plugin, so i can't create a single-sample_post_type.php file to setup an empty page.

share|improve this question
up vote 15 down vote accepted

You can use template_redirect hook to redirect for a custom post type, you can use any other URL you want to in place of home_url() and the error code in other argument.

<?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;
  }
}
?>
share|improve this answer
    
A good solution. I found it was helpful to only perform this redirect for non-authenticated users, by checking to see if get_current_user_id() evaluates to 0. – RevNoah Jun 29 '15 at 13:25
    
Good to know :) – sven Jun 30 '15 at 2:11

Just setting the argument

'publicly_queryable'  => false

when you call register_post_type()

share|improve this answer
    
This looks like the answer to stop your CPT from creating actual web pages while still creating all database references. – BenRacicot Sep 17 '15 at 18:11
    
I prefer this method. – LBF Jan 14 at 17:11
    
This is a much better solution – doitlikejustin Mar 17 at 22:50

A simpler way to do that can be passing the following args when registering the Custom Post Type

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
));
share|improve this answer
1  
You would actually need publically_querable to be true for Post Type Archives to work. – Howdy_McGee Nov 12 '14 at 19:42
    
This does not work for me. It justs redirects back to the homepage when trying to go to the archive – Yahya Uddin Jul 15 '15 at 15:51

One. From your functions file.

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. From your single.cpt.php file:

<?php wp_redirect( home_url() ); exit; ?>
share|improve this answer

Working from of Sven's really good answer, I rewrote his function to make it easier to add multiple post types using in_array() in the if statement and then redirecting to the archive page instead of the home page.

(by the way, I think the setting query_var and/or publically_queryable to false will disable not only the single views, but also the native archive view, overriding 'has_archive' => true. In that case you can still set up a custom WP_query and create your own archive page, in a template, but the main query won't do that any more, will it?)

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' );
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.