Eliminar clases de body_class

28 abr 2011, 17:37:10
Vistas: 33.3K
Votos: 18

No necesito todo este desorden de clases como este...

<body class="page page-id-829 page-template page-template-page-template-portfolio-php portfolio">

Me gustaría algo como esto...

<body class="portfolio">

¿Existe algún fragmento de filtro que tenga una lista de todas las clases y que pueda simplemente descomentar las que no quiero ver en la clase body?

Gracias.

3
Comentarios

La verdadera pregunta es ¿por qué querrías hacer eso? Tener esas clases adicionales no importa en el gran esquema de las cosas, y es bueno tenerlas para estilos, si quieres referenciarlas más tarde.

Otto Otto
29 abr 2011 00:08:56

@Otto - puedo entenderlo completamente. Si vas a experimentar añadiendo clases en, por ejemplo, Firebug, entonces es realmente difícil manejar esto. FF a menudo tiene errores y el nombre de la clase que estás escribiendo sale del viewport. Yo mismo desactivo muchas clases de post y body durante el desarrollo - hace la vida más fácil.

kaiser kaiser
29 abr 2011 02:52:12

Ahh, sí, yo no uso Firebug. Su interfaz es deplorable.

Otto Otto
29 abr 2011 21:59:05
Todas las respuestas a la pregunta 9
0
33

Puedes configurar el array $whitelist en esta función para filtrar todas las demás clases no deseadas.

add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );

function wpse15850_body_class( $wp_classes, $extra_classes ) {

    // Lista de las únicas clases generadas por WP permitidas
    $whitelist = array( 'portfolio', 'home', 'error404' );

    // Filtra las clases del body
    $wp_classes = array_intersect( $wp_classes, $whitelist );

    // Añade las clases extra sin modificar
    return array_merge( $wp_classes, (array) $extra_classes );
}
28 abr 2011 23:31:53
4
17

Solo una adición a la respuesta de @Geert (también agregué una lista negra) :)

Por favor, sé tan amable de marcar la respuesta de @Geert como solución (no esta).

function wpse15850_body_class( $wp_classes, $extra_classes )
{
    // Lista de las únicas clases generadas por WP permitidas
    $whitelist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );

    // Lista de las únicas clases generadas por WP que no están permitidas
    $blacklist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );

    // Filtra las clases del body
    // Resultado de la lista blanca: (comenta si quieres usar lista negra)
    $wp_classes = array_intersect( $wp_classes, $whitelist );
    // Resultado de la lista negra: (descomenta si quieres usar lista negra)
    # $wp_classes = array_diff( $wp_classes, $blacklist );

    // Añade las clases extra sin modificar
    return array_merge( $wp_classes, (array) $extra_classes );
}
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );
29 abr 2011 05:14:25
Comentarios

Aunque es una solución que funciona muy bien, todavía encuentro que se agrega 'no-js' como una clase

henrywright henrywright
27 ene 2014 14:07:44

Con respecto a la clase no-js - creo que podría ser algo de BuddyPress. ¡Lo investigaré!

henrywright henrywright
27 ene 2014 14:36:58

no-js o similarmente js usualmente se manejan usando javascript/jquery, así que supongo que fue un script el que necesitarías quitar de la cola

Bryan Willis Bryan Willis
19 dic 2015 05:35:25

no-js será agregado por el servidor, pero eliminado con un script si se permite que JavaScript se ejecute en el navegador.

Davey Davey
30 abr 2019 11:10:11
2

Recomendaría simplemente omitir la etiqueta de plantilla <?php body_class(); ?> si no necesitas su salida.

Solo aplica class="portfolio" directamente en la etiqueta <body>.

28 abr 2011 17:59:14
Comentarios

si quieres alojar tu tema en el repositorio de wp.org, entonces no tienes esta opción (solo un comentario adicional).

kaiser kaiser
29 abr 2011 02:46:24

LOL, lo sé... He revisado uno o dos temas para el repositorio de WPORG. :) Aunque asumí por la pregunta que este tema es para uso personal, en lugar de una distribución pública general.

Chip Bennett Chip Bennett
29 abr 2011 03:51:44
0

Solo coloca las clases de tu CSS que deseas eliminar en $class_delete

add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );

function wpse15850_body_class( $wp_classes, $extra_classes ) {

    # Lista de clases a eliminar
    $class_delete = array('tag');

    # Verifica si existe la clase de WP en $class_delete
    foreach ($wp_classes as $class_css_key => $class_css) {
        if (in_array($class_css, $class_delete)) {
            unset($wp_classes[$class_css_key]);
        }
    }

    // Agrega las clases extra sin modificar
    return array_merge( $wp_classes, (array) $extra_classes );
}
11 ene 2017 02:21:11
0

Esto asignará a cada página una clase de body únicamente con 'portfolio'. El primer argumento es el array de clases de body generadas que normalmente aparecerían. El segundo argumento es un array de clases pasadas a la función body class (por ejemplo, body_class('portfolio'); haría que el segundo argumento en esta función fuera array( 'portfolio' )).

function wpse15850_body_classes( $classes, $class ){
    return array( 'portfolio' );
}

add_filter( 'body_class', 'wpse15850_body_classes', 10, 2 );
28 abr 2011 17:42:45
0
Prueba lo siguiente...

function var_template_include( $t ){
    $basename = basename($t);
    $templatename = substr($basename, 0,strrpos($basename,'.')); 
    $GLOBALS['current_theme_template'] = $templatename;

    return $t;
}
add_filter( 'template_include', 'var_template_include', 1000 );


function current_template( $echo = false ) {
    if( !isset( $GLOBALS['current_theme_template'] ) ) {
        return false;
    } if( $echo ) {
        echo $GLOBALS['current_theme_template'];
    } else {
        return  $GLOBALS['current_theme_template'];
    }   
}

function body_template_as_class() {
echo 'class="'.current_template().'"';
}
29 abr 2011 05:38:28
2

Si solo deseas eliminar una clase específica de la etiqueta body, deberías hacer esto:


add_filter('body_class', 'remove_body_class', 20, 2);

function remove_body_class($wp_classes) {
    foreach($wp_classes as $key => $value)
        {
            if ($value == 'portfolio') unset($wp_classes[$key]); //  Reemplaza "portfolio" y lo elimina
        }

    return $wp_classes;
}
7 feb 2018 10:15:20
Comentarios

Esta debería ser la respuesta correcta y aceptada, es sencilla y funciona muy bien.

Jodyshop Jodyshop
22 sept 2021 09:58:10

¿qué podemos usar para eliminar una clase del elemento Row?

tushonline tushonline
14 dic 2024 15:01:34
1
function alpha_remove_class($wp_classes){
  // Elimina la clase "first_class" del array de clases
  unset( $wp_classes[ array_search( "first_class", $wp_classes ) ] );

  return $wp_classes;
}
// Añade el filtro para modificar las clases del body
add_filter( 'body_class', 'alpha_remove_class' );
5 sept 2018 22:53:52
Comentarios

¡Bienvenido a WordPress Stack Exchange! ¿Podrías por favor editar tu respuesta, usando el enlace de edición de arriba y explicar qué hace este código, dónde pondrías este código y en qué se diferencia o es mejor que cualquiera de las respuestas publicadas anteriormente? Las respuestas que solo contienen código generalmente se desaconsejan sin ninguna explicación.

Howdy_McGee Howdy_McGee
6 sept 2018 00:34:01
0

Si bien las soluciones anteriores me permitieron armar algo que funcionaba en el caso donde las clases se agregaban a través de body_class(), tuve otra situación en la que ninguna de ellas funcionó porque las clases se agregaban mediante JavaScript.

Además, solo necesitaba eliminar las clases en páginas específicas y no podía hacer esto modificando o sobrescribiendo el JS sin potencialmente afectar otras páginas.

Para resolver esto, agregué lo siguiente al functions.php del tema hijo...

<?php 
// eliminar clases del body que no se agregaron a través de la función wp body_class()
// solución con jQuery
function cbc_manage_body_classes() { 
    $to_remove = '';
    if (is_shop()) { $to_remove .= 'class_one class_two'; }
    
    if ( ! empty($to_remove)) {
?>
        <script type="text/javascript">
            jQuery(document).ready(function(){ jQuery("body").removeClass('<?php echo $to_remove; ?>'); }); 
        </script>
<?php 
    }
}
add_action('wp_footer','cbc_manage_body_classes', 99);

La solución anterior con jQuery funcionó perfectamente para mi caso de uso. Para aquellos que necesitan/quieran una solución solo con JavaScript, armé esto...

<?php 
// eliminar clases del body que no se agregaron a través de la función wp body_class()
// Solución solo con JavaScript
function cbc_manage_body_classes() { 
    $to_remove = '';
    if (is_shop()) { $to_remove .= 'class_one class_two'; }
    
    if ( ! empty($to_remove)) {
?>
        <script type="text/javascript">
            window.onload = function() { 
                // inspiración de: https://stackoverflow.com/questions/784012/javascript-equivalent-of-phps-in-array
                function cbcInArray(needle, haystack) {
                    var length = haystack.length;
                    for(var i = 0; i < length; i++) { if(haystack[i] == needle) return true; }
                    return false;
                }

                // inspiración de: https://stackoverflow.com/questions/13505253/how-to-remove-the-class-in-javascript
                function cbcRemoveClass( elem, name ) {
                    var classlist = elem.className.split( /\s/ ), 
                        namelist = name.split( /\s/ ), 
                        newlist = [], 
                        idx = 0;
                    
                    for ( ; idx < classlist.length; idx++ ) {
                        if ( ! cbcInArray(classlist[ idx ], namelist) ) { newlist.push( classlist[ idx ] ); }
                    }
                    elem.className = newlist.join(" ");
                    return true;
                }
                
                cbcRemoveClass(document.getElementsByTagName("body")[0], '<?php echo $to_remove; ?>');
            };
        </script>
<?php 
    }
}
add_action('wp_footer','cbc_manage_body_classes', 99);
?>

Y para compartir, aquí está lo que armé para el caso de uso de body_class() usando las ideas de quienes publicaron antes que yo.

La principal diferencia de este código VS los fragmentos publicados es que este código permite listas blancas y listas negras al mismo tiempo.

En el caso para el que construí esto, necesitaba restringir las clases del body a un conjunto específico globalmente y luego eliminar otras en páginas específicas.

<?php
// inspirado por: https://wordpress.stackexchange.com/questions/15850/remove-classes-from-body-class
function cbc_body_class_filter( $wp_classes, $extra_classes ) {
    // combinar $wp_classes y $extra_classes para que todas las clases estén sujetas al filtrado
    $classes = array_merge( $wp_classes, (array) $extra_classes );
    
    // inicializar listas de clases (no) permitidas
    $whitelist = $blacklist = array();
    
    // bloquear/eliminar clases del body en la página de tienda de WC
    // este bloque puede repetirse para diferentes páginas
    if (is_shop()) { // is_page('PAGE SLUG/NAME/ID')) { 
        $blacklisted = array('class-one', 'class-two');
        $blacklist = array_merge($blacklist, $blacklisted); 
    }

    // filtrar las clases del body a través de las listas
    // al filtrar primero la lista blanca podemos crear una lista blanca "maestra" y luego eliminar otras clases página por página
    if ( ! empty($whitelist)) { $classes = array_intersect( $classes, $whitelist ); }
    if ( ! empty($blacklist)) { $classes = array_diff( $classes, $blacklist ); }
    
    return $classes;
}
add_filter( 'body_class', 'cbc_body_class_filter', 99, 2 );
?>
4 abr 2021 01:01:09