Có một cách dễ dàng để thay thế một liên kết menu tùy chỉnh với một trang hoặc bài viết?


14

Tôi đã tìm kiếm các plugin và không thể tìm thấy bất cứ thứ gì và tôi tin rằng đây phải là một tính năng cốt lõi.

Vấn đề:

Phương pháp hiện tại để thay thế một liên kết tùy chỉnh hoặc bất kỳ liên kết menu nào là bằng cách thực hiện quy trình sau:

  1. Xóa liên kết menu cũ
  2. Chèn liên kết mới
  3. Kéo liên kết mới từ cuối danh sách
  4. Thả liên kết mới vào vị trí mong muốn
  5. lặp lại bước 3 và 4 cho đến khi bạn trúng số độc đắc
  6. Nhập lại các tùy chọn menu (css, nhãn, v.v.)

Tại sao nó là một vấn đề

Nó rất không hiệu quả, đặc biệt là khi: (a) xử lý các menu lớn (b) với nhiều cấp dưới (c) thay thế nhiều mục menu có tùy chọn tùy chỉnh

Yêu cầu giải pháp

  1. Giữ lại vị trí / phân cấp Menu
  2. Giữ lại Tùy chọn (lớp css, nhãn, tiêu đề)
  3. Chọn từ Trang / Bài viết / Danh mục, v.v.

Trình diễn

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

Nên đơn giản như vậy:

nhập mô tả hình ảnh ở đây

Các ý tưởng khác có thể là sao chép / "thêm liên kết con vào đây" / hoặc thậm chí thêm liên kết mới vào đầu danh sách thay vì dưới cùng.

Bất kỳ thông tin phản hồi đánh giá cao.


4
+1 cho một câu hỏi được xây dựng tốt - Tôi đồng ý với bạn, nó không hiệu quả lắm.
bạch dương

3
Vấn đề với câu hỏi này là tôi không thấy bất kỳ giải pháp đơn giản nào cho vấn đề có thể phù hợp với định dạng ở đây. Có lẽ cần phải thực hiện một số điều chỉnh chức năng trong một số lĩnh vực. Tôi đề nghị mở một vé cho nó trong trac vì nó có vẻ như là một yêu cầu tính năng xứng đáng.
Đánh dấu Kaplun

1
Có lẽ bạn có thể thêm tìm kiếm từ TinyMCE để tìm các bài đăng, trang trong trường URL, tập lệnh wplink.js
bueltge

1
@MarkKaplun Tôi nghĩ rằng ai đó có thể biết một plugin không phổ biến hoặc riêng tư cho nó, dù sao, tôi đã làm theo đề xuất của bạn và tạo một yêu cầu trac @ core.trac.wordpress.org/ticket/34648 cách phù hợp để kết thúc câu hỏi này trên stackexchange ?
Aziz

2
đừng kết thúc nó, không phải tất cả các câu hỏi đều có câu trả lời chấp nhận được hoặc thậm chí hợp lệ. Đôi khi thật tốt khi biết rằng những người khác cũng đang xem xét vấn đề tương tự và không tìm thấy câu trả lời, đôi khi ai đó trả lời rất muộn
Mark Kaplun 10/11/2015

Câu trả lời:


1

Mặc dù điều này không trả lời trực tiếp câu hỏi, nhưng mã dựa trên nó cung cấp chức năng. Bộ mã là:

hàm install_menus () {
    request_once dirname (__FILE__). '/data.php';
    $ menu = get_menus_data ();
    if (! trống ($ menu)) foreach ($ menu dưới dạng $ menu) {
        if ($ menu ['build']) {
            $ menu_id = create_nav_menu ($ menu);
            add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['items']);
        }
    }
}

hàm created_nav_menu ($ menu) {
    if ($ tồn tại = wp_get_nav_menu_object ($ menu ['name'])) {
        $ menu_id = $ tồn tại -> term_id;
          if (trống ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['name']);
        } 
    }
    khác {
        $ menu_id = wp_create_nav_menu ($ menu ['name']);
    }
    trả về $ menu_id;
}
hàm add_items_to_menu ($ menu_id, $ slug, $ items) {
    if ($ items) foreach ($ item as $ item) {
        if ($ item ['build']) {
            $ slug = ($ item ['title'] == 'Trang chủ')? 'nhà': $ item ['sên'];
            if (! menu_item_exists ($ slug, $ menu_id)) {
                wp_update_nav_menu_item ($ menu_id, 0, mảng (
                    'menu-item-title' => __ ($ item ['title']),
                    'menu-item-class' => '',
                    'menu-item-url' => home_url ($ item ['slug']. '/'), 
                    'menu-item-status' => 'xuất bản'
                    ));
            }
        }
    }
}
chức năng menu_item_exists ($ slug, $ menu_id) {
    $ args = mảng (
        'Đặt hàng' => 'ASC',
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item',
        'post_status' => 'xuất bản',
        'đầu ra' => ARRAY_A,
        'output_key' => 'menu_order',
        'Nopaging' => đúng,
        'update_post_term_cache' => sai); 

    $ tồn tại = wp_get_nav_menu_items ($ menu_id, $ args);
    $ tìm thấy = sai;
    foreach ($ tồn tại dưới dạng $ tồn tại) {
        if (strpose ($ tồn tại-> post_name, $ slug)! == FALSE) {// tìm kiếm khá tốt (không chính xác).
            $ tìm thấy = đúng;
            phá vỡ;
        }

    }
    trả lại $ tìm thấy;
}

và tệp dữ liệu là:

hàm get_menus_data () {
    $ item = mảng ( 
        mảng ( 
            'name' => 'Menu chính', 'slug' => 'menu chính', 'build' => 1, 
            'mục' => mảng (
                mảng ('title' => 'Home', 'slug' => '', 'build' => 1), // slug nên trống
                mảng ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                mảng ('title' => 'About', 'slug' => 'about', 'build' => 1),
                mảng ('title' => 'Liên hệ', 'sên' => 'liên hệ', 'xây dựng' => 1),
                ),
        ),
        mảng ( 
            'name' => 'Menu phụ', 'slug' => 'menu phụ', 'build' => 0,
            'mục' => mảng (
                mảng ('title' => 'Home', 'slug' => '', 'build' => 1),
                mảng ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                mảng ('title' => 'About', 'slug' => 'about', 'build' => 1),
                mảng ('title' => 'Liên hệ', 'sên' => 'liên hệ', 'xây dựng' => 1),
                ),
        ),
        mảng ( 
            'name' => 'Menu chân trang', 'slug' => 'menu chân trang', 'build' => 1,
            'mục' => mảng (
                mảng ('title' => 'terms', 'slug' => 'terms', 'build' => 1),
                mảng ('title' => 'Privacy', 'slug' => 'Privacy', 'build' => 1),
                mảng ('title' => 'Liên hệ', 'sên' => 'liên hệ', 'xây dựng' => 1),
                ),
            ) 
    );
    trả lại các mặt hàng $;
}

Một giao diện sẽ cần được xây dựng trên đầu trang này để cho phép lựa chọn được yêu cầu, nhưng mã này đang hoạt động và được thử nghiệm.


Xin chào, cảm ơn bạn đã trả lời. Bạn có thể vui lòng giải thích và giải thích mã bạn đã đăng?
Aziz

Nếu bạn sao chép và dán mã vào plugin hoặc chức năng của chủ đề.php, nó sẽ tạo các mục menu có trong get_menus_data()hàm. Để có kết quả tìm kiếm tự động điền vào một mục menu, các chức năng là cần thiết sử dụng API WordPress để làm điều đó. Các chức năng này là một phần của gói tự cài đặt hoàn chỉnh, theo đó các mục menu có thể được cấu hình trước, lý tưởng loại bỏ sự cần thiết phải làm điều này sau khi thực tế. Vì các chức năng này cung cấp "hoạt động đằng sau hậu trường", chúng có thể được sử dụng làm cơ sở cho chức năng tìm kiếm mà bạn đang theo dõi.
cbos

1

Tôi không chắc đây là câu trả lời, nhưng nhiều hơn một điểm thảo luận.

Đã có ai từng xem Trường tùy chỉnh nâng cao để xây dựng menu WP chưa? Tôi đã thực hiện điều này một vài lần và nó cho phép tôi xây dựng cấu trúc tùy chỉnh cùng với các thuộc tính mục menu tùy chỉnh và xây dựng HTML cho menu mà không cần một trình đi bộ phức tạp cần thiết với các menu WP mặc định.

nhập mô tả hình ảnh ở đây

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;
}

Đây chỉ là một mẫu nhanh, nhưng với các tùy chọn mà ACF cung cấp, bạn có thể giải quyết tất cả các loại nội dung vào một mục menu và sau đó mã hóa giao diện người dùng theo ý muốn.

Để áp dụng cho câu hỏi cụ thể của bạn, người ta có thể lần lượt áp dụng các lựa chọn có điều kiện cho loại liên kết bạn đang cung cấp (xem hình ảnh đính kèm). ACF cho phép nhiều tham số khác nhau như liên kết trang, liên kết danh mục hoặc URL thẳng. Một lựa chọn có điều kiện của các mục này sẽ cho phép một người thay đổi loại mục menu mà không xóa các lớp hoặc các thuộc tính khác.


Rất vui khi thấy các đề xuất - Tôi chắc chắn rằng một ảnh chụp màn hình sẽ giúp hiểu rõ hơn về ý tưởng của bạn ;-)
birgire

Tôi không chắc mình có thể chụp ảnh màn hình lớn như vậy. Các tính năng ACF lồng nhau có thể có được loại lộn xộn.
Tim Plummer

0

Điều này có thể giúp xác định phương pháp đúng.

Triết lý giả mạo đằng sau WP thúc đẩy cách họ có các menu thiết lập ở nơi đầu tiên, và chỉ là một trong những lý do tại sao WP có thể là một lựa chọn tồi vì khung xử lý một trang web có lượng lớn nội dung thay đổi.

Khi cố gắng làm cho việc quản lý nội dung trở thành bằng chứng giả càng tốt, nó sẽ khóa nó vào các mô hình cụ thể thường tạo ra công việc làm thêm, thường không có lý do chính đáng. Bạn không thể lưu các mẫu menu, cũng không sao chép các menu hiện có, cũng không lưu trữ an toàn các mục menu có thể sử dụng lại mà không bị mất cấu hình.

Tôi thích đề xuất của bạn sẽ là một lựa chọn thay thế tốt cho các định dạng menu gốc mà họ cung cấp, vì đó là một nền tảng tốt giữa phương pháp chống giả trong khi vẫn mang lại sự linh hoạt và tốc độ triển khai cao hơn rất nhiều. Và tôi sẽ thêm một tham số sắp xếp như là một thay thế cho quá trình kéo và thả khó chịu có thể tạo ra rất nhiều vấn đề xung quanh.

Tuy nhiên, trong khi tôi muốn thay đổi cách quản lý menu trong WP, việc đẩy quá xa con đường này đi ngược lại triết lý cốt lõi của WP và có thể nó không còn phục vụ cho mẫu số chung thấp nhất mà phần lớn là lý do cho sự phổ biến của WP.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.