맞춤 메뉴 링크를 페이지 나 게시물로 바꾸는 쉬운 방법이 있습니까?


14

플러그인을 찾고 아무것도 찾을 수 없으며 이것이 핵심 기능이어야한다고 생각합니다.

문제 :

사용자 정의 링크 또는 메뉴 링크를 바꾸는 현재 방법은 다음 프로세스를 수행하는 것입니다.

  1. 기존 메뉴 링크 제거
  2. 새 링크 삽입
  3. 목록 끝에서 새 링크 드래그
  4. 원하는 위치에 새 링크를 드롭
  5. 대박을 칠 때까지 3 단계와 4 단계를 반복하십시오.
  6. 메뉴 옵션을 다시 입력하십시오 (css, label 등)

왜 문제인가

특히 다음과 같은 경우에는 매우 비효율적입니다.

솔루션 요구 사항

  1. 메뉴 위치 / 계층 구조 유지
  2. 옵션 유지 (css 클래스, 레이블, 제목)
  3. 페이지 / 게시물 / 카테고리 등에서 선택

데모

http://puu.sh/laSEi/81b0d41705.png

그렇게 간단해야합니다.

여기에 이미지 설명을 입력하십시오

다른 가능한 아이디어는 복제 / "이것에 자식 링크 추가"또는 심지어 맨 아래가 아닌 맨 위에 새 링크를 추가하는 것입니다.

모든 의견을 부탁드립니다.


4
잘 구성된 질문에 대해 +1-동의합니다. 매우 효율적이지 않습니다.
birgire

3
이 질문의 문제점은 여기에 형식에 맞는 문제에 대한 간단한 해결책이 없다는 것입니다. 여러 영역에서 일부 기능을 조정해야 할 수도 있습니다. 가치있는 기능 요청처럼 들리므로 trac에서 티켓을 열 것을 제안합니다.
Mark Kaplun

1
어쩌면 당신은 URL 필드에 게시물, 페이지를 찾기 위해 TinyMCE에에서 검색을 추가 할 수 있습니다, 스크립트는 wplink.js
bueltge

1
@MarkKaplun 나는 누군가가 어쨌든, 그것을 위해 인기하거나 개인 플러그인을 알고있을 생각 나는 당신의 제안을 따라 @ 2 TRAC 요청 생성 core.trac.wordpress.org/ticket/34648 stackexchange에이 질문을 종료 appropiate 방법이 무엇인지를 ?
Aziz

2
모든 질문에 수용 가능하거나 유효한 답변이있는 것은 아닙니다. 때때로 다른 사람들도 같은 문제를보고 있고 답을 찾지 못했다는 것을 아는 것이 좋습니다. 때로는 누군가가 매우 늦게 답을합니다
Mark Kaplun

답변:


1

이 질문에 직접 대답하지는 않지만 기반이되는 코드가 기능을 제공합니다. 코드 세트는 다음과 같습니다

기능 install_menus () {
    require_once dirname (__FILE__). '/data.php';
    $ menus = get_menus_data ();
    if (! empty ($ menus)) foreach ($ menus as $ menu) {
        if ($ menu [ 'build']) {
            $ menu_id = create_nav_menu ($ menu);
            add_items_to_menu ($ menu_id, $ menu [ 'slug'], $ menu [ 'items']);
        }
    }
}

함수 create_nav_menu ($ menu) {
    if ($ exists = wp_get_nav_menu_object ($ menu [ 'name'])) {
        $ menu_id = $ exists-> term_id;
          if (비어있는 ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu [ 'name']);
        } 
    }
    다른 {
        $ menu_id = wp_create_nav_menu ($ menu [ 'name']);
    }
    return $ menu_id;
}
함수 add_items_to_menu ($ menu_id, $ slug, $ items) {
    if ($ items) foreach ($ items as $ item) {
        if ($ item [ 'build']) {
            $ slug = ($ item [ 'title'] == '홈')? 'home': $ item [ 'slug'];
            if (! menu_item_exists ($ slug, $ menu_id)) {
                wp_update_nav_menu_item ($ menu_id, 0, 배열 (
                    'menu-item-title'=> __ ($ item [ 'title']),
                    'menu-item-classes'=> '',
                    'menu-item-url'=> home_url ($ item [ 'slug']. '/'), 
                    'menu-item-status'=> '게시'
                    ));
            }
        }
    }
}
함수 menu_item_exists ($ slug, $ menu_id) {
    $ args = 배열 ​​(
        'order'=> 'ASC',
        'orderby'=> 'menu_order',
        'post_type'=> 'nav_menu_item',
        'post_status'=> '게시',
        'output'=> ARRAY_A,
        'output_key'=> 'menu_order',
        'nopaging'=> true,
        'update_post_term_cache'=> false); 

    $ existing = wp_get_nav_menu_items ($ menu_id, $ args);
    $ found = 거짓;
    foreach ($ exists $ 존재) {
        if (strpos ($ exists-> post_name, $ slug)! == FALSE) {// 정말 좋은 검색입니다.
            $ found = true;
            단절;
        }

    }
    $ found 반환;
}

데이터 파일은 다음과 같습니다.

get_menus_data () 함수 {
    $ items = 배열 ​​( 
        배열 ( 
            'name'=> '주 메뉴', '슬러그'=> '주 메뉴', '빌드'=> 1, 
            'items'=> 배열 (
                array ( 'title'=> 'Home', 'slug'=> '', 'build'=> 1), // slug는 비어 있어야합니다
                배열 ( 'title'=> 'Blog', 'slug'=> 'blog', 'build'=> 1),
                배열 ( 'title'=> 'About', 'slug'=> 'about', 'build'=> 1),
                배열 ( 'title'=> 'Contact', 'slug'=> 'contact', 'build'=> 1),
                ),
        ),
        배열 ( 
            'name'=> '보조 메뉴', '슬러그'=> '보조 메뉴', '빌드'=> 0,
            'items'=> 배열 (
                배열 ( 'title'=> 'Home', 'slug'=> '', 'build'=> 1),
                배열 ( 'title'=> 'Blog', 'slug'=> 'blog', 'build'=> 1),
                배열 ( 'title'=> 'About', 'slug'=> 'about', 'build'=> 1),
                배열 ( 'title'=> 'Contact', 'slug'=> 'contact', 'build'=> 1),
                ),
        ),
        배열 ( 
            'name'=> 'Footer Menu', 'slug'=> 'footer-menu', 'build'=> 1,
            'items'=> 배열 (
                배열 ( 'title'=> 'Terms', 'slug'=> 'terms', 'build'=> 1),
                배열 ( 'title'=> 'Privacy', 'slug'=> 'privacy', 'build'=> 1),
                배열 ( 'title'=> 'Contact', 'slug'=> 'contact', 'build'=> 1),
                ),
            ) 
    );
    반품 $ items;
}

요청 된 선택을 허용하기 위해이 위에 인터페이스를 구축해야하지만이 코드는 작동하고 테스트되었습니다.


안녕하세요, 답변 감사합니다. 게시 한 코드를 자세히 설명해 주시겠습니까?
아지즈

코드를 플러그인 또는 테마의 functions.php에 복사하여 붙여 넣은 경우 get_menus_data()함수 내에 포함 된 메뉴 항목을 작성해야 합니다. 검색 결과가 메뉴 항목을 동적으로 채우려면 WordPress API를 사용하여이를 수행하는 기능이 필요합니다. 이러한 기능은 메뉴 항목을 미리 구성 할 수있는 완전한 자체 설치 패키지의 일부로, 사실 이후에이를 수행 할 필요가 없습니다. 이러한 기능은 "장면 작업"을 제공하므로 이후의 검색 기능을위한 기반으로 사용할 수 있습니다.
cbos

1

나는 이것이 대답인지 확실하지 않지만 더 많은 토론 포인트입니다.

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과 같은 다양한 매개 변수를 허용합니다. 이러한 항목을 조건부로 선택하면 클래스 나 다른 속성을 지우지 않고 메뉴 항목의 유형을 변경할 수 있습니다.


제안을 만나서 반갑습니다-스크린 샷이 아이디어를 더 잘 이해하는 데 도움이 될 것입니다. ;-)
birgire

큰 스크린 샷을 얻을 수 있는지 잘 모르겠습니다. 중첩 된 ACF 기능은 복잡 할 수 있습니다.
Tim Plummer

0

이것은 올바른 접근 방식을 정의하는 데 도움이 될 수 있습니다.

WP의 더미 다운 철학은 처음에 설정 메뉴를 설정하는 방식을 주도하며 WP가 변경되는 컨텐츠가 많은 사이트를 처리하기위한 프레임 워크로 WP가 적합하지 않은 이유 중 하나 일뿐입니다.

컨텐츠 관리를 가능한 한 더미 증거로 만들려고 할 때 특정 패러다임에 고정되어 추가 작업을 생성하는 경우가 종종 있습니다. 구성 상실없이 메뉴 템플릿을 저장하거나 기존 메뉴를 복제하거나 메뉴 재사용 가능 메뉴 항목을 안전하게 저장할 수 없습니다.

나는 그것이 제공하는 기본 메뉴 형식에 대한 좋은 대안이 될 것이라는 귀하의 제안을 좋아합니다. 그리고 나는 성가신 드래그 앤 드롭 프로세스의 대안으로 정렬 매개 변수를 추가하여 주변을 너무 많이 만들 수 있습니다.

그러나 WP의 메뉴 관리가 변경되기를 원하지만이 경로를 너무 아래로 밀면 핵심 WP 철학에 위배되며 더 이상 가장 인기있는 공통 분모에 맞지 않습니다. WP.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.