มีวิธีง่ายๆในการแทนที่ลิงค์เมนูที่กำหนดเองด้วยหน้าหรือโพสต์?


14

ฉันค้นหาปลั๊กอินและไม่พบสิ่งใดและฉันเชื่อว่านี่ควรเป็นคุณสมบัติหลัก

ปัญหา:

วิธีการปัจจุบันสำหรับการแทนที่ลิงค์ที่กำหนดเองหรือลิงค์เมนูใด ๆ โดยทำตามขั้นตอนต่อไปนี้:

  1. ลบลิงค์เมนูเก่า
  2. แทรกลิงค์ใหม่
  3. ลากลิงค์ใหม่จากส่วนท้ายของรายการ
  4. วางลิงค์ใหม่ในตำแหน่งที่ต้องการ
  5. ทำซ้ำขั้นตอนที่ 3 และ 4 จนกระทั่งคุณกดแจ็คพอต
  6. ป้อนตัวเลือกเมนูอีกครั้ง (css, ป้ายกำกับ ฯลฯ )

ทำไมถึงเป็นปัญหา

มันไม่มีประสิทธิภาพมากโดยเฉพาะเมื่อ: (a) จัดการกับเมนูขนาดใหญ่ (b) เมนูที่มี sublevels มากมาย (c) แทนที่รายการเมนูมากมายซึ่งมีตัวเลือกที่กำหนดเอง

ข้อกำหนดของโซลูชัน

  1. รักษาตำแหน่ง / ลำดับชั้นของเมนู
  2. คงตัวเลือก (css class, label, title)
  3. เลือกจากหน้า / โพสต์ / หมวดหมู่ ฯลฯ

สาธิต

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

ควรจะง่ายที่:

ป้อนคำอธิบายรูปภาพที่นี่

แนวคิดที่เป็นไปได้อื่น ๆ คือการทำซ้ำ / "เพิ่มลิงก์รองลงใน" นี้หรือแม้กระทั่งเพิ่มลิงก์ใหม่ลงในรายการด้านบนแทนด้านล่าง

ข้อเสนอแนะใด ๆ ชื่นชม


4
+1 สำหรับคำถามที่มีรูปแบบที่ดี - ฉันเห็นด้วยกับคุณมันไม่ได้มีประสิทธิภาพมาก
Birgire

3
ปัญหาของคำถามนี้คือฉันไม่เห็นวิธีแก้ปัญหาง่ายๆที่สามารถจัดรูปแบบได้ที่นี่ อาจจำเป็นต้องทำการปรับฟังก์ชันการทำงานบางอย่างในหลายพื้นที่ ฉันขอแนะนำให้เปิดตั๋วสำหรับมันใน trac เพราะฟังดูเหมือนคำขอคุณสมบัติที่ควรค่าแก่การ
Mark Kaplun

1
บางทีคุณสามารถเพิ่มการค้นหาจาก TinyMCE เพื่อค้นหาโพสต์, หน้าในฟิลด์ URL, สคริปต์wplink.js
bueltge

1
@ MarkKaplun ฉันคิดว่าบางคนอาจรู้จักปลั๊กอินที่ไม่เป็นที่นิยมหรือเป็นส่วนตัวสำหรับมันอย่างไรก็ตามฉันทำตามคำแนะนำของคุณและสร้างคำขอ trac @ core.trac.wordpress.org/ticket/34648วิธีที่เหมาะสมในการยุติคำถามนี้บน stackexchange ?
Aziz

2
ไม่ได้จบคำถามทุกข้อมีคำตอบที่ยอมรับได้หรือไม่ถูกต้อง บางครั้งเป็นการดีที่รู้ว่าคนอื่น ๆ กำลังดูปัญหาเดียวกันและไม่พบคำตอบบางครั้งบางคนก็ตอบช้ามาก
Mark Kaplun

คำตอบ:


1

แม้ว่าสิ่งนี้จะไม่ตอบคำถามโดยตรง แต่รหัสที่ใช้จะเป็นประโยชน์ต่อการทำงาน ชุดรหัสคือ:

ฟังก์ชัน install_menus () {
    require_once dirname (__FILE__) '/data.php';
    $ menu = get_menus_data ();
    if (! empty ($ เมนู)) foreach ($ menu เป็น $ menu) {
        if ($ menu ['build']) {
            $ menu_id = create_nav_menu ($ เมนู);
            add_items_to_menu ($ menu_id, $ menu ['slug'], $ menu ['items']);
        }
    }
}

ฟังก์ชั่น create_nav_menu (เมนู $) {
    ถ้า ($ exist = wp_get_nav_menu_object ($ menu ['name'])) {
        $ menu_id = $ มีอยู่ -> term_id;
          ถ้า (ว่าง ($ menu_id)) {
            $ menu_id = wp_create_nav_menu ($ menu ['name']);
        } 
    }
    อื่น {
        $ menu_id = wp_create_nav_menu ($ menu ['name']);
    }
    ส่งคืน $ menu_id;
}
ฟังก์ชั่น add_items_to_menu ($ menu_id, $ กระสุน, $ items) {
    if ($ items) foreach ($ items as $ item) {
        ถ้า ($ item ['build']) {
            $ slug = ($ item ['title'] == 'Home')? 'home': $ item ['slug'];
            if (! menu_item_exists ($ กระสุน, $ 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' => 'เผยแพร่'
                    ));
            }
        }
    }
}
function menu_item_exists ($ กระสุน, $ menu_id) {
    $ args = array (
        'order' => 'ASC'
        'orderby' => 'menu_order',
        'post_type' => 'nav_menu_item'
        'post_status' => 'เผยแพร่'
        'output' => ARRAY_A
        'output_key' => 'menu_order'
        'nopaging' => จริง
        'update_post_term_cache' => false); 

    $ ที่มีอยู่ = wp_get_nav_menu_items ($ menu_id, $ args);
    $ found = false;
    foreach ($ ปัจจุบันเป็น $ มีอยู่) {
        if (strpos ($ exist-> post_name, $ slug)! == FALSE) {// การค้นหาที่ดีงาม (ไม่แน่นอน)
            $ found = true;
            หยุดพัก;
        }

    }
    คืนเงิน $ พบ;
}

และไฟล์ข้อมูลคือ:

ฟังก์ชัน get_menus_data () {
    $ items = array ( 
        อาร์เรย์ ( 
            'name' => 'เมนูหลัก', 'slug' => 'main-menu', 'build' => 1, 
            'items' => อาร์เรย์ (
                array ('title' => 'Home', 'slug' => '', 'build' => 1), // slug ควรว่างเปล่า
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'ติดต่อ', 'slug' => 'contact', 'build' => 1),
                )
        )
        อาร์เรย์ ( 
            'name' => 'เมนูรอง', 'slug' => 'เมนูรอง', 'build' => 0,
            'items' => อาร์เรย์ (
                array ('title' => 'Home', 'slug' => '', 'build' => 1),
                array ('title' => 'Blog', 'slug' => 'blog', 'build' => 1),
                array ('title' => 'About', 'slug' => 'about', 'build' => 1),
                array ('title' => 'ติดต่อ', 'slug' => 'contact', 'build' => 1),
                )
        )
        อาร์เรย์ ( 
            'name' => 'เมนูส่วนท้าย', 'slug' => 'ส่วนท้ายของเมนู', 'build' => 1,
            'items' => อาร์เรย์ (
                array ('title' => 'ข้อตกลง', 'slug' => 'ข้อตกลง', 'build' => 1),
                อาร์เรย์ ('title' => 'ความเป็นส่วนตัว', 'slug' => 'ความเป็นส่วนตัว', 'build' => 1),
                array ('title' => 'ติดต่อ', 'slug' => 'contact', 'build' => 1),
                )
            ) 
    );
    ส่งคืน $ items;
}

อินเทอร์เฟซจะต้องสร้างขึ้นด้านบนของสิ่งนี้เพื่อให้สามารถเลือกสิ่งที่ถูกถามได้ แต่รหัสนี้ทำงานและทดสอบ


สวัสดีขอบคุณสำหรับคำตอบของคุณ คุณช่วยอธิบายและอธิบายรหัสที่คุณโพสต์ได้ไหม
Aziz

หากคุณคัดลอกและวางรหัสลงในปลั๊กอินหรือฟังก์ชั่นของ theme มันควรสร้างรายการเมนูที่มีอยู่ในget_menus_data()ฟังก์ชั่น เพื่อให้ได้ผลลัพธ์การค้นหาเติมรายการเมนูแบบไดนามิกจำเป็นต้องใช้ฟังก์ชั่นซึ่งใช้ WordPress API เพื่อทำสิ่งนั้น ฟังก์ชั่นเหล่านี้เป็นส่วนหนึ่งของแพ็คเกจการติดตั้งด้วยตนเองที่สมบูรณ์ซึ่งสามารถกำหนดค่ารายการเมนูล่วงหน้าได้โดยไม่จำเป็นต้องทำสิ่งนี้หลังจากข้อเท็จจริง เนื่องจากฟังก์ชันเหล่านี้มี "เบื้องหลังการทำงาน" จึงสามารถใช้เป็นพื้นฐานสำหรับฟังก์ชันการค้นหาที่คุณต้องการ
cbos

1

ฉันไม่แน่ใจว่านี่เป็นคำตอบ แต่เป็นอีกจุดสนทนา

มีใครเคยพิจารณา Advanced Custom Fields สำหรับการสร้างเมนู WP หรือไม่? ฉันได้ทำสองสามครั้งและมันช่วยให้ฉันสร้างโครงสร้างที่กำหนดเองพร้อมกับคุณสมบัติรายการเมนูที่กำหนดเองและสร้าง HTML สำหรับเมนูโดยไม่ต้องใช้วอล์คเกอร์ที่ซับซ้อนที่จะต้องใช้กับเมนู WP เริ่มต้น

ป้อนคำอธิบายรูปภาพที่นี่

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 ที่ซ้อนกันอาจทำให้เกิดความยุ่งเหยิง
ทิมพลัมเมอร์

0

นี่อาจช่วยกำหนดแนวทางที่ถูกต้อง

ปรัชญาแบบโง่ ๆ ที่อยู่เบื้องหลัง WP ขับเคลื่อนวิธีการที่พวกเขามีเมนูตั้งค่าในตอนแรกและเป็นเพียงหนึ่งในเหตุผลที่ทำไม WP จึงเป็นทางเลือกที่ไม่ดีในฐานะที่เป็นเฟรมเวิร์กสำหรับจัดการไซต์ที่มีเนื้อหาเปลี่ยนแปลงจำนวนมาก

ในการพยายามทำให้การจัดการเนื้อหาเป็นข้อพิสูจน์ที่เป็นไปได้มันจะล็อคเข้าไปในกระบวนทัศน์เฉพาะซึ่งมักจะสร้างงานพิเศษโดยไม่มีเหตุผลที่ดี คุณไม่สามารถบันทึกเทมเพลตเมนูหรือทำซ้ำเมนูที่มีอยู่หรือจัดเก็บรายการเมนูที่สามารถใช้งานได้อย่างปลอดภัยโดยไม่สูญเสียการกำหนดค่า

ฉันชอบข้อเสนอแนะของคุณซึ่งจะเป็นทางเลือกที่ดีสำหรับรูปแบบเมนูดั้งเดิมที่พวกเขามีให้เพราะเป็นจุดศูนย์กลางที่ดีระหว่างวิธีการพิสูจน์แบบหลอกตาในขณะที่ยังคงให้ความยืดหยุ่นและความเร็วในการปรับใช้มากขึ้น และฉันจะเพิ่มพารามิเตอร์การเรียงลำดับเป็นทางเลือกแทนกระบวนการลากและวางที่น่ารำคาญซึ่งสามารถสร้างซอเล่น ๆ

อย่างไรก็ตามในขณะที่ฉันต้องการให้การจัดการเมนูใน WP มีการเปลี่ยนแปลงการผลักดันเส้นทางที่ไกลเกินไปนั้นขัดกับหลักปรัชญา WP และอาจหมายความว่ามันไม่ได้จัดไว้ให้กับตัวหารร่วมที่ต่ำที่สุดซึ่งเป็นสาเหตุของความนิยมของ WP

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.