// =================菜单====================
// 菜单存储在:get_option('_nv_nav_menus')
global.register_nav_menus = (opts)=>{
if (!opts) {return;}
add_filter('_nv_nav_menus',(menus)=>{
menus = menus || {};
return {
...menus,
...opts
};
});
}
global.get_registered_nav_menus = ()=>{
return apply_filters('_nv_nav_menus',{});
}
// 要在theme init之后再考虑是否添加左侧菜单项
add_action('_nv_init',()=>{
var registered_nav_menus = get_registered_nav_menus();
if ( Object.keys(registered_nav_menus).length ) {
add_submenu_page({
parent_slug: "appearance",
page_title: "菜单",
menu_title: "菜单",
menu_slug: "nav-menu",
power: 10,
position: 10,
_component: "navMenu"
})
}
},11);
// 获取原始nav_menu
global.nv_get_raw_nav_menu = (names)=>{
// names: 字符串,获取指定的1个menu
// names: Array[String],获取指定的多个menu,返回Object
// 无参数:获取所有注册了的menu,返回Object
var menus = get_option('_nv_nav_menus',{});
var registered_nav_menu_names = Object.keys( get_registered_nav_menus() );
if ( typeof(names) == 'string' ) {
// 获取特定的menu
if ( registered_nav_menu_names.includes(names) ) {
return menus[names] ? menus[names] : [];
} else {
return [];
}
}
if ( Array.isArray(names) ) {
// 获取多个menus
var results = {};
names.forEach(name=>{
// 是否是注册了的 menu
if (registered_nav_menu_names.includes(name)) {
results[name] = menus[name] ? menus[name] : [];
} else {
results[name] = [];
}
})
return results;
}
if ( names == undefined ) {
// 获取所有注册过的全部menu
var results = {};
registered_nav_menu_names.forEach(name=>{
results[name] = menus[name] ? menus[name] : [];
})
return results;
}
return new NV_Error('参数错误');
}
// 处理原始nav_menu:对于post、term类型,要根据实时的Slug加上url、post_slug、post_type、term_slug、taxonomy
// 如果post或term已经被删除的,则要删除。
global.nv_get_nav_menu = (names)=>{
var raw_nav_menu = nv_get_raw_nav_menu(names);
var home_url = get_option('home_url','');
var registered_post_types = apply_filters("_nv_posttypes",[]);
var post_types = registered_post_types
.filter(post_type=> (post_type.opts || {}).show_ui )
.map(post_type=>({
post_type: post_type.post_type,
name: (post_type.opts || {}).label || post_type.post_type
}))
var post_type_slugs = post_types.map(r=>r.post_type);
var registered_taxonomies = apply_filters('_nv_taxonomies',[]);
var taxonomies = registered_taxonomies
.filter(taxonomy=>post_type_slugs.includes(taxonomy.post_type))
.map(taxonomy=>({
taxonomy: taxonomy.taxonomy,
name: ((taxonomy.opts || {}).labels || {}).name || taxonomy.taxonomy,
}))
var taxonomy_slugs = taxonomies.map(r=>r.taxonomy);
var posts = query_posts({
post_type: post_type_slugs,
status: '',
date_query: {},
posts_per_page: 99999,
})
.data.map(({id,title,post_type,slug})=>({
id,title,post_type,slug
}))
var terms = query_terms({
taxonomy: taxonomy_slugs,
terms_per_page: 99999,
})
.data.map(({id,name,slug,taxonomy})=>({
id,name,slug,taxonomy
}))
var deal_nav_menu = (array)=>{
array.forEach(item=>{
if (item.type=='post') {
var post = posts.find(r=>r.id == item.id) || {};
item.error = !post.id;
item.post_type = post.post_type;
item.url = post.id ? get_post_permalink(post.id) : '';
}
if (item.type=='term') {
var term = terms.find(r=>r.id == item.id) || {};
item.error = !term.id;
item.taxonomy = term.taxonomy;
item.url = term.id ? get_term_permalink(term.id) : '';
}
if (item.children) {
deal_nav_menu(item.children);
}
})
}
if ( Array.isArray(raw_nav_menu) ) {
deal_nav_menu(raw_nav_menu);
} else {
Object.keys(raw_nav_menu).forEach(key=>{
deal_nav_menu(raw_nav_menu[key]);
})
}
return raw_nav_menu;
}
global.nv_save_nav_menu = (menu_name, menu_tree) => {
var menus = nv_get_raw_nav_menu(); //参数为空,获取全部注册的菜单
// 有这个menu_name才添加,否则不添加
if (menus[menu_name]) {
menus[menu_name] = menu_tree;
set_option('_nv_nav_menus',menus);
return true;
} else {
return new NV_Error(`菜单未注册:${menu_name}`);
}
}