Rimuovere le classi da body_class

28 apr 2011, 17:37:10
Visualizzazioni: 33.3K
Voti: 18

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.

3
Commenti

La vera domanda è: perché vorresti farlo? Avere quelle classi extra non ha importanza nel grande schema delle cose, ed è utile averle per lo stile, se vuoi farvi riferimento in seguito.

Otto Otto
29 apr 2011 00:08:56

@Otto - posso capirlo perfettamente. Se vuoi sperimentare aggiungendo classi, ad esempio in Firebug, diventa davvero difficile gestirlo. FF è spesso pieno di bug e il nome della classe che stai scrivendo esce dalla viewport. Anch'io disattivo molte classi post e body durante lo sviluppo - rende la vita più semplice.

kaiser kaiser
29 apr 2011 02:52:12

Ah, sì, io non uso Firebug. La sua interfaccia è pessima.

Otto Otto
29 apr 2011 21:59:05
Tutte le risposte alla domanda 9
0
33

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

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

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

henrywright henrywright
27 gen 2014 14:07:44

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

henrywright henrywright
27 gen 2014 14:36:58

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

Bryan Willis Bryan Willis
19 dic 2015 05:35:25

no-js verrà aggiunto dal server, ma rimosso con uno script se javascript è consentito l'esecuzione sul browser.

Davey Davey
30 apr 2019 11:10:11
2

Consiglierei semplicemente di omettere il tag template <?php body_class(); ?>, se non hai bisogno del suo output.

Basta applicare class="portfolio" direttamente nel tag <body>.

28 apr 2011 17:59:14
Commenti

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

kaiser kaiser
29 apr 2011 02:46:24

LOL, lo so... Ho revisionato uno o due temi per il repository WPORG. :) Ho dedotto dalla domanda, però, che questo tema è per uso personale, piuttosto che per una distribuzione pubblica generale.

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

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

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

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

Questa dovrebbe essere la risposta corretta e accettata, semplice e funziona perfettamente.

Jodyshop Jodyshop
22 set 2021 09:58:10

cosa possiamo usare per rimuovere una classe dall'elemento Row?

tushonline tushonline
14 dic 2024 15:01:34
1
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' );
5 set 2018 22:53:52
Commenti

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.

Howdy_McGee Howdy_McGee
6 set 2018 00:34:01
0

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