换句话说:如何以编程方式插入/创建自定义菜单项?
让我知道是否有任何不清楚的地方。欢迎访问适当的法典页面指南。谢谢!
更新:从此处尝试的代码使用wp_nav_menu_items定位特定菜单
菜单注册:
function register_my_menus() {
register_nav_menus(
array('main-menu' => __( 'Main Menu' ) )
);
}
add_action( 'init', 'register_my_menus' );
< br模板用途:
<?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
文件的导航菜单中添加新项目的页面,在管理面板的菜单页面中什么也没有发生,但是当前菜单项已不在站点中!#1 楼
代码的问题在于,它实际上并未将链接添加到菜单,而仅添加了菜单的输出,因此使用了过滤器(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
第四项-'菜单项位置'=> 4
#2 楼
您的原始代码非常接近金钱,我认真地认为@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)。
评论
您将如何使用此方法设置菜单项的位置?
–user37474
2014年11月4日在1:05
#3 楼
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');
}
有关简单创建菜单的Menu类的示例,请参见https://gist.github.com/4148529。
评论
这些是我一直在寻找的功能:) Codex不包括这些功能:(还有一个问题,如何将子项添加到Home项中?一旦我进入PC,我会立即通知您。谢谢!
–西西尔
11年4月24日在17:42
@Sisir:我用示例更新了如何创建子页面
–互联网
2011年4月25日在0:12
@Bainternet:第一次运行代码时遇到此错误致命错误:无法在第25行的C:\ wamp \ www \ citystir \ wp-admin \ menu.php中将stdClass类型的对象用作数组。但是会创建菜单并页面刷新后,一切正常,但外观->菜单主题位置部分中未显示任何内容。我们真的很接近:)谢谢!
–西西尔
11年4月28日在19:36
@Bainternet:我的猜测是,尝试运行代码$ locations = get_theme_mod('nav_menu_locations');时,代码出错。因此,之前的代码(完成所有菜单插入)将被执行,而之后的代码(设置所需的主题位置)将不会执行。
–西西尔
11年4月28日在19:48
@Sisir:代码工作正常,您的主题位置名称是什么,请告诉我您使用的确切代码,我看看是否可以提供帮助。
–互联网
11年4月29日在0:26