以编程方式添加菜单项功能可在多个菜单中复制

时间:2015-12-24 作者:pixelkicks

我有以下代码:

add_filter( \'wp_nav_menu_objects\', \'dynamically_add_shop_categories_to_submenu\' );
function dynamically_add_shop_categories_to_submenu( $items ) {        
    $taxonomy_name = array( 
        \'shop-category\'
    );                
    $args = array(
        \'orderby\'    => \'name\', 
        \'order\'      => \'ASC\',
        \'hide_empty\' => true, 
        \'fields\'     => \'all\', 
        \'exclude\'    => \'160\',
    );
    $terms = get_terms( $taxonomy_name, $args );
    $base = \'http://\' . $_SERVER[\'HTTP_HOST\'] . \'/businesses/\';
    $bc = \'&shop-category=\';
    $bt = \'?business-type=shops\';             
    foreach ( $terms as $term ) {
        $shops = array (
            \'title\'            => $term->name,
            \'menu_item_parent\' => 1157,
            \'ID\'               => \'\',
            \'db_id\'            => \'\',
            \'url\'              => $base . $bt . $bc . $term->slug
        );        
        $items[] = (object) $shops;
    }
    return $items;    
}
这成功地将“shop category”分类中的子菜单项添加到ID为1157的顶级菜单中。这正如预期的那样。

有更多顶级菜单不受此影响,这是正确的,因为我们只指定将这些项目添加到1157菜单中。

然而,在我们网站的底部,我们还有三个菜单,所有这些菜单都添加了这些子菜单。为什么代码会这样做?菜单似乎没有任何ID,因此我们如何修改代码以排除它们?

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

可以使用第二个输入参数$args 以特定菜单为目标。

下面是一个示例,其中包含一些检查,您可以根据需要进行调整:

add_filter( \'wp_nav_menu_objects\', function( $sorted_menu_items, $args )
{
    if( 
           \'primary\' === $args->theme_location   // Alternative
        && \'some_menu_slug\' === $args->menu->slug  // Alternative
    ) {
        // Your stuff here ...
    }
    return $sorted_menu_items;
}, 10, 2 );
添加菜单项时,将在wp_posts 桌子这是您所指的ID。当我们删除它并再次添加它时,我们将获得一个新ID。因此,最好以菜单主题位置或菜单段塞为目标。

在示例中附加自定义菜单项时menu_item_parent 在当前菜单中不存在,则应将其作为项目添加到菜单中menu_item_parent = 0.