限制wp_NAV_MENU上的顶级菜单项

时间:2013-08-09 作者:Seth Alling

我遇到了一种情况,需要限制自定义菜单上的顶级菜单项。该设计只有4个固定宽度项目的空间,我想通过展示更多来证明它的未来。

正在查看Is there a way to limit the number of top level items in a custom menu?, 答案提到使用wp_nav_menu_items.

不幸的是,查看wordpress。org论坛和各种博客帖子,我只能添加项目的示例,而不能删除它们。

当我回音时$items, 我只收到完整html中每个菜单项的列表。我对regex还不够好,不知道如何设置一个限制以在4个项目之后停止(并且不确定regex是否真的可以)。

我还尝试使用css通过overflow:hidden, 但这也隐藏了下拉列表,因此这也不是一个选项。

有没有办法通过我的自定义限制顶级项目wp_nav_menu?

2 个回复
最合适的回答,由SO网友:Charles Clarkson 整理而成

该过滤器前面的几行是这一行:

$sorted_menu_items = apply_filters( \'wp_nav_menu_objects\', $sorted_menu_items, $args );
该过滤器在之前传递顶级菜单项对象walk_nav_menu_tree() 被调用。

以下是一些测试代码:

add_filter( \'wp_nav_menu_objects\', \'my_nav_menu_objects\', 10, 2 );

function my_nav_menu_objects( $sorted_menu_items, $args ) {
    wp_die( \'<pre>\' . var_export( $sorted_menu_items, true ) . \'</pre>\' );
}
它在一个三项菜单上进行了测试。两个顶级项目和一个子菜单。

测试页面上只有一个菜单。您可能需要测试中的值$args 在页面上找到正确的菜单。

正如所料,$sorted_menu_items 返回了3个菜单项对象。顶级菜单对象具有\'menu_item_parent\' 属性设置为0。

\'menu_item_parent\' => \'0\',
您可以使用它来查找顶级菜单项的数量。

add_filter( \'wp_nav_menu_objects\', \'my_nav_menu_objects\', 10, 2 );

function my_nav_menu_objects( $sorted_menu_items, $args ) {

    $top_level_menu_item_ids = array();

    foreach ( $sorted_menu_items as $sorted_menu_item ) {
        if ( 0 == $sorted_menu_item->menu_item_parent )
            $top_level_menu_item_ids[] = $sorted_menu_item->ID;
    }

    wp_die( \'<pre>\' . var_export( count( $top_level_menu_item_ids ), true ) . \'</pre>\' );
}
该代码应断开页面并显示顶级菜单项的数量。

我没有编写限制项目数量所需的代码,但请记住,如果删除(取消设置)菜单项父项,还必须删除其所有子项。

下面是另一个测试:

function my_nav_menu_objects( $sorted_menu_items, $args ) {

    // Remove a menu item parent, but leave it\'s child menu item in place.
    unset( $sorted_menu_items[2] );

    return $sorted_menu_items;
}
结果是子菜单看起来像页面上的顶级菜单。

SO网友:Seth Alling

基于offthe response from Charles 我能够完成限制顶部菜单项的代码。它创建顶级菜单项的计数器,然后在4之后将其取消设置。然后,它存储该ID,以便删除将该项作为父项的任何其他项。

/**
 * Limit number of nav menu items on primary menu
 */
function my_nav_menu_objects( $sorted_menu_items, $args ) {
    if ( $args->theme_location != \'primary\' )
        return $sorted_menu_items;
    $unset_top_level_menu_item_ids = array();
    $array_unset_value = 1;
    $count = 1;

    foreach ( $sorted_menu_items as $sorted_menu_item ) {

        // unset top level menu items if over count 4
        if ( 0 == $sorted_menu_item->menu_item_parent ) {
            if ( $count > 4 ) {
                unset( $sorted_menu_items[$array_unset_value] );
                $unset_top_level_menu_item_ids[] = $sorted_menu_item->ID;
            }
            $count++;
        }

        // unset child menu items of unset top level menu items
        if ( in_array( $sorted_menu_item->menu_item_parent, $unset_top_level_menu_item_ids ) )
            unset( $sorted_menu_items[$array_unset_value] );

        $array_unset_value++;
    }

    return $sorted_menu_items;
}
add_filter( \'wp_nav_menu_objects\', \'my_nav_menu_objects\', 10, 2 );

结束

相关推荐

REGISTER_NAV_MENUS和wp_NAV_MENU问题,不显示独立菜单

我的问题是wordpress没有将两个菜单显示为单独的菜单,它只是将菜单上的内容输出到两个位置。URL:http://www.msc-media.co.uk检查页眉和页脚的链接-我知道页脚很难看,以后需要整理css。我在函数中创建了两个菜单。php使用此代码。<?php register_nav_menus( array( \'topmenu\' => \'Top Menu\', \'footermenu\' => \'Fo