Получение object_id родительского объекта для пунктов дочернего меню в меню WordPress.

Вопрос или проблема

Я создаю меню для клиента, которое извлекает данные из настраиваемых полей с страниц элементов верхнего уровня меню и добавляет data-color к этому элементу меню. Эта часть у меня работает без проблем.

Проблема заключается в применении этого data-color от элемента верхнего уровня к дочерним элементам меню. Поскольку дочерние элементы меню не обязательно являются дочерними постами/страницами страниц верхнего уровня, я не могу использовать $item->post_parent.

На данном этапе я немного застрял на моем следующем шаге. Вот блок кода на данный момент.

function data_attribs_menu( $atts, $item, $args ) {
    // проверить, существует ли ACF
    if( class_exists('acf') ) {     
        $page_section = get_field( 'page_section', $item->object_id );
        $parent_page_section = get_field( 'page_section', $item->post_parent );

        if( $args->theme_location == 'header-menu' ) {
            if( $item->menu_item_parent == 0 ) {
                $atts['data-color'] = $page_section;
            } else {
                $atts['data-color'] = $parent_page_section;
            }
        }
    }
    return $atts;
}
add_filter('nav_menu_link_attributes', 'data_attribs_menu', 10, 3);

Есть ли способ получить object_id родителя для подменю?

Вот видео, как меню взаимодействует в данный момент.
Текущее взаимодействие меню без работы подменю

Я сделал 2 ошибки в своем комментарии.
попробуйте лучше этот код

function data_attribs_menu( $atts, $item, $args ) {
    // проверить, существует ли ACF
    if( class_exists('acf') ) {     

        $page_section = get_field( 'page_section', $item->object_id );

        if( $args->theme_location == 'header-menu' ) {
            if( $item->menu_item_parent == 0 ) {
                $atts['data-color'] = $page_section;
            } else {
                $parentItem = get_post($item->menu_item_parent);
                $parent_page_section = get_field( 'page_section', $parentItem->_menu_item_object_id);

                $atts['data-color'] = $parent_page_section;
            }
        }

    }

    return $atts;
}
add_filter('nav_menu_link_attributes', 'data_attribs_menu', 10, 3);

Этот код работает только тогда, когда есть 2 уровня меню, и в соответствии с примером в вопросе, это то, что вам нужно.

Ответ или решение

Для решения задачи, как извлечь object_id родительского элемента для подменю в WordPress, в данной ситуации применим кастомизацию полей WordPress с использованием Advanced Custom Fields (ACF). Исходя из поставленной задачи и имеющегося кода, нам нужно обеспечить правильное наследование кастомных данных (data-color) от родительского элемента до дочерних элементов меню, независимо от их связи в иерархии страниц или записей.

Анализ проблемы и решение

Вы уже правильно задали функцию data_attribs_menu, использующую фильтр nav_menu_link_attributes для добавления атрибутов к элементам меню. Ваша текущая реализация предполагает, что для родительских пунктов меню правильно извлекается data-color на основе кастомного поля page_section. Однако для дочерних пунктов возникла проблема — как связать их с родительским элементом меню, так как они не всегда являются дочерними страницами в структуре WordPress.

Шаги решения

  1. Проверка существования плагина: Код правильно проверяет наличие ACF плагина перед выполнением любых операций.

  2. Определение родительского идентификатора элемента меню:

    • Для дочерних элементов меню, где $item->menu_item_parent не равен нулю, необходимо извлечь родительский элемент меню с помощью функции get_post().
    • Использовать извлеченный объект родительского меню для получения object_id и, следовательно, данных кастомного поля page_section.
  3. Применение data-color: Добавьте полученные данные как атрибут data-color для дочерних пунктов меню.

Код решения

function data_attribs_menu( $atts, $item, $args ) {
    // Проверьте, установлен ли ACF
    if( class_exists('acf') ) {     
        // Получаем значение кастомного поля для текущего элемента
        $page_section = get_field( 'page_section', $item->object_id );

        if( $args->theme_location == 'header-menu' ) {
            if( $item->menu_item_parent == 0 ) {
                // Атрибут для родительских пунктов меню
                $atts['data-color'] = $page_section;
            } else {
                // Извлечение родительского объекта меню
                $parentItem = get_post($item->menu_item_parent);
                // Получение кастомного поля родительского элемента
                $parent_page_section = get_field( 'page_section', $parentItem->_menu_item_object_id);

                // Установить атрибут для дочернего элемента
                $atts['data-color'] = $parent_page_section;
            }
        }
    }

    return $atts;
}
add_filter('nav_menu_link_attributes', 'data_attribs_menu', 10, 3);

Заключение

Данная реализация отвечает на вашу задачу — корректное применение данных кастомного поля для элементов подменю независимо от их фактической структурной иерархии. Это решение обеспечивает гибкость и кросс-функциональность работы с WordPress меню, учтя, что подменю может содержать элементы, не связанные прямо с страницами или записями.

Оцените материал
Добавить комментарий

Капча загружается...