問題描述
有沒有辦法,我可以硬編碼的第一個主題安裝時的自定義菜單項?我正在創建一個主題,它將在安裝時自動使一些常見頁面。所以我需要知道,如果我也可以添加到 Wordpress 自定義菜單,所以客户端不需要手動添加它們?
換句話説:如何以編程方式插入/創建自定義菜單項?
讓我知道如果有什麼不清楚的話。歡迎指導適當的 codex 頁面。謝謝!
更新:嘗試代碼從這裏 Targeting specific menu with 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="http://'%20.%20home_url(%20'/'%20)%20.%20'">' . __('Home') . '</a></li>';
$items = $homelink . $items;
return $items;
}
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );
當在 functions.php 文件中的導航菜單中添加添加新項目的代碼時,在管理面板的菜單頁面中會發生錯誤,但是當前的菜單項目已經停留在站點中!
最佳解決方案
你的代碼的問題是,它實際上並沒有添加到菜單的鏈接,而只是添加到菜單的輸出,因此使用過濾器 (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 的代碼來設置位置,我認為它是這樣做的:
-
第一項 – ‘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
次佳解決方案
你的原始代碼是非常接近的錢,我認真地認為這個長期的解決方案 @Bainternet(沒有進攻) 是過度的,所以看看這個:
function new_nav_menu_items($items, $args) {
if( $args->theme_location == 'primary' ){
$homelink = '<li class="home"><a href="http://'%20.%20home_url(%20'/'%20)%20.%20'">' . __('Home') . '</a></li>';
$items = $homelink . $items;
}
return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );
您唯一的問題是,在函數檢查正確的菜單後,您沒有返回 $項,並且您缺少進行檢查 ($ args) 所需的第二個回調參數。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。