Удаление классов из body_class
Мне не нужна вся эта мешанина классов, как здесь...
<body class="page page-id-829 page-template page-template-page-template-portfolio-php portfolio">
Я бы хотел что-то вроде этого...
<body class="portfolio">
Есть ли где-нибудь фильтр со списком всех классов, где я мог бы просто закомментировать те, которые не хочу видеть в классе body?
Спасибо.

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

Просто дополнение к ответу @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 );

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

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

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

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

Просто добавьте 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 );
}

Это добавит каждой странице класс 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 );

Попробуйте следующий код...
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().'"';
}

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

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

Хотя приведённые выше решения позволили мне создать рабочий вариант для случаев, когда классы добавлялись через 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 );
?>
