从BODY_CLASS中删除类

时间:2011-04-28 作者:agileapricot

我不需要像这样乱七八糟的课程。。。

<body class="page page-id-829 page-template page-template-page-template-portfolio-php portfolio">

我想要这样的东西。。。

<body class="portfolio">

是否有一个过滤器片段,其中包含所有类的列表,然后我可以取消对body类中不想看到的内容的注释。

谢谢

9 个回复
最合适的回答,由SO网友:Geert 整理而成

您可以配置$whitelist 数组来过滤掉所有其他不需要的类。

add_filter( \'body_class\', \'wpse15850_body_class\', 10, 2 );

function wpse15850_body_class( $wp_classes, $extra_classes ) {

    // List of the only WP generated classes allowed
    $whitelist = array( \'portfolio\', \'home\', \'error404\' );

    // Filter the body classes
    $wp_classes = array_intersect( $wp_classes, $whitelist );

    // Add the extra classes back untouched
    return array_merge( $wp_classes, (array) $extra_classes );
}

SO网友:kaiser

只是对@Geert answer的一个补充(也添加了一个黑名单):)

请将@Geert的答案标记为解决方案(不是这个)。

function wpse15850_body_class( $wp_classes, $extra_classes )
{
    // List of the only WP generated classes allowed
    $whitelist = array( \'home\', \'blog\', \'archive\', \'single\', \'category\', \'tag\', \'error404\', \'logged-in\', \'admin-bar\' );

    // List of the only WP generated classes that are not allowed
    $blacklist = array( \'home\', \'blog\', \'archive\', \'single\', \'category\', \'tag\', \'error404\', \'logged-in\', \'admin-bar\' );

    // Filter the body classes
    // Whitelist result: (comment if you want to blacklist classes)
    $wp_classes = array_intersect( $wp_classes, $whitelist );
    // Blacklist result: (uncomment if you want to blacklist classes)
    # $wp_classes = array_diff( $wp_classes, $blacklist );

    // Add the extra classes back untouched
    return array_merge( $wp_classes, (array) $extra_classes );
}
add_filter( \'body_class\', \'wpse15850_body_class\', 10, 2 );

SO网友:Chip Bennett

我建议只省略<?php body_class(); ?> 模板标记,如果您不需要其输出。

仅应用class="portfolio" 硬编码到<body> 标签

SO网友:Bryan Contreras

只需将要删除的css类放入$class\\u delete中即可

add_filter( \'body_class\', \'wpse15850_body_class\', 10, 2 );

function wpse15850_body_class( $wp_classes, $extra_classes ) {

    # List tag to delete
    $class_delete = array(\'tag\');

    # Verify if exist the class of 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]);
        }
    }

    // Add the extra classes back untouched
    return array_merge( $wp_classes, (array) $extra_classes );
}

SO网友:John P Bloch

这将为每个页面提供一个只包含“portfolio”的主体类。第一个参数是通常会出现的生成的body类的数组。第二个参数是传递给body类函数的类数组(例如。body_class(\'portfolio\'); 将在此函数中生成第二个参数array( \'portfolio\' ) ).

function wpse15850_body_classes( $classes, $class ){
    return array( \'portfolio\' );
}

add_filter( \'body_class\', \'wpse15850_body_classes\', 10, 2 );

SO网友:Wok
Try the following...

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().\'"\';
}
SO网友:Nices Wölkchen

如果只想从body标记中删除特定类,则应执行以下操作:

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]); //  Replaces "portfolio" and removes it
        }

    return $wp_classes;
}

SO网友:saifulislam
function alpha_remove_class($wp_classes){
  unset( $wp_classes[ array_search( "first_class", $wp_classes ) ] );

  return $wp_classes;
}
add_filter( \'body_class\', \'alpha_remove_class\' );
SO网友:CurtisN

虽然上面的解决方案使我能够在通过body\\u class()添加类的情况下将一些有用的东西组合在一起,但我遇到了另一种情况,因为这些类是通过JavaScript添加的,所以它们都不起作用。

此外,我只需要删除特定页面上的类,无法通过修改或重写JS来完成这一操作,而不会影响其他页面。

为了解决这个问题,我在函数中添加了以下内容。子主题的php。。。

<?php 
// remove body classes not added through the wp body_class() function
// jQuery solution
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);
上述jQuery解决方案对我的用例非常有效。对于那些需要/想要一个纯JavaScript解决方案的人,我将其放在一起。。。

<?php 
// remove body classes not added through the wp body_class() function
// Javascript only solution
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() { 
                // inspiration from: 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;
                }

                // inspiration from: 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);
?>
为了与大家分享,下面是我为body\\u class()用例所做的工作,使用了我之前发布的想法。

此代码与发布的snips的主要区别在于,此代码同时启用白名单和黑名单。

在我为构建这个的情况下,我需要将body类全局限制为特定的集,然后删除特定页面上的其他类。

<?php
//inpsired by: https://wordpress.stackexchange.com/questions/15850/remove-classes-from-body-class
function cbc_body_class_filter( $wp_classes, $extra_classes ) {
    // merge $wp_classes and $extra_classes so all classes are subjected to the filtering
    $classes = array_merge( $wp_classes, (array) $extra_classes );
    
    // init list(s) of classes (not)allowed
    $whitelist = $blacklist = array();
    
    // block/remove body classes on wc shop page
    // this block can be repeated for different pages
    if (is_shop()) { // is_page(\'PAGE SLUG/NAME/ID\')) { 
        $blacklisted = array(\'class-one\', \'class-two\');
        $blacklist = array_merge($blacklist, $blacklisted); 
    }

    // filter the body classes through the lists
    // by filtering the whitelist first we can create a "master" whitelist and then remove other classes on a page by page basis
    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 );
?>

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴