Number of items in a menu

时间:2016-07-02 作者:Self Designs

我找不到WordPress是否在菜单中存储了项目数。基本上,我需要找出菜单中有多少项,以计算出每个项在标题栏中所占的百分比。是否有功能?或者是实现这一目标的最佳方式WP_Query?

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

我很好奇,决定看看它,不管它是否与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 ) 哪里$argsget_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方法。

希望这能给你一些想法,让你更进一步。

SO网友:Self Designs

谢谢你的帮助,伯吉尔。这让我想了很多。最后,我想出了一个解决方案,使用一个过滤器,我可以计算出菜单上的家长数量。这种方法唯一的问题是,它将在每次显示菜单时运行。

function my_nav_menu_objects($sorted_menu_items, $args) 
{
  if($args->menu == \'header_menu\')
  {
    $counter = 0;

    foreach($sorted_menu_items as $sorted_menu_item)
    {
      if($sorted_menu_item->menu_item_parent == 0) 
      {
        $counter++;
      }
    }

    echo \'Menu Count: \' . $counter;
  }

  return $sorted_menu_items;
}
add_filter(\'wp_nav_menu_objects\', \'my_nav_menu_objects\', 10, 2);
将“header\\u menu”更改为您要检查的导航的slug。然后,您可以将其存储到选项中,并在需要时调用它。

相关推荐

WP_LIST_PAGES显示所有子页面上的所有页面

我有这个代码来在侧边栏上列出我的父页面及其下的所有页面。它在前两个级别上同时显示父页面和子页面,但当我打开第三个级别的页面时,它只在侧边栏上显示当前页面。如何修改它以显示父页面和所有子页面,无论我有多少级的子页面。代码:<?php if ( $post->post_parent ) { $children = wp_list_pages( array( \'title_li\' => \'\'