Admin Body Class – Everything You Need To Know

In a recent project, I needed to add some styles for a specific admin page in WordPress. It is easy to enqueue a CSS file for a targeted admin page using the magic of current admin screen object, but it’s not too easy if you want to use only 1 CSS file for all admin pages and still be able to style a particular page. Think about the style.css of a theme, it generally is the only CSS file we have in the frontend, but we can style a targeted post, page or homepage using body class. We can do the same for the admin because WordPress also uses body class for admin pages and provides us a filter to add, remove or change admin body classes.

What admin body classes available by default?

Not like the frontend, where we have to add body_class() function to <body> tag, it’s not required us to do anything in the backend. WordPress automatically adds classes for us (it sounds obviously because we can’t change admin files).

Looks at the code of admin-header.php, we know what classes are available. I won’t post that piece of code here because you can see it yourself. I summarize all classes available in the list below:

  • $hook_suffix
  • folded
  • auto-fold
  • admin-bar
  • rtl
  • branch-$wp_version
  • version-$wp_version
  • admin-color-$scheme
  • locale-$locale
  • mobile
  • no-customize-support

Note: PHP variables in the list are sanitized, I put them in raw format to easy to understand.

And here is the code WordPress use to display admin body classes:

<body class="wp-admin wp-core-ui no-js <?php echo apply_filters( 'admin_body_class', '' ) . " $admin_body_class"; ?>">

In my opinion, all of these classes are not useful for us, except the first one: $hook_suffix which tells us about the current page. If you want to find what $hook_suffix is for your current admin page, try my Inspector plugin.

How to use admin body class to style a particular admin page?

Assume that we want to style the Add New/Edit Post page: highlight the title field. To make everything clear, I will make a small plugin to do this.

1. Enqueue the CSS file for admin

As I said above, we use only 1 CSS file for all admin pages, so we’ll do like this (put this in the main PHP file of the plugin):

add_action( 'admin_enqueue_scripts', 'rw_add_admin_style' );
function rw_add_admin_style()
{
    wp_enqueue_style( 'rw-admin-style', plugins_url( 'admin-style.css', __FILE__ ) );
}

2. Add CSS for targeted page

We’ll use the $hook_suffix to get the body classes of the page we want to style. In this case, they’re .post-new-php (for Add New page) and .post-php (for Edit page) (note again: class = $hook_suffix sanitized). Knowing the body classes, our CSS is straight forward (put it in the admin-style.css in the plugin folder):

.post-new-php #titlediv #title,
.post-php #titlediv #title {
    border: 2px solid #f33;
    background: #ff9;
}

After doing this, activate the plugin and you’ll see this:

lWRSst3 Admin Body Class   Everything You Need To Know

You can grab the full plugin here.

How to add body classes in WordPress admin

As mentioned above, the list of admin body classes is not useful for users. They’re made for something like responsive admin in WordPress, or detecting handheld devices. At the point of view of users, we need better classes to style pages.

In the example above, we know how to style the Add New page. But what we did will be applied to all custom post types. Now you want to do that for only tutorial post type (for ex.), what will you do? You’re going to add more classes to body!

WordPress uses a filter admin_body_class to let us add more classes to the admin body. The default value of this filter is empty string which means no additional classes. We want to add post type to admin body classes, so we’ll do this:

add_filter( 'admin_body_class', 'rw_admin_body_class' );
function rw_admin_body_class( $classes )
{
    $screen = get_current_screen();
    if ( 'post' == $screen->base )
        $classes .= ' ' . $screen->post_type;
    return $classes;
}

It’s worth noting that the admin_body_class accepts a string as an argument, not like body_class in the front end which accepts an array.

Here I use the current screen object to make sure we’re on the Add New / Edit Post page. This is a simple application of the screen object that I wrote about in another post: How to get admin screen information.

Now, we can change our CSS to style only tutorial post type:

.post-new-php.tutorial #titlediv #title,
.post-php.tutorial #titlediv #title {
    border: 2px solid #f33;
    background: #ff9;
}

Other applications

Style posts in specific category

To do that, we’re going add categories to body classes:

add_filter( 'admin_body_class', 'rw_admin_body_class' );
function rw_admin_body_class( $classes )
{
    if ( 'post' != $screen->base )
        return $classes;

    global $post;
    $cats = wp_get_post_categories( $post->ID, array( 'fields' => 'all' ) );
    $cats = wp_list_pluck( $cats, 'slug' );
    foreach ( $cats as $cat )
    {
        $classes .= ' category-' . $cat;
    }

    return $classes;
}

Now you have category-$slug as a class name

Style posts which have specific term

Similar to the example above, we’ll add terms to body classes:

add_filter( 'admin_body_class', 'rw_admin_body_class' );
function rw_admin_body_class( $classes )
{
    if ( 'post' != $screen->base )
        return $classes;

    global $post;
    $terms = wp_get_post_terms( $post->ID, 'my_taxonomy', array( 'fields' => 'all' ) );
    $terms = wp_list_pluck( $terms, 'slug' );
    foreach ( $terms as $term )
    {
        $classes .= ' my_taxonomy-' . $term;
    }

    return $classes;
}

Now you have my_taxonomy-$slug as a class name.

Style custom post types differently in All Posts page

For different post types, you may want to add more columns to All Posts page like thumbnails, excerpt, custom meta, etc. Thus, changing column width is needed and admin body class is useful then. You might find it useful if you want to style with different colors / font size for text, links, background etc.

So, we can add custom post type to body class to indicate which post type we have on that page:

add_filter( 'admin_body_class', 'rw_admin_body_class' );
function rw_admin_body_class( $classes )
{
    $screen = get_current_screen();
    if ( 'edit' == $screen->base )
        $classes .= ' ' . $screen->post_type;
    return $classes;
}

Now you can style with CSS:

.edit-php.{$post_type} some_selectors {
    // Anything here
}

Conclusion

The examples above partially reveal the useful applications of admin body classes. You can customize body classes using screen object as I shown above or using global $post or any of $_POST, $_GET variables. That means there’s no limit adding custom classes to body tag in WordPress admin. Thus, styling or customizing admin pages is now easy with just one CSS file!

1 Comment

  1. Nice idea. You could also split it into logical files and load a file where the name depends on some part of the $current_screen object. For e.g.: style-edit.css.

    Reply

Leave a Reply