注册_NAV_MENUS,然后以编程方式创建菜单

时间:2013-02-22 作者:jammypeach

我有一个register_nav_menus 调用我的主题函数。php:

//register nav menu and footer nav.
register_nav_menus(
    array(
        \'main-nav\'   => \'Main Navigation\',
        \'footer-nav\' => \'Footer Navigation\'
    )
);
这很好,但我想采取额外的步骤,通过编程创建菜单并将其分配到“主导航”,设置为自动添加新页面。

这个主题被用作wordpress安装的起点,所以我想包括这个功能,以节省一些重复性任务的时间,例如通过外观->菜单手动创建这些菜单。

有人知道怎么做吗?

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

根据对这个问题的回答,找出了如何做到这一点:Programmatically add a Navigation menu and menu items

我根据自己的需要调整了答案,即创建导航菜单并将其分配到我已经定义的位置:

//register nav menu and footer nav.
register_nav_menus(
    array(
        \'main-nav\'   => \'Main Navigation\',
        \'footer-nav\' => \'Footer Navigation\'
    )
);

//now see if the main navigation menu is there - if not, create it.
if (!wp_get_nav_menu_object(\'Main Navigation\'))
{
    $menu_id = wp_create_nav_menu(\'Main Navigation\'); //create the menu
    $locations = get_theme_mod(\'nav_menu_locations\'); //get the menu locations
    $locations[\'main-nav\'] = $menu_id; //set our new menu to be the main nav
    set_theme_mod(\'nav_menu_locations\', $locations); //update 
}
这样做的缺点是,如果管理员删除了主导航菜单,它将再次被创建(这可能会很烦人)——因此我在一个只在主题安装时运行一次的函数中包含了创建菜单代码。没有使用此代码添加的页面,但定义了合适的菜单并已将其分配给主题位置,这将简化使用我的主题创建网站的非编码人员的工作,并且不再询问为什么在尚未创建导航菜单的情况下,某些页面会显示在导航菜单中:)

SO网友:Chip Bennett

无需通过编程方式创建/更新自定义菜单,只需执行您正在尝试的操作即可。

仅仅依靠wp_nav_menu() 回退,wp_page_menu(), 或者定义自己的自定义回调,例如输出wp_list_pages().

调用此:

`wp_nav_menu( array( \'theme_location\' => \'main-nav\' ) );`
。。。如果没有为指定自定义菜单\'main-nav\' 主题位置,输出:

`wp_page_menu()`.
如果需要更细粒度的控制,例如显式控制菜单深度,可以执行以下操作:

wp_nav_menu( array(
    \'theme_location\' => \'main-nav\',
    \'depth\' => 3,
    \'container_class\' => \'nav\',
    \'menu_id\' => \'main-nav\',
    \'fallback_cb\' => \'wpse87933_main_nav_cb\'
) );
。。。然后定义回调,如下所示:

function wpse87933_main_nav_cb() {
    ?>
    <div class="nav">
        <ul id="main-nav">
            <?php
            wp_list_pages( array(
                \'depth\' => 3,
                \'title_li\' => \'\'
            ) );
            ?>
        </ul>
    </div>
    <?php
}
您甚至可以通过使用has_nav_menu() 有条件的:

if ( has_nav_menu( \'main-nav\' ) ) {
    wp_nav_menu( array(
        \'theme_location\' => \'main-nav\',
        \'depth\' => 3,
        \'container_class\' => \'nav\',
        \'menu_id\' => \'main-nav\'
    ) );
} else {
    ?>
    <div class="nav">
        <ul id="main-nav">
            <?php
            wp_list_pages( array(
                \'depth\' => 3,
                \'title_li\' => \'\'
            ) );
            ?>
        </ul>
    </div>
    <?php  
}
此时,您只需注意这3个函数之间的CSS类差异:

结束

相关推荐

Remove menus and submenus

所以我找到了一些方便的代码片段来帮助删除管理菜单项。但是,我对子菜单项有问题。我想保留外观菜单,但去掉主题、小部件和编辑器。function remove_menus() { global $menu; global $current_user; get_currentuserinfo(); if($current_user->user_login == \'username\') { $restricted = array(__(\'