has_children in benutzerdefinierter nav_walker

Ich versuche, ein benutzerdefiniertes Menü Nav Walker zu erstellen. Ich habe den folgenden Code hinzugefügt

function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) { $id_field = $this->db_fields['id']; if ( is_object( $args[0] ) ) { $args[0]->has_children = ! empty( $children_elements[$element->$id_field] ); } return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); } 

Als Ergebnis kann ich die statement if ($ args-> has_children) in meiner function start_el verwenden, leider scheint derselbe Code nicht in der function end_el zu funktionieren.

Gesamter Code:

 class CSS_Menu_Walker2 extends Walker { /** * What the class handles. * * @see Walker::$tree_type * @since 3.0.0 * @var string */ public $tree_type = array( 'post_type', 'taxonomy', 'custom' ); /** * Database fields to use. * * @see Walker::$db_fields * @since 3.0.0 * @todo Decouple this. * @var array */ public $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' ); /** * Starts the list before the elements are added. * * @see Walker::start_lvl() * * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param int $depth Depth of menu item. Used for padding. * @param array $args An array of arguments. @see wp_nav_menu() */ public function start_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat("\t", $depth); $output .= "\n$indent 
\n"; } /** * Start the element output. * * @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 array $args An array of arguments. @see wp_nav_menu() * @param int $id Current item ID. */ function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) { $id_field = $this->db_fields['id']; if ( is_object( $args[0] ) ) { $args[0]->has_children = ! empty( $children_elements[$element->$id_field] ); } return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); } public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; /** * Filter the CSS class(es) applied to a menu item's list item element. * * @since 3.0.0 * @since 4.1.0 The `$depth` parameter was added. * * @param array $classes The CSS classes that are applied to the menu item's `
  • ` element. * @param object $item The current menu item. * @param array $args An array of {@see wp_nav_menu()} arguments. * @param int $depth Depth of menu item. Used for padding. */ $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; /** * Filter the ID applied to a menu item's list item element. * * @since 3.0.1 * @since 4.1.0 The `$depth` parameter was added. * * @param string $menu_id The ID that is applied to the menu item's `
  • ` element. * @param object $item The current menu item. * @param array $args An array of {@see wp_nav_menu()} arguments. * @param int $depth Depth of menu item. Used for padding. */ $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth ); $id = $id ? ' id="' . esc_attr( $id ) . '"' : ''; if ( $args->has_children ) { $output .= $indent . '
  • Mache ich etwas falsch?

    Solutions Collecting From Web of "has_children in benutzerdefinierter nav_walker"

    Ich habe das gleiche Problem. Einige Antworten behaupten, dass Sie $args->has_children oder $args[0]->has_children , aber niemals zu $ ​​args. Manchmal wird has_children unter $args->walker->has_children , aber es wird immer auf false , mit anderen Worten, nutzlos …

    Als $item->classes fügt die aktuelle Vorlage, die ich verwende, eine class zu Elementen hinzu, die $item->classes Elemente enthalten (menu-item-has-children), also habe ich unter $item->classes nach dieser $item->classes gesucht.

     function end_el( &$output, $item, $depth = 0, $args = array() ) { if( !empty($item->classes) && is_array($item->classes) && in_array('menu-item-has-children', $item->classes) ){ // This guy has children } } 

    Ich denke, Sie könnten eine Markierung in Ihrer start_el-function hinzufügen und danach suchen …

    Ich hoffe das hilft. Wenn Sie bessere Lösungen haben, teilen Sie es bitte mit.