如何抽象WordPress菜单处理函数,实现基于菜单ID的复用?
如何将重复的WordPress菜单项处理函数抽象为通用函数
咱们先把核心需求理清楚:把两份逻辑重复的菜单处理代码抽成一个通用函数,只需要传入菜单ID,它就能自动获取菜单名称、按菜单名生成对应数组,还能完成统一的字段处理逻辑。下面一步步来实现:
1. 核心思路拆解
- 先通过菜单ID拿到完整的菜单对象,从中提取菜单名称(用来做数组名,记得做下字符清理避免问题)
- 把原本重复的字段处理逻辑封装起来,同时留出适配差异字段的入口
- 用PHP的可变变量或者关联数组,实现“按菜单名命名数组”的需求
2. 具体实现代码
先看最终的通用函数,我会逐段解释:
function get_processed_wp_menu($menu_id) { // 1. 根据菜单ID获取菜单对象,不存在直接返回false $menu = wp_get_nav_menu_object($menu_id); if (!$menu) { return false; } // 2. 清理菜单名称,用作数组名(避免特殊字符导致变量名无效) $menu_slug = sanitize_title_with_dashes($menu->name); // 3. 获取该菜单下的所有菜单项 $raw_menu_items = wp_get_nav_menu_items($menu->term_id); // 4. 初始化处理后的菜单项数组 $processed_items = []; // 5. 统一处理菜单项逻辑,同时兼容差异字段 foreach ($raw_menu_items as $item) { // 基础字段:所有菜单都需要的通用字段 $item_data = [ 'id' => $item->ID, 'title' => $item->title, 'url' => $item->url, 'parent_id' => $item->menu_item_parent ]; // 这里处理不同菜单的差异字段,比如根据菜单ID区分 if ($menu_id === 'primary-menu') { $item_data['custom_btn_text'] = get_post_meta($item->ID, '_custom_button_text', true); } elseif ($menu_id === 'footer-links') { $item_data['icon_class'] = get_post_meta($item->ID, '_menu_icon_class', true); } $processed_items[] = $item_data; } // 6. 按菜单名生成全局变量(可变变量实现),同时返回处理后的数组 global $$menu_slug; $$menu_slug = $processed_items; return $processed_items; }
3. 怎么用这个函数?
非常简单,传入菜单ID就行:
// 获取主菜单,之后直接用 $primary_menu 数组 get_processed_wp_menu('primary-menu'); // 获取底部链接菜单,对应数组是 $footer_links get_processed_wp_menu('footer-links');
4. 优化建议:更灵活的差异字段处理
如果后续菜单越来越多,每次改函数内部判断太麻烦,可以给函数加个自定义字段参数,让调用时动态传差异字段:
function get_processed_wp_menu($menu_id, $custom_fields = []) { // 前面的菜单对象、菜单项获取逻辑不变 foreach ($raw_menu_items as $item) { $item_data = [/* 基础字段 */]; // 遍历传入的自定义字段,动态添加 foreach ($custom_fields as $field_key => $meta_key) { $item_data[$field_key] = get_post_meta($item->ID, $meta_key, true); } $processed_items[] = $item_data; } // 后续变量赋值逻辑不变 global $$menu_slug; $$menu_slug = $processed_items; return $processed_items; } // 使用示例:给主菜单传自定义按钮字段 get_processed_wp_menu('primary-menu', [ 'custom_btn_text' => '_custom_button_text' ]); // 给底部菜单传图标字段 get_processed_wp_menu('footer-links', [ 'icon_class' => '_menu_icon_class' ]);
这种方式扩展性更强,不用每次加新菜单都修改函数内部。
5. 替代方案:用关联数组统一存储
如果你觉得全局可变变量不好维护,也可以把所有菜单存在一个关联数组里,避免全局变量混乱:
function get_processed_wp_menu($menu_id, &$menu_collection = []) { $menu = wp_get_nav_menu_object($menu_id); if (!$menu) return false; $menu_slug = sanitize_title_with_dashes($menu->name); $raw_menu_items = wp_get_nav_menu_items($menu->term_id); $processed_items = []; // 菜单项处理逻辑不变... // 把处理后的数组存入集合 $menu_collection[$menu_slug] = $processed_items; return $menu_collection; } // 使用示例: $all_menus = []; get_processed_wp_menu('primary-menu', $all_menus); get_processed_wp_menu('footer-links', $all_menus); // 访问时用 $all_menus['primary-menu']、$all_menus['footer-links']
内容的提问来源于stack exchange,提问作者nazim
相关产品推荐
相关产品推荐

