Я использую array_intersect()
, чтобы удалить все class
es из моих пунктов меню Wordpress, кроме перечисленных в списке. Затем я использую str_replace
, чтобы переименовать классы. Это работает, но он чувствует себя неряшливым. Есть ли более эффективный способ сделать это?PHP: как заменить эти строки (эффективно)?
function my_nav_menu_css_class($classes) {
$classes = array_intersect($classes, array(
'current-menu-ancestor',
'menu-item-has-children',
'current-menu-item',
));
$classes = str_replace('current-menu-ancestor', 'ancestor', $classes);
$classes = str_replace('menu-item-has-children', 'children', $classes);
$classes = str_replace('current-menu-item', 'item', $classes);
return $classes;
}
add_filter('nav_menu_css_class', 'my_nav_menu_css_class');
Примечание: вышеуказанные классы все условно; они появятся только в том случае, если меню активно или выпадающее меню. Другими словами, пытаясь это не сработало:
$rename_classes = array(
'ancestor',
'children',
'item',
);
return str_replace($classes, $rename_classes, $classes);
В этом случае .current-menu-item
является должен быть заменен .item
но заменяется .ancestor
вместо (потому что он пришел первым в массиве). Так что это не хорошо. Какие-нибудь лучшие решения?
Точка взята. Но мне все еще интересно, есть ли лучший способ написать это, если я когда-нибудь буду делать что-то подобное. – Sunny
Я бы просто пропустил через $ classes и построил массив $ newClasses со всеми теми же элементами, внеся необходимые изменения на этом пути. Опять же, держите это просто. Не пытайтесь делать что-то необычное. –
Истинные слова. Я должен быть менее перфекционистом и более практичным. – Sunny