Eliminar clases de body_class

17

No necesito todo este lío de clases como esta ...

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

Me gustaría algo como esto ...

<body class="portfolio">

¿Hay algún fragmento de filtro en alguna parte que tenga una lista de todas las clases y luego puedo descomentar las cosas que no quiero ver en la clase de cuerpo?

Gracias.

albaricoque
fuente
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 diseñar, si quieres hacer referencia a ellas más adelante.
Otto
3
@Otto: puedo entenderlo completamente. Si vas a jugar agregando clases en eg. Firebug, entonces es realmente difícil manejar esto. FF suele tener errores y el nombre de clase que está escribiendo fuera de la ventana gráfica. Apago muchas clases de post y body durante el desarrollo, me facilita la vida.
kaiser
Ahh, sí, no uso Firebug. Su interfaz es deplorable.
Otto

Respuestas:

31

Puede configurar la $whitelistmatriz 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 ) {

    // List of the only WP generated classes allowed
    $whitelist = array( 'portfolio', 'home', 'error404' );

    // Filter the body classes
    $wp_classes = array_intersect( $wp_classes, $whitelist );

    // Add the extra classes back untouched
    return array_merge( $wp_classes, (array) $extra_classes );
}
Geert
fuente
15

Solo una adición a @Geert answer (también agregó una lista negra) :)

Sea tan amable de marcar la respuesta de @Geert como solución (no esta).

function wpse15850_body_class( $wp_classes, $extra_classes )
{
    // List of the only WP generated classes allowed
    $whitelist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );

    // List of the only WP generated classes that are not allowed
    $blacklist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );

    // Filter the body classes
    // Whitelist result: (comment if you want to blacklist classes)
    $wp_classes = array_intersect( $wp_classes, $whitelist );
    // Blacklist result: (uncomment if you want to blacklist classes)
    # $wp_classes = array_diff( $wp_classes, $blacklist );

    // Add the extra classes back untouched
    return array_merge( $wp_classes, (array) $extra_classes );
}
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );
emperador
fuente
Aunque es una muy buena solución de trabajo, todavía encuentro que 'no-js' se agrega como clase
henrywright
1
Con respecto a la clase no-js, creo que podría ser una cosa de BuddyPress. Voy a investigar!
henrywright
1
no-jso de la misma manera js, usualmente se manejan usando javascript / jquery, así que supongo que era un script que tendrías que quitar de la cola
Bryan Willis
no-jsserá agregado por el servidor, pero se eliminará con un script si se permite que JavaScript se ejecute en el navegador.
Davey
4

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

Simplemente aplique class="portfolio"codificado en la <body>etiqueta.

Chip Bennett
fuente
si desea alojar su tema en el repositorio de wp.org, entonces no tiene esta opción (solo una nota al margen).
kaiser
1
LOL, lo sé ... He revisado uno o dos temas para el repositorio WPORG. :) Supuse por la pregunta, sin embargo, que este Tema es para uso personal, en lugar de distribución pública general.
Chip Bennett
2

Simplemente coloque las clases de su css que desea eliminar en $ class_delete

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

function wpse15850_body_class( $wp_classes, $extra_classes ) {

    # List tag to delete
    $class_delete = array('tag');

    # Verify if exist the class of WP in $class_delete
    foreach ($wp_classes as $class_css_key => $class_css) {
        if (in_array($class_css, $class_delete)) {
            unset($wp_classes[$class_css_key]);
        }
    }

    // Add the extra classes back untouched
    return array_merge( $wp_classes, (array) $extra_classes );
}
Bryan Contreras
fuente
1

Esto le dará a cada página una clase de cuerpo de solo 'portafolio'. El primer argumento es la matriz de clases de cuerpo generadas que normalmente aparecerían. El segundo argumento es una matriz de clases pasadas a la función de clase del cuerpo (por ejemplo body_class('portfolio');, haría el segundo argumento en esta función array( 'portfolio' )).

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

add_filter( 'body_class', 'wpse15850_body_classes', 10, 2 );
John P Bloch
fuente
1
Try the following...

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().'"';
}
Wok
fuente
1
function alpha_remove_class($wp_classes){
  unset( $wp_classes[ array_search( "first_class", $wp_classes ) ] );

  return $wp_classes;
}
add_filter( 'body_class', 'alpha_remove_class' );
saifulislam
fuente
¡Bienvenido a WordPress Stack Exchange! ¿Podría editar su respuesta , utilizando el enlace de edición anterior y explicar qué hace este código, dónde colocaría este código y cómo es diferente o mejor que cualquiera de las respuestas publicadas anteriormente? Las respuestas de solo código generalmente se desaconsejan sin ninguna explicación.
Howdy_McGee
0

Si solo desea eliminar una clase específica de la etiqueta del cuerpo, debe hacer esto:

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

función remove_body_class ($ wp_classes) {
    foreach ($ wp_classes como $ key => $ value)
        {
            if ($ value == 'portfolio') unset ($ wp_classes [$ key]); // Reemplaza "portafolio" y lo elimina
        }

    return $ wp_classes;
}
Nices Wölkchen
fuente