我有以下代码:
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,因此我们如何修改代码以排除它们?
最合适的回答,由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
.