I would like to add a body class depending on what sidebars are active, and a body class if my before-header widget area is active. I have got it to work, but I would just like to know if there is a better way to write it as my before header widget area function
for some reason needs to be above my sidebar function
, otherwise my sidebar function
doesn’t work if my before header widget area function
is active. So I’m sure there is some bad practice code in there somewhere.
Here is the working one:
// add body class if before-header-widget is active
add_filter( 'body_class', 'body_class_before_header' );
function body_class_before_header( $classes ) {
if ( is_active_sidebar( 'before-header-widget-area' ) ) {
$classes[] = 'before-header';
return $classes;
}
}
// add body classes for sidebars
add_filter( 'body_class', 'body_class_layouts' );
function body_class_layouts( $classes ) {
// add body class if both sidebars are active
if ( is_active_sidebar( 'sidebar-right' ) && is_active_sidebar( 'sidebar-left' ) ) {
$classes[] = 'sidebar-content-sidebar';
return $classes;
}
// add body class for if right sidebar is active
elseif ( is_active_sidebar( 'sidebar-right' ) ) {
$classes[] = 'content-sidebar';
return $classes;
}
// add body class for if left sidebar is active
elseif ( is_active_sidebar( 'sidebar-left' ) ) {
$classes[] = 'sidebar-content';
return $classes;
}
// add body class if no sidebars are active
else {
$classes[] = 'full-width-content';
return $classes;
}
}
But if I simply swap the functions the other way:
// add body classes for Sidebars
add_filter( 'body_class', 'body_class_layouts' );
function body_class_layouts( $classes ) {
// add body class if both sidebars are active
if ( is_active_sidebar( 'sidebar-right' ) && is_active_sidebar( 'sidebar-left' ) ) {
$classes[] = 'sidebar-content-sidebar';
return $classes;
}
// add body class for if right sidebar is active
elseif ( is_active_sidebar( 'sidebar-right' ) ) {
$classes[] = 'content-sidebar';
return $classes;
}
// add body class for if left sidebar is active
elseif ( is_active_sidebar( 'sidebar-left' ) ) {
$classes[] = 'sidebar-content';
return $classes;
}
// add body class if no sidebars are active
else {
$classes[] = 'full-width-content';
return $classes;
}
}
// add body class if before-header-widget is active
add_filter( 'body_class', 'body_class_before_header' );
function body_class_before_header( $classes ) {
if ( is_active_sidebar( 'before-header-widget-area' ) ) {
$classes[] = 'before-header';
return $classes;
}
}
None of my active layout sidebar classes will go into the body tag if the before-header-widget
is active. I don’t want my sidebars function
to have anything to do with my before-header-widget
function. Any help appreciated.
1 Answer
I don’t think that there is a much smarter way to write this code in a procedural style, so basically your code looks okay.
But there’s a logic error in your body_class_before_header()
function which might cause the issue: If the conditional block is not executed, the function will return NULL
but as it is a callback on a filter it should always return at least the unfiltered parameter value:
// add body class if before-header-widget is active
add_filter( 'body_class', 'body_class_before_header' );
function body_class_before_header( $classes ) {
if ( is_active_sidebar( 'before-header-widget-area' ) ) {
$classes[] = 'before-header';
//don't return here (only)
}
//return $classes anyway
return $classes;
}
There’s one more small syntax improvement, maybe.
function body_class_layouts( $classes ) {
// add body class if both sidebars are active
if ( is_active_sidebar( 'sidebar-right' ) && is_active_sidebar( 'sidebar-left' ) ) {
$classes[] = 'sidebar-content-sidebar';
}
// add body class for if right sidebar is active
elseif ( is_active_sidebar( 'sidebar-right' ) ) {
$classes[] = 'content-sidebar';
}
// add body class for if left sidebar is active
elseif ( is_active_sidebar( 'sidebar-left' ) ) {
$classes[] = 'sidebar-content';
}
// add body class if no sidebars are active
else {
$classes[] = 'full-width-content';
}
return $classes;
}
I removed all the return
statements from the conditional blocks and moved it to the end of the function. This might help to avoid a NULL
return under certain conditions.