-
-
Save cdils/6869728 to your computer and use it in GitHub Desktop.
| //* Add taxonomy term as body class to the header | |
| add_filter( 'body_class', 'cd_body_class' ); | |
| function cd_body_class( $classes ) { | |
| // Create array of terms within taxonomy named "group" | |
| $terms = get_the_terms( $post->ID , 'group' ); | |
| // If there are no terms, bail | |
| if ( $terms == null ) | |
| $return; | |
| // Loop through terms array and assign as body class | |
| foreach( $terms as $term ) { | |
| $classes[] = $term->slug; | |
| } | |
| return $classes; | |
| } |
Curtis - good point. In this case, I was using a single post template anyhow, so I added it directly. The code could be less-specific (i.e. don't name the taxonomy and dynamically grab it) for use outside the loop, yes?
A couple of things I'd point out. The $post variable is never declared as a global here. It works because calling get_post() without an ID automatically fetches the current global post object. Instead, you can use get_the_ID() or you can use get_post()->ID anywhere after a post has been set up and is all get_the_ID() really does anyways.
get_the_terms() won't ever return null. It should return an array, false, or a WP_Error object. In almost all cases, if you want to check to see if something is empty, use the empty() function instead. Here, though, you'd do something like:
if ( ! $terms || is_wp_error( $terms ) ) ...
Also, that return statement isn't quite right ;)
Nothing wrong with a foreach loop, but you could also use wp_list_pluck( $terms, 'slug' ) and merge the result with the original classes.
With that in mind, you could do something like this (untested!):
<?php
// Add taxonomy term as body class to the header.
function cd_body_class( $classes ) {
// Get an array of terms within the "group" taxonomy.
$terms = get_the_terms( get_the_ID() , 'group' );
// Bail if there are no terms.
if ( ! $terms || is_wp_error( $terms ) ) {
return $classes;
}
return array_merge( $classes, wp_list_pluck( $terms, 'slug' ) );
}
add_filter( 'body_class', 'cd_body_class' );Brady,
Thanks so much for the break down and explanation.
Question: Why does ! $terms accomplish the same thing as an empty() check in your example? Your code worked perfectly (and introduced me to two new WP functions).
As for that original return, well, I just like extra dollars. ;)
Thank you!
Carrie
No problem.
! $terms isn't the same as an empty() check (unless the value really is null), but if you look at the possible return values for get_the_terms(), they are array|bool|WP_Error. Looking at the function, it does its own check for an empty value and returns false, so you'll never receive an empty value. The ! $terms is just verifying that $terms isn't false.
Typically API functions should try to standardize their output and may do some error checking (and caching in this case) of their own to help keep your code a bit cleaner without having to check for more than a couple of response formats.
If figured as much regarding that return, who doesn't like extra dollars? Rather than just the return in a filter like this, you'd probably want to return the original $classes parameter so the existing body classes don't get blanked out.
Why would you put this code inside the loop and not use it in the theme functions.php file? I suppose that if you put it in the loop it means you don't need to have a conditional of
is_single()to make sure you're on a single post but that's about the only reason that I can think of.