Title: Understanding the  body_class() function
Last modified: September 1, 2016

---

# Understanding the body_class() function

 *  [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/)
 * I need help! I am trying to figure out where the “**body_class()**” function 
   gets its list of classes. I’m using it on one of the sites I manage. It returns
   a list of classes but one of the classes in the list should not be there; it 
   completely botches-up the entire page (it seems to be an unrecognized class).
   In other words, if the call to “body_class()” returns a body tag that looks like
   this:
 * <**body** class=”archive category category-games category-events”>
 * …and the “**category**” class should not be present, how do I find out why the“**
   category**” class is in the list?
 * (note: I know this can be “fixed” by removing the class with “add_filter()” -
   and I’ve done that temporarily- but I’d like to understand why body_class() is
   returning an incorrect class in the list.)

Viewing 14 replies - 1 through 14 (of 14 total)

 *  Moderator [Steven Stern (sterndata)](https://wordpress.org/support/users/sterndata/)
 * (@sterndata)
 * Volunteer Forum Moderator
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621270)
 * install the plugin “show current template” to find out if a category template
   is, in fact, being used.
 *  Thread Starter [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621278)
 * Thank you Steve…
    So I installed “show current template” and I see that on the
   page with this problem, archive.php is the template being used. When I look at
   my “archive.php” I do not see the “category” class being used.
 *  So now what?
 *  [Michael](https://wordpress.org/support/users/alchymyth/)
 * (@alchymyth)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621280)
 * see
    [https://developer.wordpress.org/reference/functions/body_class/](https://developer.wordpress.org/reference/functions/body_class/)
   and [https://developer.wordpress.org/reference/functions/get_body_class/](https://developer.wordpress.org/reference/functions/get_body_class/)
 * the problem comes generally from the theme or from a plugin that is using CSS
   classes which are from `body_class()`.
 * you can influence, i.e. remove a class from, the output of `body_class()` via
   a filter;
    there is a general example in [https://developer.wordpress.org/reference/functions/body_class/](https://developer.wordpress.org/reference/functions/body_class/);
   example 3 under ‘user contributed notes’
 *  Thread Starter [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621284)
 * Yes, I saw all those pages and – as mentioned in the original post – I already
   implemented the workaround of removing a class from body_class() but would prefer
   to get to the bottom of how this function decides which classes to include in
   the list.
 *  Moderator [Steven Stern (sterndata)](https://wordpress.org/support/users/sterndata/)
 * (@sterndata)
 * Volunteer Forum Moderator
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621287)
 * What is the URL of the page? If you’re listing a category and there is no category.
   php, then WP falls back to archive.php
 * see [http://wphierarchy.com](http://wphierarchy.com)
 *  Thread Starter [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621294)
 * Hmmm… That wphierarchy reference is very helpful…
    Yes, there is no category.
   php…
 * So it turns out that the theme’s index.php – which is used to display the front
   page – does include a section with “category” class …there are links on the front
   page so that the user can click on a category to see all posts in that category.
   But then when the user clicks on a specific category, they are taken to a page
   that is output by archive.php and on that page there is really no reference to“
   category” class at all (but there is a **rel=”category”** attribute in the hyperlink
   for each category in the list of categories associated with each post). But the
   call to “body_class()” outputs the “category” class nevertheless (the call itself
   is in header.php and the first line of archive.php includes it with a call to“
   get_header()” ).
 *  [Michael](https://wordpress.org/support/users/alchymyth/)
 * (@alchymyth)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621300)
 * > how this function decides which classes to include in the list.
 * the source code is listed in [https://developer.wordpress.org/reference/functions/get_body_class/](https://developer.wordpress.org/reference/functions/get_body_class/)
 * scroll down to **Source#**; then click ‘Expand full source code’
 * > it turns out that the theme’s index.php – which is used to display the front
   > page – does include a section with “category” class
 * this CSS class will probable also be used in the stylesheet; possibly not specific
   enough to that one section.
 * what theme are you using?
 *  Thread Starter [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621307)
 * The theme is an end-of-life’d one that was once popular: Arthemia “Free” …I’ve
   added customizations to it.
 * What’s rather strange about all this is that I”m using the same theme on other
   sites and only two of them are exhibiting this behavior. The only unique shared
   characteristic I can find about those two sites is that they are the only ones
   to which I have added custom-background functionality (ie: in functions.php).
   But when I comment-out the custom-background code, the problem doesn’t go away(
   even after disabling and re-enabling the theme).
 *  Thread Starter [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621311)
 * **Correction:**
    On the other sites using the same theme – that don’t exhibit
   this behavior, I’m not calling the body_class() function at all in the header.
   php for those sites. I suppose I put in the call to body_class() only on two 
   sites where I was adding custom-background …and so on both of them the call to
   body_class is adding the “category” class to the list of classes. And looking
   at the code in post-template.php, I see:
 *     ```
       } elseif ( is_archive() ) {
               if ( is_post_type_archive() ) {
                   $classes[] = 'post-type-archive';
                   $post_type = get_query_var( 'post_type' );
                   if ( is_array( $post_type ) )
                       $post_type = reset( $post_type );
                   $classes[] = 'post-type-archive-' . sanitize_html_class( $post_type );
               } elseif ( is_author() ) {
                   $author = $wp_query->get_queried_object();
                   $classes[] = 'author';
                   if ( isset( $author->user_nicename ) ) {
                       $classes[] = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );
                       $classes[] = 'author-' . $author->ID;
                   }
               } elseif ( is_category() ) {
                   $cat = $wp_query->get_queried_object();
                   $classes[] = 'category';
       ```
   
 * So in my case it would seem that it’s adding the ‘category’ class because is_archive()
   is TRUE and (probably) is_category() is true! (haven’t yet tested/verified this
   to be 100% certain)
 * Not sure why that makes sense …I suppose that for a fix perhaps I don’t have 
   much choice other than to do what I’ve already done (remove the “category” class
   with **add_filter()** ).
 *  Thread Starter [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621392)
 * Unless I’m missing something, this seems like a WordPress Bug to me…
 * It seems that the body_class() function makes assumptions about CSS Classes that
   the user has defined and that these assumptions are not properly documented. 
   Apparently, if is_archive() is TRUE and is_category() is TRUE then the user’s
   styles.css must contain a suitable definition of a “category” class. But there
   is no mention of this in the [wordpress page about the function](https://developer.wordpress.org/reference/functions/body_class/).
 * Essentially, this seems to be a case of **undocumented hardcoding** – “category”
   class is hardcoded into the function without any mention in the documentation
   page. (is it at least documented elsewhere?)
 *  [esmi](https://wordpress.org/support/users/esmi/)
 * (@esmi)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621393)
 * > Unless I’m missing something, this seems like a WordPress Bug to me…
 * Not a bug as far as I can see…
 * > It seems that the body_class() function makes assumptions about CSS Classes
   > that the user has defined and that these assumptions are not properly documented.
   > Apparently, if is_archive() is TRUE and is_category() is TRUE then the user’s
   > styles.css must contain a suitable definition of a “category” class.
 * There are absolutely no assumptions made. The body_class() simply adds a whole
   range of _potentially useful_ classes to the body tag depending upon what template
   is being used.
 * > But there is no mention of this in the wordpress page about the function.
 * Agreed but I believe that this may have been a conscious decision as the list
   was becoming rather long. If the `category` class is causing problems for you
   on archive pages, why not just use `.archive.category` to overwrite the problematic
   CSS?
 *  Thread Starter [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621395)
 * Hello Esmi …thank you for chiming in here! I was hoping you would comment because
   you clearly know the right answer.
 * Yes, overwriting the CSS seems like the proper solution.
 * From my perspective, it seems that it would be helpful to mention your statement
   in the documentation for the function: “The body_class() simply adds a whole 
   range of potentially useful classes to the body tag depending upon what template
   is being used”.
 * Thanks again. I think your advice resolves it!
 *  [esmi](https://wordpress.org/support/users/esmi/)
 * (@esmi)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621397)
 * Unfortunately, I’m not currently an active member of the WordPress Documentation
   team but you could bring this up with the team at [https://make.wordpress.org/docs/](https://make.wordpress.org/docs/)
 *  Thread Starter [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * (@patrick_here)
 * [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621443)
 * Glad I’ve finally been able to get the bottom of this problem. It turns out that
   when I added custom-background support to two of my sites, I was following the
   advice of some posts on the web that recommended the use of the body_class() 
   function for custom-background.
 * For anyone reading this thread who is adding custom-background to an existing
   website, I would strongly advise against the use of body_class() for this purpose.
   I fixed the problem by simply hardcoding my <body> tag (in header.php) like this:
 * **<body class=”custom-background”>**
 * …that’s all that’s needed to make custom-background work on an existing theme–
   and then there’s zero danger of breaking existing code. The body_class() function
   might be fine for developers developing a new theme or new website but for an
   existing site with existing CSS, I think body_class() is an invitation to disaster(
   unless you are a CSS expert …with lots of spare time). It’s too easy to break
   existing functionality with the body_class() function on a running site that 
   was developed without it.
 * (But Esmi if you feel differently about it I’d be interested to hear what you
   have to say).

Viewing 14 replies - 1 through 14 (of 14 total)

The topic ‘Understanding the body_class() function’ is closed to new replies.

 * In: [Fixing WordPress](https://wordpress.org/support/forum/how-to-and-troubleshooting/)
 * 14 replies
 * 4 participants
 * Last reply from: [patrick_here](https://wordpress.org/support/users/patrick_here/)
 * Last activity: [9 years, 9 months ago](https://wordpress.org/support/topic/understanding-the-body_class-function/#post-7621443)
 * Status: not resolved

## Topics

### Topics with no replies

### Non-support topics

### Resolved topics

### Unresolved topics

### All topics
