2014-02-09 5 views
0

Я использую 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 вместо (потому что он пришел первым в массиве). Так что это не хорошо. Какие-нибудь лучшие решения?

ответ

1

Вы должны обновить свой CSS, чтобы вместо этого использовать «.current-menu-item».

Все, что вы делаете в PHP, сделает сайт немного медленнее, чтобы загрузить и, возможно, глючит.

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

+0

Точка взята. Но мне все еще интересно, есть ли лучший способ написать это, если я когда-нибудь буду делать что-то подобное. – Sunny

+1

Я бы просто пропустил через $ classes и построил массив $ newClasses со всеми теми же элементами, внеся необходимые изменения на этом пути. Опять же, держите это просто. Не пытайтесь делать что-то необычное. –

+0

Истинные слова. Я должен быть менее перфекционистом и более практичным. – Sunny

1

Я читаю это право, вы делаете что-то N раз (здесь 3)? , а конечным результатом является список классов, которые существуют в $ class, которые вы проходите? , если в этом случае используется цикл foreach. и in_array()

извините, если я понял, что это неправильно. но что-то N раз указывает на использование петли

+0

У меня было ощущение, что я не делаю этого наилучшим образом, я должен лучше использовать петли. – Sunny

Смежные вопросы