Удалить класс в фильтре 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 );

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

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

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

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

Ответы и комментарии:

если вы новичок в PHP, первое, что нужно изучить, - это посмотреть на переменные, чтобы увидеть, что находится внутри. это можно сделать с помощью функций php.net/print_r и php.net/var_dump
Создан 06-09-2016 11:49 mmm

Спасибо за это, я посмотрю свой код, освежу память и сообщу. Спасибо.
Создан 11-09-2016 06:57 theyuv

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

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

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

Каждое навигационное меню регистрируется как термин в таксономии nav_menu.
Затем, когда мы добавляем элементы в это меню, мы создаем новые объекты записей типа nav_menu_item.
Древовидная структура для каждого меню не хранится в поле post_parent сообщений nav_menu_item, как и ожидалось. На самом деле мы находим его в мета-таблице post, где она хранится в мета-ключе _menu_item_menu_item_parent, для каждого сообщения nav_menu_item.
Объект данных элемента меню $ item является декорированным объектом WP_Post, то есть с дополнительными атрибутами, добавленными с помощью функции wp_setup_nav_menu_item ():
/ **
 * Украшает объект пункта меню с общими свойствами элемента меню навигации.
 *
 * Свойства:
 * - ID: term_id, если пункт меню представляет термин таксономии.
 * - attr_title: Атрибут заголовка элемента ссылки для этого пункта меню.
 * - classes: массив значений атрибутов class для элемента link этого пункта меню.
 * - db_id: идентификатор базы данных этого элемента в виде объекта nav_menu_item, если он существует (0, если он не существует).
 * - описание: описание этого пункта меню.
 * - menu_item_parent: идентификатор БД nav_menu_item, который является родителем этого элемента, если таковой имеется. 0 иначе.
 * - объект: тип первоначально представленного объекта, например «категория», «публикация» или «вложение».
 * - object_id: идентификатор базы данных исходного объекта, который представляет этот пункт меню, например ID для сообщений и term_id для категорий.
 * - post_parent: идентификатор БД родительского объекта исходного объекта, если есть (0 в противном случае).
 * - post_title: метка «без заголовка», если пункт меню представляет сообщение без заголовка.
 * - target: атрибут target элемента link для этого пункта меню.
 * - заголовок: заголовок этого пункта меню.
 * - тип: семейство объектов, изначально представленных, таких как «post_type» или «таксономия».
 * - type_label: особая метка, используемая для описания этого типа пункта меню.
 * - url: URL, на который указывает этот пункт меню.
 * - xfn: отношение XFN, выраженное в ссылке этого пункта меню.
 * - _invalid: представляет ли пункт меню объект, которого больше не существует.


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

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

Слишком поздно удалить классы из объекта $ item в фильтре nav_menu_link_attributes, чтобы удалить классы из пунктов меню (тегов li).
Мы можем, например, используйте фильтр nav_menu_css_class для изменения этих классов.
Также, возможно, в целом лучше использовать такой фильтр, чем модифицировать объект данных напрямую, поскольку другие плагины могут зависеть от объекта необработанных данных.
Вот пример того, как удалить класс класса поиска:
add_filter ('nav_menu_css_class', функция ($ классы, $ item, $ args, $ глубина)
{
    return array_filter (
        (массив) $ классов,
        function ($ val) {return 'search-class'! == $ val; }
    );

}, 10, 4);

Затем мы можем использовать nav_menu_link_attributesfilter, чтобы добавить атрибут данных и добавить класс к тегу привязки:
add_filter ('nav_menu_link_attributes', функция ($ atts, $ item, $ args)
{
    // Нечего делать
    если(
           ! isset ($ item-> classes)
        || ! in_array ('klasi1', $ item-> classes, true)
        || ! isset ($ atts ['class'])
    )
        вернуть $ atts;

    // Добавить атрибут данных в тег привязки
    $ atts ['data -thing'] = 'что-то';

    // Добавляем якорный класс
    $ classes = explode ('', $ atts ['class']);
    $ classes [] = 'что-то-класс';
    $ atts ['class'] = join ('', array_filter ($ classes));

    вернуть $ atts;
}, 10, 3);

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