web-dev-qa-db-fra.com

Ajout d'une classe à la fonction body_class

Fondamentalement, j'ai appliqué cette méthode pour afficher certaines couleurs sur des pages telles que search.php ou une liste à la maison. Qu'est-ce qu'il fait est qu'il lit une variable qui obtient un champ de WP, si ce champ est égal à un certain nombre puis il ajoute un nom de classe qui en CSS a une couleur Maintenant, le champ sur une seule page est là, mais chaque fois que j'ajoute le 'si système' que j'ai appliqué sur les autres pages n'ajoute pas la classe dans le corps de header.php. Maintenant, cela fonctionne correctement sur d'autres pages (pas globalement mais individuellement) mais pas ici pour une raison quelconque.

Sur le header.php:

<?php
    //Body class
    if($mem_id == 1)          { $class =  'color1';    }
    if($mem_id == 2)          { $class =  'color2';    }         
    if($mem_id == 3)          { $class =  'color3';    }
    if($mem_id == 4)          { $class =  'color4';    }
    if($mem_id == 5)          { $class =  'color5';    }
    if($mem_id == 6)          { $class =  'color6';    }
    if($mem_id == 7)          { $class =  'color7';    }
    if($mem_id == 8)          { $class =  'color8';    }
    if($mem_id == 9)          { $class =  'color9';    }
?>
<body <?php body_class($class); ?>>

Dans d'autres pages: $mem_id = get_field('memtype_id');

4
David H

En fait, vous avez simplement besoin d’un rappel pour le filtre body_class. Ensuite, vérifiez simplement quelle corrélation vous avez établie entre vos métadonnées et la valeur réelle: S'il s'agit d'une corrélation 1: 1, vous pouvez simplement ajouter le résultat de get_field() comme nouvelle classe de corps. Exemple: array( get_field( 'mem_id' ) ) si la méta-valeur mem_id serait color3 pour ex. Sinon, vous pouvez l'ajouter en tant qu'argument sprintf() et build votre classe, comme dans l'exemple ci-dessous. N'oubliez pas de vérifier si vous avez réellement obtenu une valeur et si ce n'est pas le cas, définissez une valeur par défaut.

add_filter( 'body_class', function ( $wp, $extra )
{
    return array_merge( $wp, (array) $extra, array(
        sprintf(
            'color%s',
            "" !== get_field( 'membertype_id' )
                ? get_field( 'membertype_id' )
                : "1" // default
        ),
        # additional declarations here
    ) );
}, 20, 2 );

Ceci est juste un exemple et vous pouvez sûrement être beaucoup plus sophistiqué dans l'élaboration d'une solution. Essayez simplement de ne pas le lier trop fort à la valeur réelle ou au nom du champ car de telles dépendances peuvent rapidement devenir un cauchemar de maintenance.

N'oubliez pas non plus que la seule raison pour laquelle j'ai utilisé get_field() à partir du plug-in "AdvancedCustomFields", car il s'agissait de la balise initialement ajoutée à la question. Dans real WordPress, il s'agirait de get_post_meta() ou get_post_custom() ou similaire (selon ce que vous récupérez exactement).

4
kaiser

Puisque vous spécifiez la classe en fonction d'une valeur définie ailleurs, il semble que vous ayez peut-être défini cette variable dans un autre fichier. header.php est peut-être lié à un problème de portée. Dans votre fichier functions.php, je vous recommande de créer une étendue globale de votre variable: global $mem_id;, puis de vous assurer que vous internalisez l'étendue globale dans chaque fichier que vous modifiez ou utilisez la valeur.

De plus, à première vue, il semble que ce que vous essayez de faire existe déjà dans un plugin http://wordpress.org/plugins/custom-classes/ (ne vous inquiétez pas, il n'a pas été mis à jour mais la logique fonctionne bien pour les versions actuelles de WordPress). Juste envie de vérifier.

0
codearachnid