当前浏览:首页 / WordPress函数 / register_nav_menus()

register_nav_menus( string[] $locations = array() )

注册主题的导航菜单位置

menumore...

nav

registermore...


参数

$locations

(string[]) (可选) 菜单位置标识符(类似slug)和描述文本的关联数组。

默认值: array()


说明

请参见register_nav_menu()以创建单个菜单,以及导航菜单以添加主题支持。

此函数自动注册主题的自定义菜单支持,因此您不需要调用add_theme_support( 'menus' );

使用wp_nav_menu()显示自定义菜单。

在菜单管理页面上,有一个“显示高级菜单属性”来允许“链接目标”“CSS类”“链接关系(XFN)描述”

使用 get_registered_nav_menus获取已在主题中注册的菜单列表。



源码

查看源码 官方文档


更新日志

版本描述
3.0.0开始引入

使用示例

  • 示例1
    if ( ! function_exists( 'mytheme_register_nav_menu' ) ) {
    
    	function mytheme_register_nav_menu(){
    		register_nav_menus( array(
    	    	'primary_menu' => __( 'Primary Menu', 'text_domain' ),
    	    	'footer_menu'  => __( 'Footer Menu', 'text_domain' ),
    		) );
    	}
    	add_action( 'after_setup_theme', 'mytheme_register_nav_menu', 0 );
    }
    
  • 示例2

    重构菜单slug:

    如果您只是重命名注册菜单位置的slug,它将从前端消失。这意味着您需要将菜单重新分配到仪表板中的新位置。

    为了编辑菜单位置的slug,同时自动保留先前分配的菜单,请在register_nav_menu()中重命名slug后自定义并使用以下代码段:

    function cebbi_update_menu_location() {
    
    	// Get assigned menus from theme mods
    	$nav_menu_locations = get_theme_mod('nav_menu_locations');
    
    	// Check if old-slug was previously assigned
    	if (isset($nav_menu_locations['old-slug'])) {
    
    		// Verify that new location does not yet exist or is empty to avoid overwriting manual changes
    		if (!isset($nav_menu_locations['new-slug']) || $nav_menu_locations['new-slug'] === 0) { 
    
    			// Copy assigned menu index to new location
    			$nav_menu_locations['new-slug'] = $nav_menu_locations['old-slug'];
    
    			// Optional: delete the menu assignment to the old location
    			unset($nav_menu_locations['old-slug']);
    
    			// Update theme mod
    			set_theme_mod('nav_menu_locations', $nav_menu_locations);
    		}
    	}
    }
    add_action('after_setup_theme', 'cebbi_update_menu_location');
    

    此外,不要忘记更新用于显示菜单的slug(wp_nav_menu()has_nav_menu())。

    在删除分配的菜单之前,您可以使用get_registered_nav_menus()来验证old-slug是否未在主题中注册。

  • 示例3

    示例

    register_nav_menus( array(
    	'pluginbuddy_mobile' => 'PluginBuddy Mobile Navigation Menu',
    	'footer_menu' => 'My Custom Footer Menu',
    ) );
    
    
  • 示例4

    从自定义分类创建菜单。

    例如:我有一个名为“Country”的自定义分类法,列表中有几个国家
    现在我想为每个国家分配一个私有名称,并将其作为前端显示的条件。

    $tax = 'country-category';
    
    $terms = get_terms( $tax, [
    'hide_empty' => false,
    ]);
    
    $args = array(
    'primary' => __( 'Primary Menu', 'khoipro' ),
    'secondary' => __( 'Secondary Menu', 'khoipro' )
    );
    
    // Loop through all terms to add term id as menu id and term name as menu name.
    foreach( $terms as $term) {
    $args = array_merge($args, array(
    'primary_'.$term->slug => 'Country Menu ('.$term->name.')'
    ));
    }
    
    register_nav_menus( $args );
    

    因此,我的输出代码应该显示在菜单中>管理位置:

    * Primary Menu (id: primary)
    * Secondary Menu (id: secondary)
    * Country Menu (Japan) (id: primary_japan)
    * Country Menu (Singapore) (id: primary_singapore)
    * Country menu (Vietnam) (id: primary_vietnam)

    用一个新创建的项目在实际实践中进行证明。

  • 示例5
    //function to add nav menu in Navigation Bar and Footer Bar:
    
    function add_nav_menus() {
        register_nav_menus( array(
            'nav menu'=>'Navigation Bar',
            'footer menu'=> 'Footer Bar',
        ));
    }
    add_action('init', 'add_nav_menus');