问题描述
有没有办法,我可以硬编码的第一个主题安装时的自定义菜单项?我正在创建一个主题,它将在安装时自动使一些常见页面。所以我需要知道,如果我也可以添加到 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="' . home_url( '/' ) . '">' . __('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="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
$items = $homelink . $items;
}
return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );
您唯一的问题是,在函数检查正确的菜单后,您没有返回 $项,并且您缺少进行检查 ($ args) 所需的第二个回调参数。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。