我对公认的答案有一些问题-这并不意味着它是错的,但我会在下面发布我自己的代码,我觉得对一些人来说可能会有更好的结果,因为我有同样的问题,但想用更少的代码做同样的事。
首先,上面的代码创建了“URL”类型的导航项,这对一些人来说很好,但我想链接到页面,而不是URL,因为这是WordPress导航的一个重要功能,客户端不可避免地会移动东西,所以我从不使用URL nav项目类型。
此外,发布的代码只处理子元素的平面数组。我创建了一个函数,用于递归声明新的nav项,存储它们返回的元数据(主要是在循环中创建后的ID),以及一个用于接受子项的参数。
只需编辑$nav_items_to_add
其余部分是递归处理的。每个数组中有3个必需的键。首先,数组键是slug,所以\'shop\' => array( ... )
这是你想要的一页shop
. [\'title\']
是导航项目在前端标记的方式。path
是WordPress页面层次结构中页面的路径,因此如果页面是顶级父级,并且如果shop
是的孩子home
那就是\'path\' => \'home/shop\'
.
最后一个可选的数组键是[\'parent\']
可以将数组中的另一个键声明为当前键的父键。需要注意的是,这些项是递归添加的,因此在创建子项之前,父项必须存在。这意味着父nav项的声明应该在其子项之前进行。
$locations = get_nav_menu_locations();
if (isset($locations[\'primary_navigation\'])) {
$menu_id = $locations[\'primary_navigation\'];
$new_menu_obj = array();
$nav_items_to_add = array(
\'shop\' => array(
\'title\' => \'Shop\',
\'path\' => \'shop\',
),
\'shop_l2\' => array(
\'title\' => \'Shop\',
\'path\' => \'shop\',
\'parent\' => \'shop\',
),
\'cart\' => array(
\'title\' => \'Cart\',
\'path\' => \'shop/cart\',
\'parent\' => \'shop\',
),
\'checkout\' => array(
\'title\' => \'Checkout\',
\'path\' => \'shop/checkout\',
\'parent\' => \'shop\',
),
\'my-account\' => array(
\'title\' => \'My Account\',
\'path\' => \'shop/my-account\',
\'parent\' => \'shop\',
),
\'lost-password\' => array(
\'title\' => \'Lost Password\',
\'path\' => \'shop/my-account/lost-password\',
\'parent\' => \'my-account\',
),
\'edit-address\' => array(
\'title\' => \'Edit My Address\',
\'path\' => \'shop/my-account/edit-address\',
\'parent\' => \'my-account\',
),
);
foreach ( $nav_items_to_add as $slug => $nav_item ) {
$new_menu_obj[$slug] = array();
if ( array_key_exists( \'parent\', $nav_item ) )
$new_menu_obj[$slug][\'parent\'] = $nav_item[\'parent\'];
$new_menu_obj[$slug][\'id\'] = wp_update_nav_menu_item($menu_id, 0, array(
\'menu-item-title\' => $nav_item[\'title\'],
\'menu-item-object\' => \'page\',
\'menu-item-parent-id\' => $new_menu_obj[ $nav_item[\'parent\'] ][\'id\'],
\'menu-item-object-id\' => get_page_by_path( $nav_item[\'path\'] )->ID,
\'menu-item-type\' => \'post_type\',
\'menu-item-status\' => \'publish\')
);
}
}