Вопрос или проблема
Я создаю меню для клиента, которое извлекает данные из настраиваемых полей с страниц элементов верхнего уровня меню и добавляет 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.
Шаги решения
-
Проверка существования плагина: Код правильно проверяет наличие ACF плагина перед выполнением любых операций.
-
Определение родительского идентификатора элемента меню:
- Для дочерних элементов меню, где
$item->menu_item_parent
не равен нулю, необходимо извлечь родительский элемент меню с помощью функцииget_post()
. - Использовать извлеченный объект родительского меню для получения
object_id
и, следовательно, данных кастомного поляpage_section
.
- Для дочерних элементов меню, где
-
Применение
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 меню, учтя, что подменю может содержать элементы, не связанные прямо с страницами или записями.