Rimuovere le classi da body_class
Non ho bisogno di tutto questo insieme di classi come questo...
<body class="page page-id-829 page-template page-template-page-template-portfolio-php portfolio">
Vorrei qualcosa del genere...
<body class="portfolio">
Esiste un filtro da qualche parte che ha una lista di tutte le classi e dove posso semplicemente decommentare quelle che non voglio vedere nella classe body.
Grazie.

Puoi configurare l'array $whitelist
in questa funzione per filtrare tutte le altre classi indesiderate.
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );
function wpse15850_body_class( $wp_classes, $extra_classes ) {
// Lista delle sole classi generate da WP consentite
$whitelist = array( 'portfolio', 'home', 'error404' );
// Filtra le classi del body
$wp_classes = array_intersect( $wp_classes, $whitelist );
// Aggiungi le classi extra così come sono
return array_merge( $wp_classes, (array) $extra_classes );
}

Solo un'aggiunta alla risposta di @Geert (ho incluso anche una blacklist) :)
Per favore, siate così gentili da segnare la risposta di @Geert come soluzione (non questa).
function wpse15850_body_class( $wp_classes, $extra_classes )
{
// Lista delle sole classi generate da WP consentite
$whitelist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );
// Lista delle sole classi generate da WP non consentite
$blacklist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );
// Filtra le classi del body
// Risultato whitelist: (commenta se vuoi usare la blacklist)
$wp_classes = array_intersect( $wp_classes, $whitelist );
// Risultato blacklist: (decommenta se vuoi usare la blacklist)
# $wp_classes = array_diff( $wp_classes, $blacklist );
// Aggiunge le classi extra intatte
return array_merge( $wp_classes, (array) $extra_classes );
}
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );

Sebbene sia una soluzione molto efficace, noto che viene ancora aggiunta la classe 'no-js'

Riguardo alla classe no-js - penso possa essere qualcosa legato a BuddyPress. Indagherò!

no-js
o simili come js
vengono solitamente gestiti con javascript/jquery, quindi presumo che fosse uno script che dovresti rimuovere dalla coda

se vuoi ospitare il tuo tema nel repository di wp.org, allora non hai questa scelta (solo una nota a margine).

Inserisci semplicemente le classi CSS che vuoi rimuovere in $class_delete
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );
function wpse15850_body_class( $wp_classes, $extra_classes ) {
# Lista delle classi da eliminare
$class_delete = array('tag');
# Verifica se esiste la classe di 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]);
}
}
// Aggiunge le classi extra senza modifiche
return array_merge( $wp_classes, (array) $extra_classes );
}

Questo assegnerà ad ogni pagina una classe body di soltanto 'portfolio'. Il primo argomento è l'array delle classi body generate che normalmente apparirebbero. Il secondo argomento è un array di classi passate alla funzione body class (ad esempio body_class('portfolio');
farebbe sì che il secondo argomento in questa funzione sia array( 'portfolio' )
).
function wpse15850_body_classes( $classes, $class ){
return array( 'portfolio' );
}
add_filter( 'body_class', 'wpse15850_body_classes', 10, 2 );

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

Se vuoi rimuovere una classe specifica dal tag body, dovresti fare così:
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]); // Sostituisce "portfolio" e lo rimuove } return $wp_classes; }

function alpha_remove_class($wp_classes){
// Rimuove la classe "first_class" dall'array delle classi del body
unset( $wp_classes[ array_search( "first_class", $wp_classes ) ] );
return $wp_classes;
}
// Aggiunge il filtro per modificare le classi del body
add_filter( 'body_class', 'alpha_remove_class' );

Benvenuto su WordPress Stack Exchange! Potresti per favore modificare la tua risposta, utilizzando il link di modifica in alto e spiegare cosa fa questo codice, dove metteresti questo codice e in cosa è diverso o migliore rispetto alle risposte già pubblicate? Le risposte che contengono solo codice sono generalmente scoraggiate senza alcuna spiegazione.

Mentre le soluzioni sopra mi hanno permesso di mettere insieme qualcosa che funzionasse nel caso in cui le classi venissero aggiunte tramite body_class(), ho avuto un'altra situazione in cui nessuna di esse ha funzionato perché le classi venivano aggiunte da JavaScript.
Inoltre, avevo bisogno di rimuovere le classi solo su pagine specifiche e non potevo farlo modificando o sovrascrivendo il JS senza potenzialmente impattare altre pagine.
Per risolvere questo, ho aggiunto quanto segue al functions.php del child theme...
<?php
// rimuove le classi body non aggiunte tramite la funzione wp body_class()
// soluzione 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 soluzione jQuery sopra ha funzionato perfettamente per il mio caso d'uso. Per chi ha bisogno/vuole una soluzione solo in JavaScript, ho messo insieme questo...
<?php
// rimuove le classi body non aggiunte tramite la funzione wp body_class()
// soluzione solo 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() {
// ispirazione da: 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;
}
// ispirazione da: 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);
?>
E per condividere, ecco cosa ho messo insieme per il caso d'uso di body_class() utilizzando le idee di chi ha postato prima di me.
La differenza principale tra questo codice e gli snippet postati è che questo codice permette sia whitelisting che blacklisting contemporaneamente.
Nel caso per cui ho creato questo codice, avevo bisogno di limitare le classi body a un set specifico globalmente e poi rimuoverne altre su pagine specifiche.
<?php
//ispirato da: https://wordpress.stackexchange.com/questions/15850/remove-classes-from-body-class
function cbc_body_class_filter( $wp_classes, $extra_classes ) {
// unisce $wp_classes e $extra_classes così tutte le classi sono soggette al filtraggio
$classes = array_merge( $wp_classes, (array) $extra_classes );
// inizializza le liste di classi (non)permesse
$whitelist = $blacklist = array();
// blocca/rimuove classi body nella pagina shop di wc
// questo blocco può essere ripetuto per pagine diverse
if (is_shop()) { // is_page('SLUG/NOME/ID PAGINA')) {
$blacklisted = array('class-one', 'class-two');
$blacklist = array_merge($blacklist, $blacklisted);
}
// filtra le classi body attraverso le liste
// filtrando prima la whitelist possiamo creare una whitelist "master" e poi rimuovere altre classi pagina per pagina
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 );
?>
