如何修改WordPress菜单保存逻辑,避免空白标题菜单项被删除?
解决WordPress删除空标题菜单项的问题
我之前做项目时刚好碰到过一模一样的需求,WordPress默认的菜单保存逻辑确实会过滤掉标题为空的菜单项,但咱们可以通过两个钩子组合来完美解决这个问题:
1. 保存菜单时给空标题加占位符
WordPress在保存菜单项时会检查title字段是否为空,为空就直接丢弃。我们可以用wp_save_nav_menu_items钩子,在保存前把空标题替换成一个不可见的零宽空格,让WordPress误以为标题有内容:
add_filter('wp_save_nav_menu_items', 'preserve_empty_title_menu_items', 10, 3); function preserve_empty_title_menu_items($menu_id, $menu_item_db_id, $menu_item_data) { // 检测菜单项标题是否为空(去除首尾空白后判断) if (empty(trim($menu_item_data['title']))) { // 用零宽空格作为占位符(前端不会显示) $menu_item_data['title'] = "\u{200B}"; } return $menu_item_data; }
2. 读取菜单时还原空标题
保存后,我们需要在前端读取菜单项时把占位符还原为空字符串,这样用户看到的就只有图标了。这里用wp_get_nav_menu_items钩子处理:
add_filter('wp_get_nav_menu_items', 'restore_empty_title_menu_items', 10, 3); function restore_empty_title_menu_items($items, $menu, $args) { foreach ($items as $item) { // 把占位符换回空字符串 if ($item->title === "\u{200B}") { $item->title = ''; } } return $items; }
为什么用零宽空格?
零宽空格(\u{200B})是一个不会在页面上显示的特殊字符,既骗过了WordPress的空值检测,又不会影响前端的显示效果,比用空格或者其他可见字符更优雅。
和你的ACF图标字段兼容吗?
完全兼容!你原来用来读取Font Awesome图标的代码不需要任何修改。比如你之前可能是这样在菜单Walker里输出图标的:
// 读取ACF的图标字段 $menu_icon = get_field('menu_icon', $item); if ($menu_icon) { echo '<i class="fa ' . esc_attr($menu_icon) . '"></i>'; } // 输出标题(空的话就不显示) echo esc_html($item->title);
这样处理后,空标题的菜单项就只会显示你设置的Font Awesome图标,不会被WordPress删除啦。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

