How to detect custom post type inside admin_init hook callback?

Or should I use different hook? Mainly I’m trying to perform some actions only when in admin and only for some of custom posts.

Related posts

Leave a Reply

2 comments

  1. This method is an easy one:

    /**
     * Based on http://wordpress.stackexchange.com/a/59999/12615
     */
    
    add_action( 'admin_head', 'wpse_59652_list_terms_exclusions' );
    
    function wpse_59652_list_terms_exclusions() {
        global $current_screen;
    
        if( 'post' != $current_screen->post_type )
            return;
    
        // Do your stuff
    }
    

    Another:

    /**
     * Based on http://wordpress.stackexchange.com/a/54279/12615
     */
    
    add_action( 'admin_notices', 'wpse_54258_display_error_message' );
    
    function wpse_54258_display_error_message() { 
        global $post;
        if( !isset( $post ) || 'page' != $post->post_type )
            return;
    
        ?>
            <div class="error fade">This is a "page" post type</div>
        <?php
    }
    

    And a complex one:

    /***
      * Conditional enqueue of scripts according to Admin page
     * Based on http://wordpress.stackexchange.com/a/9095/12615
     */
    
    add_action('admin_init', 'wpse_9080_admin_init');
    
    function wpse_9080_admin_init() {
        global $pagenow;
        global $firephp; // Using FirePHP for debugging - Remove if library not included
        if ( 'edit.php' == $pagenow) {
            if ( !isset($_GET['post_type']) ) {
                $firephp->log('I am the Posts listings page');  
            }
            elseif ( isset($_GET['post_type']) && 'page' == $_GET['post_type'] ) {
                // Will occur only in this screen: /wp-admin/edit.php?post_type=page
                $firephp->log('I am the Pages listings page');  
            }
        }
        if ('post.php' == $pagenow && isset($_GET['post']) ) {
            // Will occur only in this kind of screen: /wp-admin/post.php?post=285&action=edit
            // and it can be a Post, a Page or a CPT
            $post_type = get_post_type($_GET['post']);
            $firephp->log($post_type);
            if ( 'post' == $post_type ) {
                $firephp->log('I am editing a post');   
            }
            elseif ( 'page' == $post_type) {
                $firephp->log('I am editing a page');   
            }
            elseif ( 'movie' == $post_type) {
                $firephp->log('I am editing a custom post type');   
            }
        }
    
        if ('post-new.php' == $pagenow ) {
            // Will occur only in this kind of screen: /wp-admin/post-new.php
            // or: /wp-admin/post-new.php?post_type=page
            if ( !isset($_GET['post_type']) ) {
                $firephp->log('I am creating a new post');  
            }
            elseif ( isset($_GET['post_type']) && 'page' == $_GET['post_type'] ) {
                $firephp->log('I am creating a new page');  
            }
            elseif ( isset($_GET['post_type']) && 'movie' == $_GET['post_type'] ) {
                $firephp->log('I am creating a new custom post type');  
            }
        }   
    }
    
  2. Here is one function what you can use it with no problems.

    function admin_post_type () {
        global $post, $parent_file, $typenow, $current_screen, $pagenow;
    
        $post_type = NULL;
    
        if($post && (property_exists($post, 'post_type') || method_exists($post, 'post_type')))
            $post_type = $post->post_type;
    
        if(empty($post_type) && !empty($current_screen) && (property_exists($current_screen, 'post_type') || method_exists($current_screen, 'post_type')) && !empty($current_screen->post_type))
            $post_type = $current_screen->post_type;
    
        if(empty($post_type) && !empty($typenow))
            $post_type = $typenow;
    
        if(empty($post_type) && function_exists('get_current_screen'))
            $post_type = get_current_screen();
    
        if(empty($post_type) && isset($_REQUEST['post']) && !empty($_REQUEST['post']) && function_exists('get_post_type') && $get_post_type = get_post_type((int)$_REQUEST['post']))
            $post_type = $get_post_type;
    
        if(empty($post_type) && isset($_REQUEST['post_type']) && !empty($_REQUEST['post_type']))
            $post_type = sanitize_key($_REQUEST['post_type']);
    
        if(empty($post_type) && 'edit.php' == $pagenow)
            $post_type = 'post';
    
        return $post_type;
    }
    

    I made it to be flexibile, fast and accurate. You can expand it by your needs.