为什么此函数也在所有子菜单项上触发?

时间:2017-02-20 作者:timshutes

我正在使用这个简单的函数向菜单中添加一个下拉指示器。然而,我在<li> 那有等级menu-item-has-children. 如何更改此选项,使其仅显示父菜单项上的指示器?

add_filter( \'nav_menu_link_attributes\', \'wpse154485_add_aria_haspopup_atts\', 10, 3 );
function wpse154485_add_aria_haspopup_atts( $atts, $item, $args ) {
  if (in_array(\'menu-item-has-children\', $item->classes)) {
    $args->link_after = "</span><span class=\'caret\'><i class=\'dropdown-indicator\'></i></span>";
  }
  return $atts;
} 
Edit: 根据要求,这里有一个菜单项的vardump,我确实不想显示下拉指示器(但当前正在显示)。

object(WP_Post)#1695 (47) {
  ["ID"]=>
  int(9775)
  ["post_author"]=>
  string(1) "1"
  ["post_date"]=>
  string(19) "2017-01-11 00:23:04"
  ["post_date_gmt"]=>
  string(19) "2017-01-11 05:23:04"
  ["post_content"]=>
  string(0) ""
  ["post_title"]=>
  string(18) "Blog"
  ["post_excerpt"]=>
  string(0) ""
  ["post_status"]=>
  string(7) "publish"
  ["comment_status"]=>
  string(6) "closed"
  ["ping_status"]=>
  string(6) "closed"
  ["post_password"]=>
  string(0) ""
  ["post_name"]=>
  string(16) "blog"
  ["to_ping"]=>
  string(0) ""
  ["pinged"]=>
  string(0) ""
  ["post_modified"]=>
  string(19) "2017-01-25 10:38:11"
  ["post_modified_gmt"]=>
  string(19) "2017-01-25 15:38:11"
  ["post_content_filtered"]=>
  string(0) ""
  ["post_parent"]=>
  int(0)
  ["guid"]=>
  string(29) "http://localhost:8888/?p=9775"
  ["menu_order"]=>
  int(5)
  ["post_type"]=>
  string(13) "nav_menu_item"
  ["post_mime_type"]=>
  string(0) ""
  ["comment_count"]=>
  string(1) "0"
  ["filter"]=>
  string(3) "raw"
  ["db_id"]=>
  int(9775)
  ["menu_item_parent"]=>
  string(4) "9779"
  ["object_id"]=>
  string(4) "9772"
  ["object"]=>
  string(4) "page"
  ["type"]=>
  string(9) "post_type"
  ["type_label"]=>
  string(4) "Page"
  ["url"]=>
  string(34) "http://localhost:8888/blog/"
  ["title"]=>
  string(18) "Blog"
  ["target"]=>
  string(0) ""
  ["attr_title"]=>
  string(0) ""
  ["description"]=>
  string(0) ""
  ["classes"]=>
  array(4) {
    [0]=>
    string(0) ""
    [1]=>
    string(9) "menu-item"
    [2]=>
    string(24) "menu-item-type-post_type"
    [3]=>
    string(21) "menu-item-object-page"
  }
  ["xfn"]=>
  string(0) ""
  ["extended_activate"]=>
  string(0) ""
  ["highlight_menu"]=>
  string(0) ""
  ["extended_columns"]=>
  string(0) ""
  ["extended_heading"]=>
  string(0) ""
  ["extended_disable_link"]=>
  string(0) ""
  ["extended_text_chk"]=>
  string(0) ""
  ["extended_free_text"]=>
  string(0) ""
  ["current"]=>
  bool(false)
  ["current_item_ancestor"]=>
  bool(false)
  ["current_item_parent"]=>
  bool(false)
}
在这种情况下,Blog菜单项是一个子菜单项&;没有“menu item has children”类。但是,它的父项确实包含它。

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

这个$args 参数是整个菜单的参数,而不是单个菜单项的参数,您可以看到它here 在使用和执行过滤器的文件本身中:

@param stdClass$args wp\\u nav\\u menu()参数的对象。

所以当你的IF 如果为true(该项是父项),则您正在修改整个菜单参数:

$args->link_after = "</span><span class=\'caret\'><i class=\'dropdown-indicator\'></i></span>";
因此,父项之后的所有菜单项都将具有下拉指示器。

如果要添加下拉指示器,必须执行经典操作custom walker 这样,您就可以创建自己的类:

class Custom_Nav_Walker extends Walker_Nav_Menu{}
并覆盖start_el 函数,您将找到有关它的大量信息。

相关推荐

Div-Wrap with Functions.php in ChildTheme Using Shorcode!

我只想为一个简单样式的DIV包装器创建一个短代码。在WordPress的网站上,我想添加如下内容:[quotehead]Headline text[/quotehead] ...a normal blockquote from wordpress... 输出应为:<div class=\"block_header\">Headline text</div> 我的内部功能functions.php (在childtheme中)包含以下内容:/**