body_class()

body_class() añade un atributo class al elemento <body> con clases dinámicas que WordPress genera según el contexto: tipo de página, ID del post, categoría, si el usuario está logueado, etc.

Uso básico

<!-- En header.php -->
<body <?php body_class(); ?>>

Clases que genera automáticamente

// Tipo de página
.home          → portada
.blog          → página del blog
.archive       → páginas de archivo (categoría, fecha, autor)
.single        → post individual
.page          → página estática
.search        → resultados de búsqueda
.error404      → página 404
.attachment    → página de adjunto

// Contenido específico
.single-post          → post de tipo 'post'
.single-producto      → post de tipo 'producto' (CPT)
.page-id-42           → página con ID 42
.page-template-contacto → plantilla 'contacto'
.category-tecnologia  → categoría 'tecnología'

// Usuario
.logged-in      → usuario autenticado
.admin-bar      → si se muestra la barra de admin

Añadir clases personalizadas

// Directamente en la llamada
<body <?php body_class( 'tema-oscuro layout-ancho' ); ?>>

// Via filter para lógica condicional
add_filter( 'body_class', 'mis_clases_body' );
function mis_clases_body( $classes ) {

    // Añadir clase si es un producto destacado
    if ( is_singular('producto') ) {
        $destacado = get_post_meta( get_the_ID(), '_destacado', true );
        if ( $destacado ) {
            $classes[] = 'producto-destacado';
        }
    }

    // Eliminar una clase que no quieres
    $classes = array_diff( $classes, [ 'clase-a-eliminar' ] );

    return $classes;
}

Uso en CSS

/* Estilos específicos por contexto */
.single-producto .entry-title { font-size: 2rem; }
.logged-in .precio-especial { display: block; }
.error404 .site-content { text-align: center; }