Elimină clasele din body_class

28 apr. 2011, 17:37:10
Vizualizări: 33.3K
Voturi: 18

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.

3
Comentarii

Întrebarea reală este de ce ai vrea să faci asta? Acele clase suplimentare nu contează în marele schemă al lucrurilor și este bine să le ai pentru stilizare, dacă vrei să le referențiezi mai târziu.

Otto Otto
29 apr. 2011 00:08:56

@Otto - te înțeleg perfect. Dacă te joci cu adăugarea de clase în, de exemplu, Firebug, atunci devine foarte greu de gestionat. FF este adesea buggy și numele clasei pe care îl scrii iese din viewport. Dezactivez multe clase post- și body în timpul dezvoltării - asta îmi face viața mai ușoară.

kaiser kaiser
29 apr. 2011 02:52:12

Aha, da, eu nu folosesc Firebug. Interfața lui este deplorabilă.

Otto Otto
29 apr. 2011 21:59:05
Toate răspunsurile la întrebare 9
0
33

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 );
}
28 apr. 2011 23:31:53
4
17

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 );
29 apr. 2011 05:14:25
Comentarii

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

henrywright henrywright
27 ian. 2014 14:07:44

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

henrywright henrywright
27 ian. 2014 14:36:58

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

Bryan Willis Bryan Willis
19 dec. 2015 05:35:25

no-js va fi adăugat de server, dar eliminat cu un script dacă javascript are permisiunea să ruleze în browser.

Davey Davey
30 apr. 2019 11:10:11
2

Aș recomanda pur și simplu să omiți tag-ul de șablon <?php body_class(); ?>, dacă nu ai nevoie de output-ul său.

Poți aplica direct class="portfolio" codat direct în tag-ul <body>.

28 apr. 2011 17:59:14
Comentarii

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

kaiser kaiser
29 apr. 2011 02:46:24

LOL, știu... Am revizuit una sau două teme pentru depozitarul WPORG. :) Am presupus, însă, din întrebare, că această temă este pentru uz personal, mai degrabă decât pentru distribuție publică generală.

Chip Bennett Chip Bennett
29 apr. 2011 03:51:44
0

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 );
}
11 ian. 2017 02:21:11
0

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 );
28 apr. 2011 17:42:45
0
Î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().'"';
}
29 apr. 2011 05:38:28
2

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;
}
7 feb. 2018 10:15:20
Comentarii

Acesta ar trebui să fie răspunsul corect și acceptat, simplu și funcționează excelent.

Jodyshop Jodyshop
22 sept. 2021 09:58:10

ce putem folosi pentru a elimina o clasă din elementul Row?

tushonline tushonline
14 dec. 2024 15:01:34
1
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' );
5 sept. 2018 22:53:52
Comentarii

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.

Howdy_McGee Howdy_McGee
6 sept. 2018 00:34:01
0

Î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 );
?>
4 apr. 2021 01:01:09