将SPAN添加到名为“Main”的WordPress菜单的顶级链接

时间:2017-06-28 作者:user3643520

我想在wordpress菜单“main”的顶层链接中添加一个span。

所需的html输出(为了清晰的视觉效果而删除了wordpress类)如下所示:

    <ul>
    <li><a href="#"><span>Link</span></a></li>
    <li><a href="#"><span>Link</span></a>
        <ul>
            <li><a href="#">Sub Link (no span)</a></li>
            <li><a href="#">Sub Link (no span)</a></li>
            <li><a href="#">Sub Link (no span)</a></li>
        </ul>
    </li>
    <li><a href="#"><span>Link</span></a></li>
    <li><a href="#"><span>Link</span></a></li>
    </ul>
    

不久前,我在google(很可能是堆栈溢出,不记得在哪里)时发现了这个wordpress过滤器,它很好地增加了跨度,但它将其添加到我主题中的每个菜单中。

add_filter( \'wp_nav_menu_objects\', function( $items ) {
      foreach ( $items as $item ) {
        if (!$item->menu_item_parent) {
           $item->title = \'<span>\' . $item->title . \'</span>\';
        }
    }
    return $items;
});
第一季度。有没有办法将此过滤器添加到名为main的菜单中?

第二季度。这是实现这一目标的最佳过滤器/方法吗?

谢谢你的帮助。

1 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

$args, 第二个参数传递给wp_nav_menu_objects 可用于检查正在处理的菜单。这将允许我们仅针对所需的菜单。

在下面的代码中,我们检查菜单的slug是否main 如果是这样,请将顶级菜单项包装在span标记中。

/**
 * Filters the sorted list of menu item objects before generating the menu\'s HTML.
 *
 * @param array    $sorted_menu_items The menu items, sorted by each menu item\'s menu order.
 * @param stdClass $args              An object containing wp_nav_menu() arguments.
 */
add_filter( \'wp_nav_menu_objects\', \'wpse_wp_nav_menu_objects\', 10, 2 );
function wpse_wp_nav_menu_objects( $sorted_menu_items, $args  ) {
    // Only modify the "main" menu.
    if ( ! isset( $args->menu->slug ) || \'main\' !== $args->menu->slug ) {
        return $sorted_menu_items;
    }

    // Loop over the menu items wrapping only top level items in span tags.
    foreach ( $sorted_menu_items as $item ) {
        if ( ! $item->menu_item_parent ) {
            $item->title = \'<span>\' . $item->title . \'</span>\';
        }
    }

    return $sorted_menu_items;
}
从技术上讲,上面的过滤器将对所有菜单运行,但随着我们的签入到位,它将只影响所需的菜单。

是否wp_nav_menu_objects 是否是最好的过滤器还有待讨论,但我认为这很适合解决手头的问题。这当然比使用一个更晚的过滤器要好,例如wp_nav_menu_items, wp_nav_menu_{$menu->slug}_items, 或wp_nav_menu 这需要解析菜单的HTML。

结束

相关推荐

添加到数组并通过do_action/Apply_Filters传递它

作为练习,我正在使用PHPclass to add meta boxes 我在GitHub上找到了。我只是复制了代码,现在我正在玩它来理解它。其工作原理如下:包含该类的文件包含在init中。在该文件内部,但在类外部,有一个空数组$meta_boxes 已初始化之后,使用apply_filters. 我猜是apply_filters 使用而不是do_action 因为后者不返回任何内容——$meta_boxes = apply_filters( \'cmb_meta_boxes\', $meta_boxes