如何对自定义菜单项进行硬编码


22

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

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

让我知道是否有任何不清楚的地方。欢迎访问适当的法典页面指南。谢谢!


更新:从此处尝试的代码使用wp_nav_menu_items定位特定菜单

菜单注册:

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

add_action( 'init', 'register_my_menus' );

模板使用:

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

添加新项目的代码:

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文件的导航菜单中添加用于添加新项目的代码时,管理面板的菜单页面中没有任何反应,但是当前菜单项已不在站点中!

Answers:


23

代码的问题在于,它实际上并未将链接添加到菜单,而仅添加了菜单的输出,因此使用了过滤器(add_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 ,我认为这样做是这样的:

  • 第一项-'menu-item-position'=> 1
    • 第一个孩子的第一个孩子-'menu-item-position'=> 1
    • 第一项第二个孩子-'menu-item-position'=> 1
      • 第一项第二个孩子第一个孩子-'menu-item-position'=> 1
  • 第二项-'menu-item-position'=> 2
  • 第三项-'菜单项位置'=> 3
  • 第四项-'菜单项位置'=> 4

这些是我一直在寻找的功能:) Codex不包括这些功能:(还有一个问题,如何将子项添加到Home项中?一旦我进入PC,我会告诉您。谢谢!
Sisir

@Sisir:我更新了一个如何创建子页面的示例
Bainternet 2011年

@Bainternet:第一次运行代码时收到此错误Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25。但是创建了菜单,刷新页面后一切正常,但该Appearance -> Menu Theme Location部分中未显示任何内容。我们真的很接近:)谢谢!
西西尔

@Bainternet:我的猜测是尝试运行代码时代码出错,$locations = get_theme_mod('nav_menu_locations');因此之前的代码(所有菜单插入均完成)被执行,而之后的代码(设置所需的主题位置)未执行。
西西尔

@Sisir:代码工作正常,您的主题位置名称是什么,请告诉我您使用的确切代码,我将看看是否可以提供帮助。
Bainternet 2011年

8

您的原始代码非常接近金钱,我认真地认为@Bainternet的这种长期解决方案(没有违法)是过大的,因此请查看以下内容:

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


您将如何使用这种方法设置菜单项的位置?
Michael N

1

Wordpress 3.4.2中有一个错误:

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');
}

有关用于简单菜单创建的Menu类的示例,请参见https://gist.github.com/4148529


0

有关信息,当前用户必须有权添加术语,我的menu_items已创建,但未添加到表wp_terms_relationship中,然后再添加对wp_set_current_user(1)的调用;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.