Elimină clasele din body_class
Nu am nevoie de toată această dezordine de clase precum...
<body class="page page-id-829 page-template page-template-page-template-portfolio-php portfolio">
Aș dori ceva de genul...
<body class="portfolio">
Există vreun snippet de filtru undeva care are o listă cu toate clasele și pot să decomentez doar lucrurile pe care nu vreau să le văd în clasa body?
Mulțumesc.

Puteți configura array-ul $whitelist
în această funcție pentru a filtra toate celelalte clase nedorite.
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );
function wpse15850_body_class( $wp_classes, $extra_classes ) {
// Lista cu singurele clase generate de WP permise
$whitelist = array( 'portfolio', 'home', 'error404' );
// Filtrează clasele body
$wp_classes = array_intersect( $wp_classes, $whitelist );
// Adaugă clasele extra înapoi nemodificate
return array_merge( $wp_classes, (array) $extra_classes );
}

Doar o completare la răspunsul lui @Geert (am adăugat și o listă neagră) :)
Vă rog să fiți amabili și să marcați răspunsul lui @Geert ca soluție (nu pe acesta).
function wpse15850_body_class( $wp_classes, $extra_classes )
{
// Lista cu singurele clase generate de WP permise
$whitelist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );
// Lista cu singurele clase generate de WP care nu sunt permise
$blacklist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );
// Filtrează clasele body
// Rezultat whitelist: (comentează dacă vrei să folosești blacklist)
$wp_classes = array_intersect( $wp_classes, $whitelist );
// Rezultat blacklist: (decomentează dacă vrei să folosești blacklist)
# $wp_classes = array_diff( $wp_classes, $blacklist );
// Adaugă clasele extra nemodificate
return array_merge( $wp_classes, (array) $extra_classes );
}
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );

Deși este o soluție de lucru foarte bună, încă găsesc că 'no-js' este adăugat ca clasă

Referitor la clasa no-js - cred că ar putea fi legat de BuddyPress. Voi investiga!

no-js
sau similar js
sunt de obicei gestionate folosind javascript/jquery, așa că presupun că a fost un script pe care ar fi trebuit să-l dezactivezi

dacă dorești să-ți găzduiești tema în depozitul wp.org, atunci nu ai această opțiune (doar o observație).

Pur și simplu plasează clasele CSS pe care dorești să le elimini în variabila $class_delete
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );
function wpse15850_body_class( $wp_classes, $extra_classes ) {
# Listă de clase de șters
$class_delete = array('tag');
# Verifică dacă există clasa WP în $class_delete
foreach ($wp_classes as $class_css_key => $class_css) {
if (in_array($class_css, $class_delete)) {
unset($wp_classes[$class_css_key]);
}
}
// Adaugă clasele extra nemodificate
return array_merge( $wp_classes, (array) $extra_classes );
}

Acest cod va oferi fiecărei pagini o clasă body doar 'portfolio'. Primul argument este array-ul claselor de body generate care ar apărea în mod normal. Al doilea argument este un array de clase transmise funcției body class (de exemplu, body_class('portfolio');
ar face ca al doilea argument din această funcție să fie array( 'portfolio' )
).
function wpse15850_body_classes( $classes, $class ){
return array( 'portfolio' );
}
add_filter( 'body_class', 'wpse15850_body_classes', 10, 2 );

Încearcă următoarele...
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().'"';
}

Dacă dorești să elimini o clasă specifică din tag-ul body, ar trebui să faci asta:
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]); // Înlocuiește "portfolio" și îl elimină
}
return $wp_classes;
}

function alpha_remove_class($wp_classes){
// Elimină clasa 'first_class' din array-ul de clase
unset( $wp_classes[ array_search( "first_class", $wp_classes ) ] );
return $wp_classes;
}
// Adaugă filtrul pentru clasele body în WordPress
add_filter( 'body_class', 'alpha_remove_class' );

Bine ați venit pe WordPress Stack Exchange! Vă rugăm să editați răspunsul dumneavoastră, folosind linkul de editare de mai sus și să explicați ce face acest cod, unde ați pune acest cod și cum este diferit sau mai bun decât oricare dintre răspunsurile postate anterior. Răspunsurile care conțin doar cod sunt de obicei descurajate fără nicio explicație.

În timp ce soluțiile de mai sus mi-au permis să asamblez ceva care a funcționat în cazul în care clasele erau adăugate prin body_class(), am avut o altă situație în care niciuna dintre ele nu a funcționat deloc, deoarece clasele erau adăugate prin JavaScript.
În plus, aveam nevoie să elimin clasele doar pe anumite pagini și nu puteam face acest lucru prin modificarea sau suprascrierea JS-ului fără a afecta potențial alte pagini.
Pentru a rezolva această problemă, am adăugat următoarele în fișierul functions.php al temei copil...
<?php
// elimină clasele de body care nu sunt adăugate prin funcția wp body_class()
// soluție 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);
Soluția jQuery de mai sus a funcționat perfect pentru cazul meu de utilizare. Pentru cei care au nevoie/doresc o soluție doar în JavaScript, am creat următoarele...
<?php
// elimină clasele de body care nu sunt adăugate prin funcția wp body_class()
// soluție doar în 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() {
// inspirație din: 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;
}
// inspirație din: 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);
?>
Și pentru a împărtăși, iată ce am creat pentru cazul de utilizare al body_class() folosind ideile celor care au postat înaintea mea.
Diferența principală dintre acest cod și fragmentele postate este că acest cod permite atât whitelisting, cât și blacklisting în același timp.
În cazul pentru care am construit acest cod, aveam nevoie să restricționez clasele de body la un set specific global și apoi să elimin altele pe pagini specifice.
<?php
// inspirat de: https://wordpress.stackexchange.com/questions/15850/remove-classes-from-body-class
function cbc_body_class_filter( $wp_classes, $extra_classes ) {
// combină $wp_classes și $extra_classes, astfel încât toate clasele să fie supuse filtrării
$classes = array_merge( $wp_classes, (array) $extra_classes );
// inițializează lista(ele) de clase permise/interzise
$whitelist = $blacklist = array();
// blochează/elimină clasele de body pe pagina de magazin wc
// acest bloc poate fi repetat pentru diferite pagini
if (is_shop()) { // is_page('PAGE SLUG/NAME/ID')) {
$blacklisted = array('class-one', 'class-two');
$blacklist = array_merge($blacklist, $blacklisted);
}
// filtrează clasele de body prin liste
// prin filtrarea whitelist-ului mai întâi, putem crea un whitelist "principal" și apoi elimina alte clase pe bază de pagină
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 );
?>
