Удаление классов из body_class

28 апр. 2011 г., 17:37:10
Просмотры: 33.3K
Голосов: 18

Мне не нужна вся эта мешанина классов, как здесь...

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

Я бы хотел что-то вроде этого...

<body class="portfolio">

Есть ли где-нибудь фильтр со списком всех классов, где я мог бы просто закомментировать те, которые не хочу видеть в классе body?

Спасибо.

3
Комментарии

Настоящий вопрос в том, зачем вам это нужно? Эти дополнительные классы не имеют большого значения в общей картине, и их наличие удобно для стилизации, если вы захотите обратиться к ним позже.

Otto Otto
29 апр. 2011 г. 00:08:56

@Otto - я полностью понимаю его/её. Если вы собираетесь экспериментировать с добавлением классов, например, в Firebug, то это действительно сложно контролировать. FF часто глючит, и имя класса выходит за пределы видимой области. Я сам отключаю множество классов постов и body во время разработки — это упрощает жизнь.

kaiser kaiser
29 апр. 2011 г. 02:52:12

Ах, да, я не пользуюсь Firebug. Его интерфейс просто ужасен.

Otto Otto
29 апр. 2011 г. 21:59:05
Все ответы на вопрос 9
0
33

Вы можете настроить массив $whitelist в этой функции, чтобы отфильтровать все другие нежелательные классы.

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

function wpse15850_body_class( $wp_classes, $extra_classes ) {

    // Список разрешенных классов, генерируемых WordPress
    $whitelist = array( 'portfolio', 'home', 'error404' );

    // Фильтрация классов body
    $wp_classes = array_intersect( $wp_classes, $whitelist );

    // Добавляем дополнительные классы обратно без изменений
    return array_merge( $wp_classes, (array) $extra_classes );
}
28 апр. 2011 г. 23:31:53
4
17

Просто дополнение к ответу @Geert (добавлен также черный список) :)

Пожалуйста, отметьте ответ @Geert как решение (не этот).

function wpse15850_body_class( $wp_classes, $extra_classes )
{
    // Список разрешенных классов, генерируемых WordPress
    $whitelist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );

    // Список запрещенных классов, генерируемых WordPress
    $blacklist = array( 'home', 'blog', 'archive', 'single', 'category', 'tag', 'error404', 'logged-in', 'admin-bar' );

    // Фильтрация классов body
    // Результат белого списка: (закомментируйте, если хотите использовать черный список)
    $wp_classes = array_intersect( $wp_classes, $whitelist );
    // Результат черного списка: (раскомментируйте, если хотите использовать черный список)
    # $wp_classes = array_diff( $wp_classes, $blacklist );

    // Добавляем дополнительные классы без изменений
    return array_merge( $wp_classes, (array) $extra_classes );
}
add_filter( 'body_class', 'wpse15850_body_class', 10, 2 );
29 апр. 2011 г. 05:14:25
Комментарии

Хотя это очень хорошее рабочее решение, я все равно вижу, что класс 'no-js' добавляется

henrywright henrywright
27 янв. 2014 г. 14:07:44

Что касается класса no-js - думаю, это может быть связано с BuddyPress. Я разберусь!

henrywright henrywright
27 янв. 2014 г. 14:36:58

no-js или аналогичный js обычно обрабатываются с помощью javascript/jquery, так что, полагаю, вам нужно было бы убрать соответствующий скрипт через deque

Bryan Willis Bryan Willis
19 дек. 2015 г. 05:35:25

no-js будет добавлен сервером, но удалится скриптом, если в браузере разрешено выполнение javascript.

Davey Davey
30 апр. 2019 г. 11:10:11
2

Я бы рекомендовал просто опустить шаблонный тег <?php body_class(); ?>, если вам не нужен его вывод.

Просто примените class="portfolio" напрямую в тег <body>.

28 апр. 2011 г. 17:59:14
Комментарии

если вы хотите разместить свою тему в репозитории wp.org, то у вас нет такого выбора (просто примечание).

kaiser kaiser
29 апр. 2011 г. 02:46:24

ЛОЛ, я знаю... Я проверил одну или две темы для репозитория WPORG. :) Но из вопроса я предположил, что эта тема предназначена для личного использования, а не для общего публичного распространения.

Chip Bennett Chip Bennett
29 апр. 2011 г. 03:51:44
0

Просто добавьте CSS-классы, которые вы хотите удалить, в переменную $class_delete

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

function wpse15850_body_class( $wp_classes, $extra_classes ) {

    # Список классов для удаления
    $class_delete = array('tag');

    # Проверяем, есть ли классы WP в $class_delete
    foreach ($wp_classes as $class_css_key => $class_css) {
        if (in_array($class_css, $class_delete)) {
            unset($wp_classes[$class_css_key]);
        }
    }

    // Возвращаем оставшиеся классы WP и дополнительные классы без изменений
    return array_merge( $wp_classes, (array) $extra_classes );
}
11 янв. 2017 г. 02:21:11
0

Это добавит каждой странице класс body только 'portfolio'. Первый аргумент — это массив автоматически сгенерированных классов body, которые обычно отображаются. Второй аргумент — это массив классов, переданных в функцию body_class (например, body_class('portfolio'); сделает второй аргумент в этой функции равным array( 'portfolio' )).

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

add_filter( 'body_class', 'wpse15850_body_classes', 10, 2 );
28 апр. 2011 г. 17:42:45
0
Попробуйте следующий код...

function var_template_include( $t ){
    // Получаем базовое имя файла шаблона
    $basename = basename($t);
    // Удаляем расширение файла (.php)
    $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'];
    }   
}

// Выводит имя текущего шаблона как класс для body
function body_template_as_class() {
    echo 'class="'.current_template().'"';
}
29 апр. 2011 г. 05:38:28
2

Если вам нужно удалить только определенный класс из тега 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]); //  Заменяет "portfolio" и удалит его
        }

    return $wp_classes;
}
7 февр. 2018 г. 10:15:20
Комментарии

Это должно быть правильным и принятым ответом, просто и отлично работает.

Jodyshop Jodyshop
22 сент. 2021 г. 09:58:10

что мы можем использовать, чтобы удалить класс из элемента Row?

tushonline tushonline
14 дек. 2024 г. 15:01:34
1
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' );
5 сент. 2018 г. 22:53:52
Комментарии

Добро пожаловать в WordPress Stack Exchange! Не могли бы вы отредактировать свой ответ, используя ссылку на редактирование выше, и объяснить, что делает этот код, где его следует размещать и чем он отличается или лучше ранее опубликованных ответов? Ответы, содержащие только код, обычно не приветствуются без каких-либо пояснений.

Howdy_McGee Howdy_McGee
6 сент. 2018 г. 00:34:01
0

Хотя приведённые выше решения позволили мне создать рабочий вариант для случаев, когда классы добавлялись через body_class(), у меня была другая ситуация, где ни одно из них не сработало, потому что классы добавлялись JavaScript.

Кроме того, мне нужно было удалять классы только на определённых страницах, и я не мог сделать это путём изменения или переопределения JS без потенциального влияния на другие страницы.

Для решения этой проблемы я добавил следующее в functions.php дочерней темы...

<?php 
// Удаление классов body, не добавленных через функцию wp body_class()
// Решение с 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);

Приведённое выше решение с jQuery идеально подошло для моего случая. Для тех, кому нужно/хочется решение только на JavaScript, я подготовил это...

<?php 
// Удаление классов body, не добавленных через функцию wp body_class()
// Решение только на 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() { 
                // вдохновлено: 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;
                }

                // вдохновлено: 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_class(), используя идеи тех, кто публиковал решения до меня.

Основное отличие этого кода от приведённых сниппетов в том, что он позволяет одновременно использовать белый и чёрный списки.

В случае, для которого я это создавал, мне нужно было ограничить классы body определённым набором глобально, а затем удалять другие на конкретных страницах.

<?php
// вдохновлено: https://wordpress.stackexchange.com/questions/15850/remove-classes-from-body-class
function cbc_body_class_filter( $wp_classes, $extra_classes ) {
    // объединяем $wp_classes и $extra_classes, чтобы все классы подвергались фильтрации
    $classes = array_merge( $wp_classes, (array) $extra_classes );
    
    // инициализируем список(ы) разрешённых/запрещённых классов
    $whitelist = $blacklist = array();
    
    // блокировка/удаление классов body на странице магазина WC
    // этот блок можно повторить для разных страниц
    if (is_shop()) { // is_page('PAGE SLUG/NAME/ID')) { 
        $blacklisted = array('class-one', 'class-two');
        $blacklist = array_merge($blacklist, $blacklisted); 
    }

    // фильтруем классы body через списки
    // фильтруя сначала белый список, можно создать "главный" белый список, а затем удалять другие классы для каждой страницы
    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 апр. 2021 г. 01:01:09