菜单步行者:如何辨别一个子菜单是否包含子菜单?

时间:2019-03-14 作者:Luca Reghellin

我的意思是:

<ul>
  <li>
    <ul class="sub-menu">
      <li>
        <ul>
          <li></li>
          <li></li>
          <li></li>
        </ul>
      </li>
      <li></li>
      <li></li>
    </ul>
  </li>

  <li>
    <ul class="sub-menu">
      <li></li>
      <li></li>
      <li></li>
    </ul>
  </li>
  <li></li>
</ul>
我需要在第一个大的子菜单中添加一个exra类。换句话说,我需要以不同的方式为包含更多子菜单的子菜单设置样式,而不是仅包含最终列表项的子菜单。

我可以延长Walker_Nav_Menu 类,但在查看它之后,似乎无法知道子菜单何时将包含其他子菜单,因为没有关于其子菜单的可用数据。

显然地

那又怎样?

2 个回复
SO网友:La Chouette Informatique

我可以扩展Walker\\u Nav\\u Menu类,但在查看它之后,似乎无法知道子菜单何时将包含其他子菜单,因为没有关于其子菜单的可用数据

你可能想再看看,伙计。

这个Walker::display_element(...) 方法将“要继续遍历的元素列表”(了解子元素列表)作为第二个参数:array$children\\u elements

如果你做了

var_dump($children_elements);
您将看到菜单中的每个条目。为了知道条目是否包含子元素,可以检查$children\\u elements[$id]是否为空,其中$id是相关元素的id:

$this->has_children = ! empty( $children_elements[ $id ] );
因此,您可以检查菜单中的每个条目是否有子项,如果有,请检查是否有任何子项有自己的子项:

<?php
/**
* menu_walker
*
* @since 1.0.0
* @package My Theme Wordpress
*/

if ( ! class_exists( \'MyThemeWP_Top_Menu_Walker\' ) ) {
class MyThemeWP_Top_Menu_Walker extends Walker_Nav_Menu {

  /**
  * Find menu elements with children containing children and give them the super-parent-class class
  * Then call the default display_element method
  */
  public  function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ){
    if ( ! $element ) {
      return;
    }

    $id_field = $this->db_fields[\'id\'];
    $id = $element->$id_field; 

    //var_dump($children_elements[ $id ]); // List the children elements of the element with $id

    $this->has_children = ! empty( $children_elements[ $id ] );
    if ( isset( $args[0] ) && is_array( $args[0] ) ) {
      $args[0][\'has_children\'] = $this->has_children; // Back-compat.
    }

    // If this element have children
    if ( ! empty( $children_elements[$id] ) //&& ( $depth == 0 ) // Remove this comment to apply the super-parent-class only to root elements
    //|| $element->category_post != \'\' && $element->object == \'category\'
    ) {

      // var_dump($children_elements[$id]);

      // Loop through it\'s children
      foreach ($children_elements[$id] as &$child_element) {
        //var_dump($child_element->ID);
        //var_dump(! empty( $children_elements[$child_element->ID] ));

        // If this child has children of it\'s own, add super-parent-class to it\'s parent
        if ( ! empty( $children_elements[$child_element->ID] ) ){
          $element->classes[] = \'super-parent-class\';
        }
      }
    }

    // Call default method from virtual parent class
    parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }

  } // class MyThemeWP_Top_Menu_Walker END
}
?>

SO网友:Luca Reghellin

这不是一个真正的答案,而是一个真正的解决方案,至少对首要任务来说是这样的:风格不同。

我仍然不知道如何通过php判断菜单是否有其他子菜单,但事实上我知道这一点,因为我使用管理编辑器手动构建了菜单。因此,当are项包含其他深层子菜单时,我可以通过admin向它们项添加一个类,然后相应地设置样式。

相关推荐

WordPress自定义Walker菜单类

嘿,伙计们,我正在自定义wordpress walker类,以便将自定义类添加到导航级别。基本上有三个级别的导航。代码如下:<ul class=\"rd-navbar-nav\"> <li class=\"rd-nav-item active\"><a class=\"rd-nav-link\" href=\"#\">Home</a></li> <li class=\"rd-nav-item rd-navbar--h