Ermitteln Sie, ob ein Navigationselement untergeordnete Elemente enthält

Ich versuche herauszufinden, ob ein Gegenstand einen Unterpunkt mit der Tiefe 1 oder höher hat. Ich kann nirgends finden, wenn es eine function / Abfrage gibt, die ich schreibe, die das aktuelle Element in die database einfügt, wenn es irgendwelche Unterseiten hat und true zurückgibt.

Was ich damit erreichen möchte, ist die

  • -class eine andere class abhängig von der Tatsache, wenn der Menüpunkt einen Unterpunkt hat.

    Der Ausschnitt aus dem Code für das, was ich bisher habe:

     if ($depth == 0) { if( /*page has subpages*/ ) { $class_names = $class_names ? ' class="menu-enable"' : ''; } else { $class_names = $class_names ? '' : ''; } } else { $class_names = $class_names ? ' class="sub-menu-enable"' : ''; } 

    Jetzt brauche ich etwas Code, der auf der Seite Unterseiten hat . Wie kann ich übergeordnete Elemente erkennen?

    Bearbeiten:

    Vollständige benutzerdefinierte Walker-class jetzt:

      class header_walker extends Walker_Nav_Menu { /** * @see Walker::start_lvl() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param int $depth Depth of page. Used for padding. */ function start_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat("\t", $depth); $output .= "\n
  • $indent\n"; } /** * @see Walker::start_el() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param int $current_page Menu item ID. * @param object $args */ function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; /* // values of depth echo $item->title.' - '; echo $depth.'
    '; echo $class_names; if ($depth == 0) { if( check for subpage ) { $class_names = $class_names ? ' class="menu-enable"' : ''; } else { $class_names = $class_names ? '' : ''; } } else { $class_names = $class_names ? ' class="sub-menu-enable"' : ''; }*/ $output .= $indent . '
  • '; $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : ''; $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : ''; $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : ''; $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : ''; $item_output = $args->before; $item_output .= ''; $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after; $item_output .= ''; $item_output .= $args->after; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } /** * @see Walker::end_el() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Page data object. Not used. * @param int $depth Depth of page. Not Used. */ function end_el( &$output, $item, $depth = 0, $args = array() ) { $output .= "
  • \n"; }

    }

    Solutions Collecting From Web of "Ermitteln Sie, ob ein Navigationselement untergeordnete Elemente enthält"

    Sie können wp_nav_menu_objects filtern und die classn in einer Eile hinzufügen. Sie brauchen nicht einmal einen benutzerdefinierten Walker dafür.

     add_filter( 'wp_nav_menu_objects', 'add_has_children_to_nav_items' ); function add_has_children_to_nav_items( $items ) { $parents = wp_list_pluck( $items, 'menu_item_parent'); foreach ( $items as $item ) in_array( $item->ID, $parents ) && $item->classes[] = 'has-children'; return $items; } 

    Die class has-children wird nun automatisch den passenden li Elementen zugewiesen.

    In einem benutzerdefinierten Walker finden Sie die class in $item->classes in Ihrer function start_el() . Die folgenden Zeilen vom Standard-Walker werden den Trick machen:

     $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; 

    Ab WordPress 3.7 (Oktober 2013) wurden CSS-classn hinzugefügt, um untergeordnete Menüelemente und Seiten in Themamenüs anzuzeigen. Es ist nicht erforderlich, einen benutzerdefinierten Walker zu verwenden, wie es im WordPress-core erledigt wird.

    Die CSS-classn heißen menu-item-has-children und page_item_has_children .

    Die resultierende HTML-Ausgabe ähnelt der folgenden (zur besseren Übersichtlichkeit vereinfacht):