How do test if a post is a custom post type?

by Adam Thompson   Last Updated June 10, 2019 12:08 PM

I am looking for a way to test if a post is a custom post type. For example, in, say, the sidebar I can put in code like this:

 if ( is_single() ) {
     // Code here
 }

I want code testing for only a custom post type.



Answers 6


Here you are: get_post_type() and then if ( 'book' == get_post_type() ) ... as per Conditional Tags > A Post Type in Codex.

Szymon Skulimowski
Szymon Skulimowski
January 11, 2011 17:12 PM

For anyone else looking for this, add this to your functions.php and you can have the functionality, inside or outside of the loop:

function is_post_type($type){
    global $wp_query;
    if($type == get_post_type($wp_query->post->ID)) return true;
    return false;
}

so you can now use the following:

if (is_single() && is_post_type('post_type')){
  //work magic
}
Mild Fuzz
Mild Fuzz
July 06, 2011 13:41 PM

if ( is_singular( 'book' ) ) {
    // conditional content/code
}

The above is true when viewing a post of the custom post type: book.

if ( is_singular( array( 'newspaper', 'book' ) ) ) {
    //  conditional content/code
}

The above is true when viewing a post of the custom post types: newspaper or book.

These and more conditional tags can be viewed here.

Mark Rummel
Mark Rummel
June 12, 2012 16:41 PM

If for any reason you already have access to the global variable $post, you can simply use

if ($post->post_type == "your desired post type") {
}
ino
ino
February 01, 2013 21:30 PM

To test if a post is any custom post type, fetch the list of all not built-in post types and test if the post’s type is in that list.

As a function:

/**
 * Check if a post is a custom post type.
 * @param  mixed $post Post object or ID
 * @return boolean
 */
function is_custom_post_type( $post = NULL )
{
    $all_custom_post_types = get_post_types( array ( '_builtin' => FALSE ) );

    // there are no custom post types
    if ( empty ( $all_custom_post_types ) )
        return FALSE;

    $custom_types      = array_keys( $all_custom_post_types );
    $current_post_type = get_post_type( $post );

    // could not detect current type
    if ( ! $current_post_type )
        return FALSE;

    return in_array( $current_post_type, $custom_types );
}

Usage:

if ( is_custom_post_type() )
    print 'This is a custom post type!';
fuxia
fuxia
April 15, 2013 15:22 PM

If you want a wild card check for all your custom post types:

if( ! is_singular( array('page', 'attachment', 'post') ) ){
    // echo 'Imma custom post type!';
}

This way you don't need to know the name of your custom post. Also the code still work even if you change the name of your custom post later.

kosinix
kosinix
January 30, 2014 03:52 AM

Related Questions



BuddyPress User Profile Menu

Updated February 26, 2017 15:08 PM


Multidimensional Array

Updated December 05, 2016 08:03 AM