在主题开发的过程中,由于兼顾自定义字段与菜单同步输出,导致页脚的菜单因为 html 过滤不严而导致重复的 html 出现,该功能针对在菜单设置时的“ 添加自定义链接”,检查代码后重写:
class Custom_Walker_Nav_Menu extends Walker_Nav_Menu {
// 开始菜单项的输出
function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
// 获取菜单项的标题和链接
$title = apply_filters('the_title', $item->title, $item->ID);
$url = $item->url;
// 获取自定义字段 'footer_menu_en' 的值
$footer_menu_en = get_post_meta($item->ID, 'footer_menu_en', true);
// 生成菜单项的 HTML 结构
$output .= '<li class="menu-item-' . esc_attr($item->ID) . '">';
$output .= '<a href="' . esc_url($url) . '">' . $title; // 不要使用 esc_html,直接输出原始值
// 如果 'footer_menu_en' 字段存在,添加到菜单项的底部
if ($footer_menu_en) {
$output .= '<span>' . esc_html($footer_menu_en) . '</span>';
}
$output .= '</a></li>';
}
}
前端代码引用:
wp_nav_menu(array(
'theme_location' => 'secondary', // 确保在后台注册了这个菜单位置
'container' => 'nav',
'container_class' => 'footer-menu-container', // 设置容器的 CSS 类
'fallback_cb' => false, // 如果没有设置菜单,取消回调函数
'walker' => new Custom_Walker_Nav_Menu() // 使用自定义 Walker 类
));
这段代码定义了一个名为 Custom_Walker_Nav_Menu 的类,它继承自 WordPress 的 Walker_Nav_Menu 类,目的是自定义菜单项的输出。下面是这段代码的详细原理和功能:
原理
1、类的定义:
Custom_Walker_Nav_Menu 类扩展了 WordPress 提供的 Walker_Nav_Menu 类。这允许开发者重写生成菜单项 HTML 的方式。
2、方法重写:
start_el 方法是 Walker_Nav_Menu 类中的一个方法,负责开始输出每个菜单项的 HTML 结构。通过重写这个方法,可以自定义菜单项的输出。
功能
获取菜单项的基本信息:
1、使用 apply_filters(‘the_title’, $item->title, $item->ID) 获取菜单项的标题,并应用任何注册的过滤器,以便可以自定义标题的输出。
通过 $item->url 获取菜单项的链接。
获取自定义字段的值:
2、使用 get_post_meta($item->ID, ‘footer_menu_en’, true) 从菜单项的元数据中获取名为 footer_menu_en 的自定义字段值。这可以用来存储与菜单项相关的额外信息。
生成菜单项的 HTML:
output 变量开始构建一个列表项,其中包含菜单项的 ID。生成一个链接 <a>,链接到菜单项的 URL,并显示菜单项的标题。如果 footer_menu_en 字段存在,则将其值作为一个 元素添加到链接的底部,以便在菜单项中显示。</a> 输出结构:
<li class="menu-item-<item_id>">
<a href="<item_url>"><item_title><span><footer_menu_en_value></span></a>
</li>
总结
通过重写 start_el 方法,Custom_Walker_Nav_Menu 类允许开发者自定义 WordPress 菜单的输出格式,特别是能够根据自定义字段动态地添加额外的信息(如 footer_menu_en 字段)。这使得菜单的展示更加灵活和可定制。