Удалить классы из body_class

17

Мне не нужен весь этот беспорядок классов, как это ...

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

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

<body class="portfolio">

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

Благодарю.

agileapricot
источник
Реальный вопрос в том, почему вы хотите это сделать? Наличие этих дополнительных классов не имеет значения в общей схеме вещей, и было бы хорошо иметь их для стилизации, если вы захотите сослаться на них позже.
Отто
3
@ Отто - я могу полностью понять ее / его. Если вы собираетесь поиграть с добавлением классов, например. firebug, тогда действительно трудно справиться с этим. FF часто глючит и имя класса, которое вы пишете из области просмотра. Я отключаю много пост- и боди-классов во время разработки - это облегчает жизнь.
Кайзер
Ах, да, я не использую Firebug. Его интерфейс плачевный.
Отто

Ответы:

31

Вы можете настроить $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 );
}
Герт
источник
15

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

Пожалуйста, будьте так добры, отметьте ответ @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 );
кайзер
источник
Хотя это очень хорошее рабочее решение, я все же нахожу, что «no-js» добавляется как класс
Генрирайт
1
Что касается класса no-js - я думаю, что это может быть вещь BuddyPress. Я буду расследовать!
Генрирайт
1
no-jsили аналогичным образом jsобычно имеют дело с использованием javascript / jquery, поэтому я предполагаю, что это был сценарий, который вам нужно удалить из очереди
Брайан Уиллис
no-jsбудет добавлен сервером, но удален с помощью скрипта, если в браузере разрешено выполнение javascript.
Дэйви,
4

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

Просто примените class="portfolio"жестко в <body>теге.

Чип Беннетт
источник
если вы хотите разместить свою тему в репозитории wp.org, то у вас нет этого выбора (только sidenote).
Кайзер
1
LOL, я знаю ... Я просмотрел одну или две темы для репозитория WPORG. :) Из вопроса я предположил, что эта тема предназначена для личного использования, а не для общего распространения.
Чип Беннетт
2

Просто поместите классы вашего CSS, которые вы хотите удалить, в $ class_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 );
}
Брайан Контрерас
источник
1

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

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

add_filter( 'body_class', 'wpse15850_body_classes', 10, 2 );
Джон П Блох
источник
1
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().'"';
}
котелок с выпуклым днищем
источник
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' );
Сайфулислам
источник
Добро пожаловать в WordPress Stack Exchange! Не могли бы вы отредактировать свой ответ , используя ссылку редактирования выше, и объяснить, что делает этот код, куда вы поместите этот код, и чем он отличается или лучше любого из ранее опубликованных ответов? Ответы только кода обычно не рекомендуется без объяснения причин.
Howdy_McGee
0

Если вы хотите удалить только определенный класс из тега body, вы должны сделать следующее:

add_filter ('body_class', 'remove_body_class', 20, 2);

function remove_body_class ($ wp_classes) {
    foreach ($ wp_classes как $ key => $ value)
        {
            if ($ value == 'portfolio') unset ($ wp_classes [$ key]); // Заменяет «портфолио» и удаляет его
        }

    вернуть $ wp_classes;
}
Nices Wölkchen
источник