Удалить класс в файле nav_menu_link_attibutes

У меня есть следующий код в файле functions.php моей дочерней темы:

function add_menu_atts( $atts, $item, $args ) { if ( $class_key = array_search( 'search-class', $item->classes ) !== FALSE ) { $atts['data-something'] = 'something'; $atts['class'] = 'something-class'; //the following line is the one relevant to this question unset($item->classes[$class_key]); } return $atts; } add_filter( 'nav_menu_link_attributes', 'add_menu_atts', 10, 3 ); 

После использования класса search-class для поиска элемента я хотел бы удалить его из элемента. Однако мой вызов для unset($item->classes[$class_key]); не работает.

Я не совсем понимаю, что такое объект $item , и это, вероятно, проблема. Когда я вызываю get_class() в $item я получаю WP_Post , но WP_Post не обладает свойством classes . Итак, как $item->classes возвращает массив классов?

(Я новичок в PHP и WordPress)

Можно ли удалить search-class класса search-class из массива классов объекта $item в моем методе?

Solutions Collecting From Web of "Удалить класс в файле nav_menu_link_attibutes"

Давайте сначала рассмотрим эту часть:

Я не совсем понимаю, что такое объект $item , и это, вероятно, проблема. Когда я вызываю get_class() в $item я получаю WP_Post , но WP_Post не обладает свойством классов. Итак, как $item->classes возвращает массив классов?

Несколько заметок о структуре меню в WordPress:

  • Каждое навигационное меню регистрируется как термин в таксономии nav_menu .

  • Затем, когда мы добавляем элементы в это меню, мы создаем новые почтовые объекты типа nav_menu_item .

  • Как и ожидалось, древовидная структура для каждого меню не хранится в поле nav_menu_item сообщений nav_menu_item . Мы действительно находим его в метатеге сообщений, где она хранится в мета-ключе nav_menu_item для каждого сообщения nav_menu_item .

  • Объект данных $item item $item является украшенным объектом WP_Post , то есть с дополнительными атрибутами, добавленными wp_setup_nav_menu_item() :

     /** * Decorates a menu item object with the shared navigation menu item properties. * * Properties: * - ID: The term_id if the menu item represents a taxonomy term. * - attr_title: The title attribute of the link element for this menu item. * - classes: The array of class attribute values for the link element of this menu item. * - db_id: The DB ID of this item as a nav_menu_item object, if it exists (0 if it doesn't exist). * - description: The description of this menu item. * - menu_item_parent: The DB ID of the nav_menu_item that is this item's menu parent, if any. 0 otherwise. * - object: The type of object originally represented, such as "category," "post", or "attachment." * - object_id: The DB ID of the original object this menu item represents, eg ID for posts and term_id for categories. * - post_parent: The DB ID of the original object's parent object, if any (0 otherwise). * - post_title: A "no title" label if menu item represents a post that lacks a title. * - target: The target attribute of the link element for this menu item. * - title: The title of this menu item. * - type: The family of objects originally represented, such as "post_type" or "taxonomy." * - type_label: The singular label used to describe this type of menu item. * - url: The URL to which this menu item points. * - xfn: The XFN relationship expressed in the link of this menu item. * - _invalid: Whether the menu item represents an object that no longer exists. 

Тогда давайте посмотрим на эту часть:

После использования класса search-class для поиска элемента я хотел бы удалить его из элемента. Однако мой вызов для unset($item->classes[$class_key]); не работает.

Слишком поздно снимать классы из объекта $item в фильтре nav_menu_link_attributes , чтобы удалить классы из элементов меню (теги li).

Например, мы можем использовать фильтр nav_menu_css_class для изменения этих классов.

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

Ниже приведен пример удаления search-class класса search-class :

 add_filter( 'nav_menu_css_class', function( $classes, $item, $args, $depth ) { return array_filter( (array) $classes, function( $val ) { return 'search-class' !== $val; } ); }, 10, 4 ); 

Затем мы можем использовать фильтр nav_menu_link_attributes чтобы добавить атрибут данных и добавить класс к тегу привязки:

 add_filter( 'nav_menu_link_attributes', function( $atts, $item, $args ) { // Nothing to do if( ! isset( $item->classes ) || ! in_array( 'klasi1', $item->classes, true ) || ! isset( $atts['class'] ) ) return $atts; // Add data attribute to anchor tag $atts['data-something'] = 'something'; // Append an anchor class $classes = explode( ' ', $atts['class'] ); $classes[] = 'something-class'; $atts['class'] = join( ' ', array_filter( $classes ) ); return $atts; }, 10, 3 ); 

Мы также можем ограничить указанные фильтры в данном меню, проверив, что $args->theme_location является 'primary' или $args->menu->slug 'somemenuslug' .