Agregar una clase a la función body_class

4

Básicamente, he aplicado esta forma para mostrar ciertos colores en páginas como search.php o una lista en casa. Lo que hace es leer una variable que obtiene un campo de WP, si ese campo es igual a un número determinado, entonces agrega un nombre de clase que en CSS tiene un color Ahora el campo en una sola página está allí, aunque cada vez que agrego el 'si el sistema' que apliqué en las otras páginas no agrega la clase en el cuerpo en header.php. Ahora esto funciona correctamente en otras páginas (No globalmente sino individualmente) pero no aquí por alguna razón.

En el 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); ?>>

En otras páginas: $mem_id = get_field('memtype_id');

    
pregunta David H 07.05.2014 - 12:48

2 respuestas

4

En realidad, solo necesitas una devolución de llamada para el filtro body_class . Luego simplemente verifique qué correlación obtuvo entre sus metadatos y el valor real: si es una correlación 1: 1, puede agregar el resultado de get_field() como nueva clase de cuerpo. Ejemplo: array( get_field( 'mem_id' ) ) si el valor meta mem_id sería color3 para, por ejemplo. Si no, puede agregarlo como un argumento sprintf() y construir su clase como en el siguiente ejemplo. Tenga en cuenta para verificar si realmente obtuvo un valor y, de no ser así, establezca un valor predeterminado.

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

Esto es solo un ejemplo y seguramente puede ser mucho más sofisticado en la elaboración de una solución. Solo intente no vincularlo demasiado al valor real o al nombre del campo, ya que tales dependencias pueden convertirse rápidamente en una pesadilla de mantenimiento.

También tenga en cuenta que la única razón por la que usé get_field() del complemento "AdvancedCustomFields" ya que esta fue la etiqueta que se agregó originalmente a la pregunta. En real , WordPress sería get_post_meta() o get_post_custom() o similar (dependiendo de lo que está recuperando exactamente).

    
respondido por el kaiser 07.05.2014 - 13:47
0

Ya que está especificando la clase basada en un valor establecido en otro lugar, parece que puede haber establecido esta variable en otro archivo que no sea header.php , puede tener un problema de alcance. Recomiendo en su archivo functions.php crear un alcance global de su variable: global $mem_id; y luego asegurarse de que internaliza el alcance global en cada archivo que modifica o usa el valor.

También a primera vista, parece que lo que está tratando de lograr es lo que puede existir en un complemento ya enlace (don No se preocupe, no se ha actualizado en mucho tiempo, pero la lógica funciona bien para las versiones actuales de WordPress. Solo querrá echarle un vistazo.

    
respondido por el codearachnid 07.05.2014 - 13:44

Lea otras preguntas en las etiquetas