web-dev-qa-db-fra.com

body_class filter - Existe-t-il un meilleur moyen d'écrire ce code?

J'aimerais ajouter une classe de corps en fonction des barres latérales actives et une classe de corps si la zone du widget avant-en-tête est active. Je veux que cela fonctionne, mais j'aimerais simplement savoir s'il existe un meilleur moyen de l'écrire car mon before header widget area function doit, pour une raison quelconque, être supérieur à mon sidebar function, sinon mon sidebar function ne fonctionne pas si mon before header widget area function est actif. Donc, je suis sûr qu'il y a un mauvais code de pratique quelque part.

Voici celui qui fonctionne:

// 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;
    }
}

Mais si j'échange simplement les fonctions dans l'autre sens:

 // 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;
        } 
    }

Aucune de mes classes de barre latérale de mise en page active n'ira dans la balise body si le before-header-widget est actif. Je ne veux pas que mon sidebars function ait quelque chose à voir avec ma fonction before-header-widget. Toute aide appréciée.

1
user3438958

Je ne pense pas qu'il existe un moyen beaucoup plus intelligent d'écrire ce code dans un style procédural, votre code a donc l'air d'accord.

Mais il y a une erreur de logique dans votre fonction body_class_before_header() qui pourrait être à l'origine du problème: Si le bloc conditionnel n'est pas exécuté, la fonction retournera NULL mais comme il s'agit d'un rappel sur un filtre il doit toujours renvoyer au moins la valeur du paramètre non filtré:

// 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;
}

Il y a peut-être une autre petite amélioration syntaxique.

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;
}

J'ai supprimé toutes les instructions return des blocs conditionnels et les ai déplacées à la fin de la fonction. Cela pourrait aider à éviter un retour NULL dans certaines conditions.

2
David