나는 이것이 대답인지 확실하지 않지만 더 많은 토론 포인트입니다.
WP 메뉴를 만들기 위해 고급 사용자 정의 필드를 고려한 적이 있습니까? 이 작업을 몇 번 수행했으며 사용자 지정 메뉴 항목 속성과 함께 사용자 지정 구조를 만들고 기본 WP 메뉴에 필요한 복잡한 워커없이 메뉴의 HTML을 만들 수 있습니다.
ACF
if( function_exists('acf_add_local_field_group') ):
acf_add_local_field_group(array (
'key' => 'group_56532ec144a4b',
'title' => 'Menu',
'fields' => array (
array (
'key' => 'field_5653338918f43',
'label' => 'Menus',
'name' => 'menus',
'type' => 'flexible_content',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => '',
'class' => '',
'id' => '',
),
'button_label' => 'Add Menu',
'min' => '',
'max' => '',
'layouts' => array (
array (
'key' => '56533396b10bc',
'name' => 'menu',
'label' => 'Menu',
'display' => 'block',
'sub_fields' => array (
array (
'key' => 'field_56533fc6f25e7',
'label' => 'Menu Name',
'name' => 'menu__name',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'readonly' => 0,
'disabled' => 0,
),
array (
'key' => 'field_56532ec718f40',
'label' => 'Menu Items',
'name' => 'menu__items',
'type' => 'flexible_content',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => '',
'class' => '',
'id' => '',
),
'button_label' => 'Add Menu Item',
'min' => '',
'max' => '',
'layouts' => array (
array (
'key' => '56532eee6ef81',
'name' => 'menuItem',
'label' => 'Menu Item',
'display' => 'block',
'sub_fields' => array (
array (
'key' => 'field_56532f0418f41',
'label' => 'Label',
'name' => 'menuITem__label',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => 50,
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'readonly' => 0,
'disabled' => 0,
),
array (
'key' => 'field_565333d218f45',
'label' => 'Class',
'name' => 'menuItem__class',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => 50,
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'readonly' => 0,
'disabled' => 0,
),
array (
'key' => 'field_565342ef11b29',
'label' => 'Link Type',
'name' => 'menuItem__type',
'type' => 'radio',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => 25,
'class' => '',
'id' => '',
),
'choices' => array (
'page' => 'Page',
'cat' => 'Category',
'url' => 'URL',
'cust' => 'Custom',
),
'other_choice' => 0,
'save_other_choice' => 0,
'default_value' => '',
'layout' => 'vertical',
),
array (
'key' => 'field_56532f2d18f42',
'label' => 'Page',
'name' => 'menuItem__page',
'type' => 'page_link',
'instructions' => '',
'required' => 0,
'conditional_logic' => array (
array (
array (
'field' => 'field_565342ef11b29',
'operator' => '==',
'value' => 'page',
),
),
),
'wrapper' => array (
'width' => 75,
'class' => '',
'id' => '',
),
'post_type' => array (
),
'taxonomy' => array (
),
'allow_null' => 0,
'multiple' => 0,
),
array (
'key' => 'field_5653434f11b2a',
'label' => 'Category',
'name' => 'menuItem__cat',
'type' => 'taxonomy',
'instructions' => '',
'required' => 0,
'conditional_logic' => array (
array (
array (
'field' => 'field_565342ef11b29',
'operator' => '==',
'value' => 'cat',
),
),
),
'wrapper' => array (
'width' => 75,
'class' => '',
'id' => '',
),
'taxonomy' => 'category',
'field_type' => 'select',
'allow_null' => 0,
'add_term' => 1,
'save_terms' => 0,
'load_terms' => 0,
'return_format' => 'id',
'multiple' => 0,
),
array (
'key' => 'field_5653439311b2c',
'label' => 'Custom',
'name' => 'menuItem__cstm',
'type' => 'text',
'instructions' => '',
'required' => 0,
'conditional_logic' => array (
array (
array (
'field' => 'field_565342ef11b29',
'operator' => '==',
'value' => 'cust',
),
),
),
'wrapper' => array (
'width' => 75,
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
'prepend' => '',
'append' => '',
'maxlength' => '',
'readonly' => 0,
'disabled' => 0,
),
array (
'key' => 'field_5653437011b2b',
'label' => 'URL',
'name' => 'menuItem__url',
'type' => 'url',
'instructions' => '',
'required' => 0,
'conditional_logic' => array (
array (
array (
'field' => 'field_565342ef11b29',
'operator' => '==',
'value' => 'url',
),
),
),
'wrapper' => array (
'width' => 75,
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
),
),
'min' => '',
'max' => '',
),
),
),
),
'min' => '',
'max' => '',
),
),
),
),
'location' => array (
array (
array (
'param' => 'options_page',
'operator' => '==',
'value' => 'acf-options-theme-options',
),
),
),
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'top',
'instruction_placement' => 'label',
'hide_on_screen' => '',
'active' => 1,
'description' => '',
));
endif;
UX
function acfMenu($name) {
if( function_exists('get_field') ) :
$getMenus = get_field('menus', 'option');
foreach($getMenus as $menuData) :
if( $menuData['menu__name'] == $name ) :
// Do stuff to build your menu
endif;
endforeach;
endif;
}
이 샘플은 간단한 샘플이지만 ACF가 제공하는 옵션을 사용하면 모든 종류의 항목을 메뉴 항목에 고정한 다음 원하는대로 UI를 코딩 할 수 있습니다.
특정 질문에 적용 할 때, 제공하는 링크 유형에 조건부 선택을 적용 할 수 있습니다 (첨부 된 이미지 참조). ACF는 페이지 링크, 카테고리 링크 또는 직선 URL과 같은 다양한 매개 변수를 허용합니다. 이러한 항목을 조건부로 선택하면 클래스 나 다른 속성을 지우지 않고 메뉴 항목의 유형을 변경할 수 있습니다.