我很好奇,决定看看它,不管它是否与CSS问题相关;-)
我首先查看了数据库表,以了解有关菜单结构的更多信息:
菜单-构建块每个导航菜单在nav_menu
分类学
然后,当我们向该菜单添加项目时,我们正在创建该类型的新post对象nav_menu_item
.
现在棘手的是,菜单的树结构存储在哪里?
它不是存储在post_parent
的字段nav_menu_item
职位,如预期。
我们实际上在post meta表中找到了它,它存储在_menu_item_menu_item_parent
元键,针对每个nav_menu_item
邮递
现在有多种方法可以获得计数。以下是几个示例:
示例-get_term_by()
/ wp_get_nav_menu_object()
首先是一个简单的问题:如果我们需要获取特定菜单中的项目数,我们实际上可以从术语查询中获取,因为它存储在
count
的列
wp_term_taxonomy
桌子
首先,我们得到菜单术语:
$menuterm = get_term_by( \'slug\', \'some-menu-slug\', \'nav_menu\' );
这有一个包装器,即:
$menuterm = wp_get_nav_menu_object( \'some-menu-slug\' );
要获取菜单中的项目总数,我们可以使用:
$total_count = ( $menuterm instanceof \\WP_Term ) ? $menuterm->count : 0;
示例-
WP_Query()
/
get_posts()
如果我们只想计算没有父菜单项的菜单项,那么我们可以使用以下方法收集菜单中的所有post对象:
if( $menuterm instanceof \\WP_Term )
$pids = get_objects_in_term( $menuterm->term_id, \'nav_menu\' );
在哪里
$pids
是post ID的数组。
然后我们可以进行以下元查询:
$args = [
\'post__in\' => $pids,
\'post_type\' => \'nav_menu_item\',
\'fields\' => \'ids\',
\'ignore_sticky_posts\' => true,
\'nopaging\' => true,
\'meta_query\' => [
[
\'key\' => \'_menu_item_menu_item_parent\',
\'value\' => 0,
\'compare\' => \'=\',
]
]
];
$count = count( get_posts( $args ) );
还有一种方法:
$q = new WP_Query();
$count = count( $q->query( $args ) );
或者只是:
$count = $q->found_posts;
使用常见的技巧,
posts_per_page
作为1,减少提取的数据。
示例-wp_get_nav_menu_items()
堆芯中有方便的包装,如wp_get_nav_menu_items( $menu, $args )
哪里$args
是get_posts()
参数。
有一种方法:
$count = count(
wp_list_filter(
wp_get_nav_menu_items( \'some-menu-slug\' ),
[ \'menu_item_parent\' => 0 ]
)
);
我们还可以使用:
$args = [
\'meta_query\' => [
[
\'key\' => \'_menu_item_menu_item_parent\',
\'value\' => 0,
\'compare\' => \'=\',
]
]
];
$count = count( wp_get_nav_menu_items( \'some-menu-slug\', $args ) );
示例-过滤器/挂钩有许多过滤器/操作,我们可以挂钩来进行计数,例如
wp_get_nav_menu_items
滤器甚至导航菜单漫游器中的挂钩。
我们甚至可以wp_update_nav_menu
更新菜单时激发。然后,我们可以计算没有父项的项目,并将其存储为术语元数据。
然后还有各种javascript方法。
希望这能给你一些想法,让你更进一步。