Enqueue Scripts and Styles on CPT Editor Page
I’ve finally(!) got around to using custom post types, and I’m having a blast. I really wish I had looked into them sooner, they are so cool. The possibilities really are endless, and boost the capabilities of WordPress significantly.
Anyway, this post is about an interesting problem I ran into whilst creating my first CPT (custom post type). The editor for the CPT in question is only ever going to be used to enter a couple of sentences, so it really only needs to have a small height. The default height is way to big and so the other meta boxes on this CPT are pushed down the page.
The solution? Well, it is fairly easy to add custom CSS that will target just the post.php or post-new.php pages in the WordPress admin. However this has the side effect of altering the post editor for ALL post types. Not great.
So, I spent some time looking for a reasonable way that I could enqueue styles that would work for specific CPT’s. After a bit of experimentation I came up with a solution that I could probably reuse. So I created a wrapper function for wp_enqueue_style() that you can use to pass your CPT name along with the usual enqueue parameters, and it will magically enqueue your style ONLY on the CPT editor page that you specify! Cool huh?
Right, let’s take a look at some code..
First off, let’s target the general admin editor pages to run a callback function when either the post.php or post-new.php are loaded. This is pretty standard stuff.
1 2 | add_action("load-post.php", array( &$this, 'custom_post_type_editor' ) ); add_action("load-post-new.php", array( &$this, 'custom_post_type_editor' ) ); |
The custom_post_type_editor() callback function is where we add the call to our enqueue function.
1 2 3 4 5 6 7 | function custom_post_type_editor() { $cpt = 'my_custom_post_type'; /* Custom post type. */ $handle = 'my_style'; $src = get_template_directory_uri().'/css/my_style.css'; wp_enqueue_admin_cpt_style( $cpt, $handle, $src ); } |
Aha! This isn’t the usual wp_enqueue_style() function. Like I said earlier, it is a wrapper function. We call the new enqueue function as you do the normal wp_enqueue_style() function, except you also pass in the CPT name as the first parameter. The CPT name is the same one that you specified in register_post_type(). The new enqueue function supports all the usual parameters plus the additional one for the CPT name you want to target.
OK, now for the good stuff. The all important new enqueue function.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public function wp_enqueue_admin_cpt_style( $cpt, $handle, $src = false, $deps = array(), $ver = false, $media = 'all' ) { /* Check the admin page we are on. */ global $pagenow; /* Default to null to prevent enqueuing. */ $enqueue = null; /* Enqueue style only if we are on the correct CPT editor page. */ if ( isset($_GET['post_type']) && $_GET['post_type'] == $cpt && $pagenow == "post-new.php" ) { $enqueue = true; } /* Enqueue style only if we are on the correct CPT editor page. */ if ( isset($_GET['post']) && $pagenow == "post.php" ) { $post_id = $_GET['post']; $post_obj = get_post( $post_id ); if( $post_obj->post_type == $cpt ) $enqueue = true; } /* Only enqueue if editor page is the correct CPT. */ if( $enqueue ) wp_enqueue_style( $handle, $src, $deps, $ver, $media ); } |
Let’s step through what this function does.
- Firstly, you will notice that you’ve got access to all the parameters available in the normal wp_enqueue_style() function. This is important for general use even though I am not using all the parameters in my particular CPT.
- Next we reference the global $pagenow variable to grab the current admin page we are on, and initialize an enqueue flag variable to null.
- This is followed by two tests for the admin page being viewed. The first test checks for new posts being created that are of a specific post type. If it finds a match with the one you passed in it sets the enqueue flag to true.
- The second test is slightly more tricky as we need to test the post ID of the post being edited on post.php and check it matches our CPT.
- If either test is successful the enqueue flag is set and our style sheet is enqueued ONLY on the post editor associated with our specified CPT!
Whilst I was at it I couldn’t do a wrapper function for wp_enqueue_style() and not do one for wp_enqueue_script()! So here is the equivalent function for enqueueing scripts on a specific CPT admin editor page.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public function wp_enqueue_admin_cpt_script( $cpt, $handle, $src = false, $deps = array(), $ver = false, $in_footer = false ) { /* Check the admin page we are on. */ global $pagenow; /* Default to null to prevent enqueuing. */ $enqueue = null; /* Enqueue script only if we are on the correct CPT editor page. */ if ( isset($_GET['post_type']) && $_GET['post_type'] == $cpt && $pagenow == "post-new.php" ) { $enqueue = true; } /* Enqueue script only if we are on the correct CPT editor page. */ if ( isset($_GET['post']) && $pagenow == "post.php" ) { $post_id = $_GET['post']; $post_obj = get_post( $post_id ); if( $post_obj->post_type == $cpt ) $enqueue = true; } /* Only enqueue if editor page is the correct CPT. */ if( $enqueue ) wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer); } |
Call this function in the same place as we did for wp_enqueue_admin_cpt_style() with:
1 | wp_enqueue_admin_cpt_script( $cpt, $handle, $src ); |
That’s it! I found these functions really useful and I know I will be re-using them again in the future. I hope you find a use for them too. Let me know in the comments if you do, I will be interested to hear.