
如果您正在 WordPress 中构建主题,并且希望在主题激活时自动生成导航菜单,您可以这样做:
我们需要两个函数来让我们更容易地自动生成导航菜单和菜单项:
Menu Item 创建函数:
function generate_site_nav_menu_item( $term_id, $title, $url ) {
wp_update_nav_menu_item($term_id, 0, array(
'menu-item-title' => sprintf( __('%s', 'text_domain'), $title ),
'menu-item-url' => home_url( '/' . $url ),
'menu-item-status' => 'publish'
) );
}
上面的函数会自动生成一个“自定义链接”,指向我们在 $url 参数中指定的页面。
Menu 创建函数:
function generate_site_nav_menu( $menu_name, $menu_items_array, $location_target ) {
$menu_primary = $menu_name;
wp_create_nav_menu( $menu_primary );
$menu_primary_obj = get_term_by( 'name', $menu_primary, 'nav_menu' );
foreach( $menu_items_array as $page_name => $page_location ){
generate_site_nav_menu_item( $menu_primary_obj->term_id, $page_name, $page_location );
}
$locations_primary_arr = get_theme_mod( 'nav_menu_locations' );
$locations_primary_arr[$location_target] = $menu_primary_obj->term_id;
set_theme_mod( 'nav_menu_locations', $locations_primary_arr );
update_option( 'menu_check', true );
}
示例


让我们创建两个标题菜单,菜单 1 将显示给登录用户,菜单 2 将仅显示给访问者
注册 2 个导航:
primary 和 secondary。
可以在 functions.php 添加代码。
注册导航:
function my_after_setup_theme() {
/**
* Register Navigations
*/
register_nav_menus( array(
'primary' => __('Primary Navigation', 'text_domain'),
'secondary' => __('Secondary Navigation', 'text_domain')
) );
}
add_action( 'after_setup_theme', 'my_after_setup_theme') );
注册菜单:
/**
* Runs when user switches to your custom theme
*
*/
function my_after_switch_theme() {
/**
* Setup the site navigation
*/
$run_menu_maker_once = get_option('menu_check');
if ( ! $run_menu_maker_once ){
/**
* Setup Navigation for : Header Menu - Logged In
*/
$primary_menu_items = array(
'Listings' => 'listings',
'Submit Ad' => 'submit-ad',
'Messages' => 'messages',
'Account' => 'account',
'Logout' => 'account?action=logout' // You need to setup your logout url using wp_logout()
);
generate_site_nav_menu( 'Header Menu - Logged In', $primary_menu_items, 'primary' );
/**
* Setup Navigation for : Header Menu - Logged Out
*/
$secondary_menu_items = array(
'Listings' => 'listings',
'Submit Ad' => 'submit-ad',
'Register' => 'register',
'Login' => 'login'
);
generate_site_nav_menu( 'Header Menu - Logged Out', $secondary_menu_items, 'secondary' );
}
}
add_action( 'after_switch_theme', 'my_after_switch_theme');
- 当您切换/激活主题时,将执行上述功能。
- 仅在选项“MENU_CHECK”不等于1时才执行。
如何输出菜单?
<?php if( is_user_logged_in() ): ?>
<?php wp_nav_menu( array('theme_location' => 'primary', 'fallback_cb' => 'fallback_menu_pages' ) ); ?>
<?php else: ?>
<?php wp_nav_menu( array('theme_location' => 'secondary', 'fallback_cb' => 'fallback_menu_pages' ) ); ?>
<?php endif; ?>
如果您注意到我们添加了一个回调函数,这是在我们的菜单(主要/次要)不存在时调用的函数。将此回调函数添加到您的functions.php:
function fallback_menu_pages() {
$list_pages = '';
$args = array(
'sort_order' => 'asc',
'sort_column' => 'post_title',
'hierarchical' => 1,
'child_of' => 0,
'parent' => -1,
'offset' => 0,
'number' => 5,
'post_type' => 'page',
'post_status' => 'publish'
);
$pages = get_pages( $args );
foreach( $pages as $key => $page ){
$list_pages .= '<li><a href = "' . get_permalink( $page->ID ) . '">' . $page->post_title . '</a></li>';
}
echo $list_pages;
}