按顺序将菜单链接添加到默认(顶部)或页脚菜单

时间:2020-09-14 作者:Steve Devine

我需要创建一个菜单-添加链接到它,然后使其处于活动状态-所有这些都是在激活时从我的插件中创建的。我已经能够创建菜单并添加链接。但它不会变为“活动”,我可以通过WP界面进入并查看菜单,然后将其添加到;页脚(&Q);或将其设为默认值“;“顶部”;但所有这些都需要用户输入。我希望它是由插件激活完成。代码如下:

    $menu_name   = \'Simple Inventory Menu\';
$Simple_menulocation = \'simple-inventory-menu\';

$menu_exists = wp_get_nav_menu_object( $menu_name );
 
// If it doesn\'t exist, let\'s create it.
if ( ! $menu_exists ) {
    $menu_id = wp_create_nav_menu($menu_name);
 
    // Set up default menu items
    wp_update_nav_menu_item( $menu_id, 0, array(
        \'menu-item-title\'   =>  __( \'Home\', \'textdomain\' ),
        \'menu-item-classes\' => \'home\',
        \'menu-item-url\'     => home_url( \'/\' ), 
        \'menu-item-status\'  => \'publish\'
    ) );
 
    wp_update_nav_menu_item( $menu_id, 0, array(
        \'menu-item-title\'  =>  __( \'Admin\', \'textdomain\' ),
        \'menu-item-url\'    => home_url( \'/index.php/admin/\' ), 
        \'menu-item-status\' => \'publish\'
    ) );
}


if( !has_nav_menu($Simple_menulocation) ){
        $locations = get_theme_mod(\'nav_menu_locations\');
        $locations[$Simple_menulocation] = $menu_id;
        set_theme_mod( \'nav_menu_locations\', $locations );
    }

1 个回复
SO网友:Max Yudin

您必须先注册菜单位置。

此外,我还添加了else 确认声明$menu_id 当菜单存在时定义。否则,您将看到PHP关于未定义变量的通知。WP_DEBUG 开发时必须打开,这就是为什么你看不到通知的原因。

// Initialize name and location
$menu_name     = \'Simple Inventory Menu\';
$menu_location = \'simple-inventory-menu\';

// Register the location:
register_nav_menus(
    array(
        $menu_location => $menu_name,
    )
);

$menu_exists = wp_get_nav_menu_object( $menu_name );

// If it doesn\'t exist, let\'s create it.
if ( ! $menu_exists ) {
    $menu_id = wp_create_nav_menu( $menu_name );

    // Set up default menu items
    wp_update_nav_menu_item( $menu_id, 0, array(
        \'menu-item-title\'   =>  __( \'Home\', \'textdomain\' ),
        \'menu-item-classes\' => \'home\',
        \'menu-item-url\'     => home_url( \'/\' ),
        \'menu-item-status\'  => \'publish\',
    ) );

    wp_update_nav_menu_item( $menu_id, 0, array(
        \'menu-item-title\'  =>  __( \'Admin\', \'textdomain\' ),
        \'menu-item-url\'    => home_url( \'/index.php/admin/\' ),
        \'menu-item-status\' => \'publish\',
    ) );
} else {
    $nav_menu = get_term_by( \'slug\', $menu_location, \'nav_menu\' );
    $menu_id  = $nav_menu->term_id;
}

if ( ! has_nav_menu( $menu_location ) ) {
        $locations = get_theme_mod( \'nav_menu_locations\' );
        $locations[ $menu_location ] = $menu_id; // no PHP notice here now
        set_theme_mod( \'nav_menu_locations\', $locations );
}
您可以展开代码以清理修改的\'nav_menu_locations\' 在插件停用时。看见register_deactivation_hook.

Complemented according the OP comment

如果您已经注册了菜单位置(取决于您使用的主题和导航菜单相关插件),并且希望菜单显示在那里,只需更改$menu_location 值设置为现有位置(例如,“页脚导航”或“主导航”),并跳过register_nav_menus()

缺点是,由于命名差异,此代码无法与任何主题一起使用。为了使代码具有通用性,必须根据成熟的需求规范重写代码。

NO! Don\'t do the exposed above!

你会有很多问题。等我找到正确的路。我也知道在哪里可以使用你所说的菜单。这就是为什么我会开发它,直到他们共同工作的解决方案。