วิธีการรายการเมนูกำหนดรหัสแบบกำหนดเอง


22

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

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

แจ้งให้เราทราบหากมีสิ่งใดไม่ชัดเจน คู่มือหน้า codex ที่เหมาะสมยินดีต้อนรับ ขอบคุณ!


อัปเดต:ลองรหัสจากที่นี่กำหนดเป้าหมายเมนูเฉพาะด้วย wp_nav_menu_items

การลงทะเบียนเมนู:

function register_my_menus() {
  register_nav_menus(
    array('main-menu' => __( 'Main Menu' ) )
  );
}

add_action( 'init', 'register_my_menus' );

การใช้เทมเพลต:

<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>

รหัสสำหรับการเพิ่มรายการใหม่:

function new_nav_menu_items($items) {
    if( $args->theme_location == 'main-menu' ){
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    $items = $homelink . $items;
    return $items;
    }
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

เมื่อเพิ่มรหัสสำหรับการเพิ่มรายการใหม่ในเมนู nav ในfunctions.phpไฟล์ nothings เกิดขึ้นในหน้าเมนูในแผง admin แต่รายการเมนูปัจจุบันหายไปในเว็บไซต์!

คำตอบ:


23

ปัญหาเกี่ยวกับรหัสของคุณคือมันไม่ได้เพิ่มลิงก์ไปยังเมนูและไปยังผลลัพธ์ของเมนูเท่านั้นดังนั้นการใช้ตัวกรอง (add_filter) ดังนั้นคุณจึงเพิ่งกรองเอาท์พุทของเมนูในความเป็นจริงแม้ว่าคุณจะไม่ มีเมนูลิงก์ของคุณจะแสดงพร้อมรหัสที่คุณใช้ แต่เพื่อสร้างลิงค์และเพิ่มในเมนูคุณสามารถใช้รหัสนี้:

$run_once = get_option('menu_check');
if (!$run_once){
    //give your menu a name
    $name = 'theme default menu';
    //create the menu
    $menu_id = wp_create_nav_menu($name);
    //then get the menu object by its name
    $menu = get_term_by( 'name', $name, 'nav_menu' );

    //then add the actuall link/ menu item and you do this for each item you want to add
    wp_update_nav_menu_item($menu->term_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    //then you set the wanted theme  location
    $locations = get_theme_mod('nav_menu_locations');
    $locations['main-menu'] = $menu->term_id;
    set_theme_mod( 'nav_menu_locations', $locations );

    // then update the menu_check option to make sure this code only runs once
    update_option('menu_check', true);
}

ฉันแสดงความคิดเห็นทั่วเพื่อให้ง่ายขึ้น

ในการสร้างเมนูย่อยเพจย่อยเพจระดับที่สอง (คุณเคยเรียกใช้) คุณต้องตั้งค่าmenu-item-parent-idในไอเท็มใหม่เช่น:

//create the top level menu item (home)
$top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Home'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => 0,
    ));
//Sub menu item (first child)
$first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('First_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $top_menu,
    ));
//Sub Sub menu item (first child)
$Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Second_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $first_child,
    ));

คุณสามารถกำหนดตำแหน่งด้วยรหัสด้วยmenu-item-position และฉันคิดว่ามันทำอย่างนี้:

  • รายการแรก - 'เมนูรายการ - ตำแหน่ง' => 1
    • รายการแรกลูกคนแรก - 'menu-item-position' => 1
    • รายการแรกลูกคนที่สอง - 'menu-item-position' => 1
      • รายการแรกลูกคนที่สองลูกคนแรก - 'menu-item-position' => 1
  • รายการที่สอง - 'menu-item-position' => 2
  • รายการที่ 3 - 'menu-item-position' => 3
  • รายการที่ 4 - 'menu-item-position' => 4

เหล่านี้คือฟังก์ชั่นที่ฉันกำลังมองหา :) codex ไม่รวมสิ่งเหล่านี้ :( คำถามอีกข้อหนึ่งที่ฉันจะเพิ่มรายการย่อยให้กับรายการ Home ได้ฉันจะแจ้งให้คุณทราบทันทีที่ฉันไปถึงพีซีของฉันขอบคุณ!
Sisir

@Sisir: ฉันอัปเดตด้วยตัวอย่างวิธีสร้างหน้าย่อย
Bainternet

@Bainternet: Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25มีข้อผิดพลาดนี้เมื่อเรียกใช้รหัสแรก แต่เมนูจะถูกสร้างขึ้นและเมื่อหน้ารีเฟรชทุกอย่างทำงานได้ แต่ไม่มีอะไรแสดงในAppearance -> Menu Theme Locationส่วน พวกเราสนิทกันจริงๆ :) ขอบคุณ!
Sisir

@Bainternet: ฉันเดาว่ารหัสกำลังเกิดข้อผิดพลาดเมื่อพยายามเรียกใช้รหัส$locations = get_theme_mod('nav_menu_locations');ดังนั้นรหัสก่อนหน้านั้น (การแทรกเมนูทั้งหมดเสร็จสิ้น) รับการเรียกใช้งานและรหัสหลังจากนั้น (ตั้งค่าตำแหน่งชุดรูปแบบที่ต้องการ) ไม่ได้ถูกเรียกใช้ .
Sisir

@Sisir: รหัสทำงานได้ดีชื่อชุดรูปแบบของคุณคืออะไรและแสดงรหัสที่แน่นอนที่คุณใช้ฉันจะดูว่าฉันสามารถช่วย
Bainternet

8

รหัสเดิมของคุณใกล้เคียงกับเงินมากและฉันคิดว่า @Bainternet ที่แก้ปัญหานี้มานานแล้ว (ไม่มีการกระทำผิดกฎหมาย) นั้นมีราคาแพงเกินไปดังนั้นให้ดูที่สิ่งนี้แทน:

function new_nav_menu_items($items, $args) {
    if( $args->theme_location == 'primary' ){
        $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
        $items = $homelink . $items;
    }
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

ปัญหาเดียวของคุณคือคุณไม่ได้คืน$ itemsหลังจากฟังก์ชั่นการตรวจสอบเมนูที่ถูกต้องและคุณไม่มีอาร์กิวเมนต์การเรียกกลับที่สองที่จำเป็นในการตรวจสอบ ( $ args )


คุณจะตั้งค่าตำแหน่งของรายการเมนูโดยใช้วิธีนี้ได้อย่างไร
Michael N

1

มีข้อบกพร่องใน Wordpress 3.4.2:

https://github.com/WordPress/WordPress/commit/ae96b842f9f55ecfb22da705a4902b9d25580259#wp-includes/nav-menu.php

คุณต้องสร้างความสัมพันธ์ของคำด้วยตนเอง:

$menu = wp_get_nav_menu_object('top menu');
$id = wp_update_nav_menu_item($menu->term_id, 0, $data);

if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) {
    wp_set_post_terms($id, array((int)$this->id), 'nav_menu');
}

ดูhttps://gist.github.com/4148529สำหรับตัวอย่างของคลาสเมนูสำหรับการสร้างเมนูอย่างง่าย


0

สำหรับข้อมูลผู้ใช้ปัจจุบันจะต้องได้รับสิทธิ์ในการเพิ่มเงื่อนไข menu_items ของฉันถูกสร้างขึ้น แต่ไม่ได้เพิ่มในตาราง wp_terms_relationship ก่อนที่ฉันจะเพิ่มการเรียกไปที่ wp_set_current_user (1);

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