如何硬编码自定义菜单项

时间:2011-04-23 作者:Sisir

在安装第一个主题时,有没有办法对自定义菜单项进行硬编码?我正在创建一个主题,安装后会自动生成一些常用页面。所以我需要知道我是否也可以将它们添加到Wordpress自定义菜单中,以便客户端不需要手动添加它们?

换句话说:如何以编程方式插入/创建自定义菜单项?

如果有什么不清楚的地方,请告诉我。欢迎使用相应的codex页面指南。谢谢

<小时>update: 从此处尝试了代码Targeting specific menu with wp_nav_menu_items

Menu registration:

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

add_action( \'init\', \'register_my_menus\' );

Template use:

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

Code for adding new items:

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 管理面板的菜单页面中没有文件,但当前菜单项已在站点中消失!

4 个回复
最合适的回答,由SO网友:Bainternet 整理而成

代码的问题在于,它实际上并没有将链接添加到菜单,而只是添加到菜单的输出,因此使用了过滤器(add\\u 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第一项第一子项-“菜单项位置”1第一项第二子项-“菜单项位置”2第三项-“菜单项位置”3第四项-“菜单项位置”4

SO网友:Foxinni

您的原始代码是very close 为了钱,我认真地认为@Bainernet的这个长期解决方案(没有冒犯)是过分的,所以请看一下这个:

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)。

SO网友:OzzyCzech

Wordpress 3.4.2中有一个bug:

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 有关用于简单菜单创建的菜单类的示例。

SO网友:Grégocentrique

有关信息,当前用户必须获得添加条款的权限,在我添加对wp\\U set\\u current\\u user(1)的调用之前,已创建了我的菜单项,但未将其添加到表wp\\U terms\\u关系中;

结束

相关推荐

Menu API not switching menus?

我正在使用菜单API,我想切换到其他菜单,但出于某种原因,它保留了第一个菜单这是我的密码在函数中。php add_action( \'init\', \'register_my_menus\',10 ); function register_my_menus() { register_nav_menu(\'main-navigation\', \'Main Navigation\'); } 下面是我的主题文件(header.ph