สร้างเมนูนำทางที่กำหนดเองใน WordPress โดยไม่ต้องใช้ปลั๊กอิน
เผยแพร่แล้ว: 2020-11-28ไม่ว่าคุณจะใช้ธีมใดของ WordPress ธีมนี้จะมีตำแหน่งเมนูอย่างน้อยหนึ่งตำแหน่งที่คุณสามารถแสดงเมนูของคุณได้ (โดยปกติในส่วนหัวของเว็บไซต์ของคุณ) สามารถสร้างเมนูได้อย่างง่ายดายจากภายในพื้นที่ผู้ดูแลระบบ และเพิ่มอย่างรวดเร็วไปยังตำแหน่งที่กำหนดไว้ล่วงหน้าเหล่านี้ แต่คุณจะทำอย่างไรถ้าคุณต้องการให้เมนูอื่นแสดงที่อื่นบนเว็บไซต์ของคุณ? ในบทช่วยสอนนี้ เราจะมาดูวิธีที่คุณสามารถสร้างเมนูการนำทางของคุณเองซึ่งสามารถแสดงในตำแหน่งที่คุณเลือกโดยไม่ต้องใช้ปลั๊กอิน
เริ่มกันเลย!
ลงทะเบียนตำแหน่งเมนูที่กำหนดเองใหม่ของคุณ
สิ่งแรกที่เราต้องทำคือลงทะเบียนตำแหน่งของเมนูที่กำหนดเองใหม่ของคุณ ในการดำเนินการนี้ ให้เปิดไฟล์ functions.php ของธีมที่ใช้งานอยู่โดยใช้โปรแกรมแก้ไขข้อความที่คุณเลือก (เช่น Sublime) และเพิ่มโค้ดต่อไปนี้:
function my_custom_menu() { register_nav_menu('my-custom-menu',__( 'My Custom Menu' )); } add_action( 'init', 'my_custom_menu' );
ในโค้ดชิ้นนี้ เราได้ใช้ add_action()
เพื่อเพิ่มฟังก์ชันเรียกกลับ my_custom_menu()
ซึ่งหมายความว่า my_custom_menu()
จะถูกดำเนินการพร้อมกับฟังก์ชันหลักเริ่มต้นที่ดำเนินการทุกครั้งที่มีการเรียกการดำเนินการ init
สตริง "เมนูกำหนดเองของฉัน" เป็นเวอร์ชันที่อ่านได้ซึ่งคุณจะเห็นในหน้าผู้ดูแลระบบ
ภายในฟังก์ชัน ฟังก์ชันหลัก register_nav_menu ใช้เพื่อลงทะเบียนตำแหน่งเมนูการนำทางสำหรับธีมของเรา ในกรณีที่คุณต้องการลงทะเบียนหลายเมนู คุณสามารถใช้ register_nav_menus()
และกำหนดตำแหน่งเมนูภายในอาร์เรย์ดังนี้:
function my_custom_menu() { register_nav_menus( array( 'my-custom-menu' => _( 'My Custom Menu' ), 'my-custom-menu-2' =>_('My Second Custom Menu') ) ); } add_action( 'init', 'my_custom_menu' );
เพื่อยืนยันผลลัพธ์ ไปที่ส่วนผู้ดูแลระบบของคุณภายใต้ ลักษณะที่ปรากฏ >เมนู คุณจะสังเกตเห็นว่าตำแหน่งเมนูที่กำหนดเองของคุณรวมอยู่ในการตั้งค่าเมนู
หมายเหตุ: หากเราเลือกตำแหน่งนี้ ณ จุดนี้ เมนูจะไม่แสดงสิ่งใดเลยที่ส่วนหน้า
วิธีแสดงเมนูที่กำหนดเองของเรา
สมมติว่าเราต้องการใช้ตำแหน่งเมนูใหม่เป็นเมนูแนวนอนรองที่จะอยู่ใต้ “เมนูแนวนอนบนเดสก์ท็อป” ที่มีอยู่แล้วในธีมของเรา
เพื่อให้บรรลุสิ่งนี้ เราจะแทรกโค้ดบางส่วนในเทมเพลตของธีมที่เราต้องการให้แสดงเมนู ในตัวอย่างนี้ เราใช้ธีม Twenty Twenty และแก้ไขไฟล์ header.php เพื่อแสดงเมนูของเรา คุณจะพบไฟล์นี้ภายใต้โฟลเดอร์ของธีม
เปิดไฟล์ header.php ด้วยโปรแกรมแก้ไขของคุณและค้นหาองค์ประกอบนี้ในโค้ดแถวที่ 33
<header class="header-footer-group" role="banner">
ด้านล่างส่วนนี้ เราจะใส่รหัสของเราเพื่อแสดงตำแหน่งเมนูที่กำหนดเองใหม่ของเรา: 'my-custom-menu'
<header class="header-footer-group" role="banner"> <?php wp_nav_menu( array( 'theme_location' => 'my-custom-menu' ) ); ?>
ค่า theme_location จะต้องเหมือนกับชื่อที่คุณระบุสำหรับเมนูของคุณในโค้ด functions.php ที่เราวางก่อนหน้านี้ ในกรณีของเรา: 'my-custom-menu'
ตอนนี้ มาสร้างเมนูทดสอบเพื่อดูว่ามันใช้งานได้หรือไม่ เมื่อต้องการทำสิ่งนี้ ให้ไปที่ ลักษณะที่ปรากฏ >เมนู และเริ่มสร้างเมนูใหม่
ตั้งชื่อเมนูว่า "เมนูรอง" เลือก "เมนูกำหนดเองของฉัน" สำหรับตำแหน่งจากนั้นกดปุ่ม "สร้างเมนู"
สุดท้ายเพิ่มบางรายการลงในเมนู (เช่น รายการเมนู 1 รายการเมนู 2 รายการเมนู 3) จากนั้นบันทึกเมนู
มาดูกันว่าตอนนี้เรามีอะไรบ้างในฟรอนท์เอนด์
เราจัดการโชว์เมนูใหม่ได้แล้ว แต่มันค่อนข้างเลอะเทอะใช่ไหม?
หากเราดูซอร์สโค้ดของเรา เราจะสังเกตเห็นว่าฟังก์ชัน wp_nav_menu() สร้างโค้ด HTML นี้
<div class="menu-secondary-menu-container"> <ul class="menu"> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-378"><a href="#">Menu item 1</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-381"><a href="#">Menu item 2</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-382"><a href="#">Menu item 3</a></li> </ul> </div>
ดังนั้นเราจึงสามารถใช้คลาสที่อธิบายไว้ในโค้ดเพื่อตกแต่งเมนูของเราได้ ในการทำเช่นนี้เราจะใช้ CSS บางส่วน ค้นหา style.css (โดยปกติจะอยู่ในตำแหน่งเดียวกับไฟล์ header.php) จากนั้นเปิดด้วยโปรแกรมแก้ไขเพื่อเพิ่มโค้ดนี้:
ul#menu-secondary-menu { text-align: right; padding: 10px 30px; } ul#menu-secondary-menu li { list-style: none; display: inline-block; padding: 1px; } ul#menu-secondary-menu li:hover { border: 1px solid #c00202; padding: 0; border-radius: 3px; } ul#menu-secondary-menu li a { text-decoration: none; padding: 5px; font-size: 14px; }
ผลลัพธ์ที่ได้จะดูเรียบร้อยยิ่งขึ้นในตอนนี้และมากขึ้นตามสไตล์ของเว็บไซต์สาธิตของเรา
การปรับแต่งเมนูเพิ่มเติม
ฟังก์ชั่น wp_nav_menu() ที่ WordPress จัดเตรียมไว้สำหรับแสดงเมนูนั้นมาพร้อมกับตัวเลือกมากมายที่ให้คุณปรับแต่งเพิ่มเติมได้
' theme_location '
ตามที่เราอธิบายไว้ข้างต้น พารามิเตอร์นี้สอดคล้องกับคีย์ที่ส่งผ่านไปยังฟังก์ชัน register_nav_menus() ใน functions.php
wp_nav_menu( array( 'theme_location' => 'my-custom-menu' ) );
'menu_class'
มีตัวเลือก ' menu_class ' ที่ให้คุณระบุคลาสของคุณเองสำหรับเมนูได้
wp_nav_menu( array( 'theme_location' => 'my-custom-menu', 'menu_class' => 'my-custom-menu' ) );
ตามที่คุณอาจสังเกตเห็นแล้วว่าคลาสไม่ได้แทนที่คลาสอื่น แต่ถูกเพิ่มในองค์ประกอบ ul แทน
'menu_id'
ไม่เหมือนกับตัวเลือกคลาส ตัวเลือก menu_id จะแทนที่รหัสเมนูปัจจุบัน HTML ที่สร้างขึ้นสำหรับองค์ประกอบ <ul> จะเป็นดังนี้
<ul class="menu">
เมื่อไม่ใช้ตัวเลือกนี้ id จะเป็นทากเมนู ซึ่งจะเพิ่มขึ้นเมื่อใช้หลายอินสแตนซ์
'คอนเทนเนอร์'
พารามิเตอร์นี้กำหนดประเภทขององค์ประกอบที่ล้อมรอบเมนู ค่าเริ่มต้นคือ 'div' ตัวอย่างเช่น หากคุณใช้รหัสนี้:
wp_nav_menu( array( 'theme_location' => 'my-custom-menu', 'container' => 'nav', ) );
คุณจะได้ผลลัพธ์นี้:
'คอนเทนเนอร์_คลาส'
นี่คือคลาสที่ใช้กับองค์ประกอบหลักของเมนู:
wp_nav_menu( array( 'theme_location' => 'my-custom-menu', 'container_class' => 'my-custom-menu-wrapper', ) );
คุณยังสามารถแทรกเนื้อหาก่อนหรือหลังลิงก์รายการเมนูแต่ละรายการได้โดยใช้พารามิเตอร์ "ก่อน" และ "หลัง" สิ่งนี้มีประโยชน์มากหากคุณต้องการเพิ่มเครื่องหมายขีดกลางหรือไอคอน หรือรวมรายการเมนูในแท็กช่วง คุณสามารถลองใช้ตัวอย่างด้านล่างด้วยตัวเองเพื่อดูการทำงานจริง:
wp_nav_menu( array( 'theme_location' => 'my-custom-menu', 'before' => '<span class="menulink">', 'after' => '</span>', ) );
wp_nav_menu( array( 'theme_location' => 'my-custom-menu', 'before' => '-', ) );
wp_nav_menu( array( 'theme_location' => 'my-custom-menu', 'before' => '-', ) );
คุณยังสามารถเพิ่มไอคอนไปยังรายการเมนูได้ ลองยกตัวอย่างเช่น ติดตั้งปลั๊กอิน Font Awesome เพื่อรวมไลบรารีไอคอนและใช้ตัวเลือกเมนู 'ก่อน' เพื่อใช้ไอคอนแบบอักษรที่ยอดเยี่ยมกับรายการเมนู
wp_nav_menu( array( 'theme_location' => 'my-custom-menu', 'before' => '<i class="fas fa-caret-right"></i>', ) );
คุณสามารถค้นหารหัสสำหรับแต่ละไอคอนได้ในรายการไอคอนของปลั๊กอิน
พารามิเตอร์วอล์คเกอร์
สุดท้ายแต่ไม่ท้ายสุด เราจะยกตัวอย่างว่าพารามิเตอร์วอล์คเกอร์ช่วยปรับแต่งเมนูได้อย่างไร หากคุณไม่ทราบว่าคลาสวอล์คเกอร์ของ WordPress คืออะไร ต่อไปนี้อาจไม่สมเหตุสมผลนัก เราขอแนะนำให้คุณอ่าน 'การทำความคุ้นเคยกับ WordPress Walker Class' ก่อน
wp_nav_menu( array( 'walker' => new Walker_Custom_Menu ) );
เพื่อสาธิตคลาส Walker เราจะเพิ่ม "รายการย่อย" ในเมนูของเรา
เราจะแทนที่ Walker Class เริ่มต้นที่ WordPress มีให้ ซึ่งอยู่ในไฟล์ wp-includes/class-walker-nav-menu.php ไปที่ไฟล์ function.php ของคุณและใส่รหัสด้านล่าง:
if ( !class_exists('My_Nav_Menu_Walker') ) { class My_Nav_Menu_Walker extends Walker { var $tree_type = array( 'post_type', 'taxonomy', 'custom' ); var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' ); function start_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); $output .= "\n$indent"; $output .= "<i class=\"dropdown icon\"></i>\n"; $output .= "<div class=\"menu\">\n"; } function end_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); $output .= "$indent</div>\n"; } function start_el(&$output, $item, $depth, $args) { $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes = in_array( 'current-menu-item', $classes ) ? array( 'current-menu-item' ) : array(); $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); $class_names = strlen( trim( $class_names ) ) > 0 ? ' class="' . esc_attr( $class_names ) . '"' : ''; $id = apply_filters( 'nav_menu_item_id', '', $item, $args ); $id = strlen( $id ) ? '' : ''; $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : ''; $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : ''; $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : ''; $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : ''; $item_output = $args->before; $item_output .= '<a'. $attributes . $id . $value . $class_names . '>'; $item_output .= '<div class="item">'; $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after; $item_output .= '</div>'; $item_output .= "</a>\n"; $item_output .= $args->after; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } } }
ตอนนี้ใน headers.php ของคุณ แทนที่โค้ดเมนูของคุณด้วยโค้ดนี้ (เราจะส่งออกเมนูทั้งสองเวอร์ชันโดยตั้งใจเพียงเพื่อเปรียบเทียบผลลัพธ์):
wp_nav_menu(); // Default 'walker' => new Walker_Nav_Menu() wp_nav_menu( array( 'walker' => new My_Nav_Menu_Walker() ) );
เปรียบเทียบรหัสนี้กับคลาส Walker_Nav_Menu ดั้งเดิม คุณจะสังเกตเห็นว่า $tree_type
และ $db_fields
ยังคงไม่ถูกแตะต้อง แต่ส่วนที่เหลือจะเปลี่ยนไป ใช้เวลาของคุณและเปรียบเทียบทั้งโค้ดและเอาต์พุต HTML ในเมนูเดียวกันทั้งสองเวอร์ชันนี้ แล้วลองทดลองด้วยตัวเองโดยลองใช้ My_Nav_Menu_Walker Class
บทสรุป
เมนูบนเว็บไซต์ค่อนข้างสำคัญ! ความสามารถในการควบคุมตำแหน่งและผลลัพธ์ของเมนูได้อย่างเต็มที่จะขยายขีดความสามารถของคุณในฐานะผู้พัฒนาธีม และเปิดโอกาสใหม่ๆ ที่น่าตื่นเต้นมากมายเมื่อออกแบบเว็บไซต์โดยไม่ต้องพึ่งพาปลั๊กอิน ซึ่งถือว่ายอดเยี่ยมเสมอ