Eliminar clases de body_class
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.

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

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

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

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

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

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

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

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

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().'"';
}

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

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

¡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.

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