body_class filter – Is there a better way to write this code?

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
1

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.

Leave a Comment