Title: Walker_Nav_Menu::start_el
Published: April 25, 2014
Last modified: April 28, 2025

---

# Walker_Nav_Menu::start_el( string $output, WP_Post $data_object, int $depth, stdClass $args = null, int $current_object_id )

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#description)
    - [See also](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#see-also)
 * [Parameters](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#parameters)
 * [Source](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#changelog)
 * [User Contributed Notes](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#user-contributed-notes)

[ Back to top](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#wp--skip-link--target)

Starts the element output.

## 󠀁[Description](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#description)󠁿

### 󠀁[See also](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#see-also)󠁿

 * [Walker::start_el()](https://developer.wordpress.org/reference/classes/Walker/start_el/)

## 󠀁[Parameters](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#parameters)󠁿

 `$output`stringrequired

Used to append additional content (passed by reference).

`$data_object`[WP_Post](https://developer.wordpress.org/reference/classes/wp_post/)
required

Menu item data object.

`$depth`intrequired

Depth of menu item. Used for padding.

`$args`stdClassoptional

An object of [wp_nav_menu()](https://developer.wordpress.org/reference/functions/wp_nav_menu/)
arguments.

More Arguments from wp_nav_menu( … $args )

Array of nav menu arguments.

 * `menu` int|string|[WP_Term](https://developer.wordpress.org/reference/classes/wp_term/)
 * Desired menu. Accepts a menu ID, slug, name, or object.
 * `menu_class` string
 * CSS class to use for the ul element which forms the menu.
    Default `'menu'`.
 * `menu_id` string
 * The ID that is applied to the ul element which forms the menu.
    Default is the
   menu slug, incremented.
 * `container` string
 * Whether to wrap the ul, and what to wrap it with.
    Default `'div'`.
 * `container_class` string
 * Class that is applied to the container.
    Default ‘menu-{menu slug}-container’.
 * `container_id` string
 * The ID that is applied to the container.
 * `container_aria_label` string
 * The aria-label attribute that is applied to the container when it’s a nav element.
 * `fallback_cb` callable|false
 * If the menu doesn’t exist, a callback function will fire.
    Default is `'wp_page_menu'`.
   Set to false for no fallback.
 * `before` string
 * Text before the link markup.
 * `after` string
 * Text after the link markup.
 * `link_before` string
 * Text before the link text.
 * `link_after` string
 * Text after the link text.
 * `echo` bool
 * Whether to echo the menu or return it. Default true.
 * `depth` int
 * How many levels of the hierarchy are to be included.
    0 means all. Default 0.
   Default 0.
 * `walker` object
 * Instance of a custom walker class.
 * `theme_location` string
 * Theme location to be used. Must be registered with [register_nav_menu()](https://developer.wordpress.org/reference/functions/register_nav_menu/)
   in order to be selectable by the user.
 * `items_wrap` string
 * How the list items should be wrapped. Uses printf() format with numbered placeholders.
   Default is a ul with an id and class.
 * `item_spacing` string
 * Whether to preserve whitespace within the menu’s HTML.
    Accepts `'preserve'` 
   or `'discard'`. Default `'preserve'`.

Default:`null`

`$current_object_id`intoptional

ID of the current menu item. Default 0.

## 󠀁[Source](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#source)󠁿

    ```php
    public function start_el( &$output, $data_object, $depth = 0, $args = null, $current_object_id = 0 ) {
    	// Restores the more descriptive, specific name for use within this method.
    	$menu_item = $data_object;

    	if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
    		$t = '';
    		$n = '';
    	} else {
    		$t = "\t";
    		$n = "\n";
    	}
    	$indent = ( $depth ) ? str_repeat( $t, $depth ) : '';

    	$classes   = empty( $menu_item->classes ) ? array() : (array) $menu_item->classes;
    	$classes[] = 'menu-item-' . $menu_item->ID;

    	/**
    	 * Filters the arguments for a single nav menu item.
    	 *
    	 * @since 4.4.0
    	 *
    	 * @param stdClass $args      An object of wp_nav_menu() arguments.
    	 * @param WP_Post  $menu_item Menu item data object.
    	 * @param int      $depth     Depth of menu item. Used for padding.
    	 */
    	$args = apply_filters( 'nav_menu_item_args', $args, $menu_item, $depth );

    	/**
    	 * Filters the CSS classes applied to a menu item's list item element.
    	 *
    	 * @since 3.0.0
    	 * @since 4.1.0 The `$depth` parameter was added.
    	 *
    	 * @param string[] $classes   Array of the CSS classes that are applied to the menu item's `<li>` element.
    	 * @param WP_Post  $menu_item The current menu item object.
    	 * @param stdClass $args      An object of wp_nav_menu() arguments.
    	 * @param int      $depth     Depth of menu item. Used for padding.
    	 */
    	$class_names = implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $menu_item, $args, $depth ) );

    	/**
    	 * Filters the ID attribute 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_item_id The ID attribute applied to the menu item's `<li>` element.
    	 * @param WP_Post  $menu_item    The current menu item.
    	 * @param stdClass $args         An object of wp_nav_menu() arguments.
    	 * @param int      $depth        Depth of menu item. Used for padding.
    	 */
    	$id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $menu_item->ID, $menu_item, $args, $depth );

    	$li_atts          = array();
    	$li_atts['id']    = ! empty( $id ) ? $id : '';
    	$li_atts['class'] = ! empty( $class_names ) ? $class_names : '';

    	/**
    	 * Filters the HTML attributes applied to a menu's list item element.
    	 *
    	 * @since 6.3.0
    	 *
    	 * @param array $li_atts {
    	 *     The HTML attributes applied to the menu item's `<li>` element, empty strings are ignored.
    	 *
    	 *     @type string $class        HTML CSS class attribute.
    	 *     @type string $id           HTML id attribute.
    	 * }
    	 * @param WP_Post  $menu_item The current menu item object.
    	 * @param stdClass $args      An object of wp_nav_menu() arguments.
    	 * @param int      $depth     Depth of menu item. Used for padding.
    	 */
    	$li_atts       = apply_filters( 'nav_menu_item_attributes', $li_atts, $menu_item, $args, $depth );
    	$li_attributes = $this->build_atts( $li_atts );

    	$output .= $indent . '<li' . $li_attributes . '>';

    	/** This filter is documented in wp-includes/post-template.php */
    	$title = apply_filters( 'the_title', $menu_item->title, $menu_item->ID );

    	// Save filtered value before filtering again.
    	$the_title_filtered = $title;

    	/**
    	 * Filters a menu item's title.
    	 *
    	 * @since 4.4.0
    	 *
    	 * @param string   $title     The menu item's title.
    	 * @param WP_Post  $menu_item The current menu item object.
    	 * @param stdClass $args      An object of wp_nav_menu() arguments.
    	 * @param int      $depth     Depth of menu item. Used for padding.
    	 */
    	$title = apply_filters( 'nav_menu_item_title', $title, $menu_item, $args, $depth );

    	$atts           = array();
    	$atts['target'] = ! empty( $menu_item->target ) ? $menu_item->target : '';
    	$atts['rel']    = ! empty( $menu_item->xfn ) ? $menu_item->xfn : '';

    	if ( ! empty( $menu_item->url ) ) {
    		if ( $this->privacy_policy_url === $menu_item->url ) {
    			$atts['rel'] = empty( $atts['rel'] ) ? 'privacy-policy' : $atts['rel'] . ' privacy-policy';
    		}

    		$atts['href'] = $menu_item->url;
    	} else {
    		$atts['href'] = '';
    	}

    	$atts['aria-current'] = $menu_item->current ? 'page' : '';

    	// Add title attribute only if it does not match the link text (before or after filtering).
    	if ( ! empty( $menu_item->attr_title )
    		&& trim( strtolower( $menu_item->attr_title ) ) !== trim( strtolower( $menu_item->title ) )
    		&& trim( strtolower( $menu_item->attr_title ) ) !== trim( strtolower( $the_title_filtered ) )
    		&& trim( strtolower( $menu_item->attr_title ) ) !== trim( strtolower( $title ) )
    	) {
    		$atts['title'] = $menu_item->attr_title;
    	} else {
    		$atts['title'] = '';
    	}

    	/**
    	 * Filters the HTML attributes applied to a menu item's anchor element.
    	 *
    	 * @since 3.6.0
    	 * @since 4.1.0 The `$depth` parameter was added.
    	 *
    	 * @param array $atts {
    	 *     The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored.
    	 *
    	 *     @type string $title        Title attribute.
    	 *     @type string $target       Target attribute.
    	 *     @type string $rel          The rel attribute.
    	 *     @type string $href         The href attribute.
    	 *     @type string $aria-current The aria-current attribute.
    	 * }
    	 * @param WP_Post  $menu_item The current menu item object.
    	 * @param stdClass $args      An object of wp_nav_menu() arguments.
    	 * @param int      $depth     Depth of menu item. Used for padding.
    	 */
    	$atts       = apply_filters( 'nav_menu_link_attributes', $atts, $menu_item, $args, $depth );
    	$attributes = $this->build_atts( $atts );

    	$item_output  = $args->before;
    	$item_output .= '<a' . $attributes . '>';
    	$item_output .= $args->link_before . $title . $args->link_after;
    	$item_output .= '</a>';
    	$item_output .= $args->after;

    	/**
    	 * Filters a menu item's starting output.
    	 *
    	 * The menu item's starting output only includes `$args->before`, the opening `<a>`,
    	 * the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is
    	 * no filter for modifying the opening and closing `<li>` for a menu item.
    	 *
    	 * @since 3.0.0
    	 *
    	 * @param string   $item_output The menu item's starting HTML output.
    	 * @param WP_Post  $menu_item   Menu item data object.
    	 * @param int      $depth       Depth of menu item. Used for padding.
    	 * @param stdClass $args        An object of wp_nav_menu() arguments.
    	 */
    	$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $menu_item, $depth, $args );
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/class-walker-nav-menu.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/class-walker-nav-menu.php#L156)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-walker-nav-menu.php#L156-L321)

## 󠀁[Hooks](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#hooks)󠁿

 [apply_filters( ‘nav_menu_css_class’, string[] $classes, WP_Post $menu_item, stdClass $args, int $depth )](https://developer.wordpress.org/reference/hooks/nav_menu_css_class/)

Filters the CSS classes applied to a menu item’s list item element.

 [apply_filters( ‘nav_menu_item_args’, stdClass $args, WP_Post $menu_item, int $depth )](https://developer.wordpress.org/reference/hooks/nav_menu_item_args/)

Filters the arguments for a single nav menu item.

 [apply_filters( ‘nav_menu_item_attributes’, array $li_atts, WP_Post $menu_item, stdClass $args, int $depth )](https://developer.wordpress.org/reference/hooks/nav_menu_item_attributes/)

Filters the HTML attributes applied to a menu’s list item element.

 [apply_filters( ‘nav_menu_item_id’, string $menu_item_id, WP_Post $menu_item, stdClass $args, int $depth )](https://developer.wordpress.org/reference/hooks/nav_menu_item_id/)

Filters the ID attribute applied to a menu item’s list item element.

 [apply_filters( ‘nav_menu_item_title’, string $title, WP_Post $menu_item, stdClass $args, int $depth )](https://developer.wordpress.org/reference/hooks/nav_menu_item_title/)

Filters a menu item’s title.

 [apply_filters( ‘nav_menu_link_attributes’, array $atts, WP_Post $menu_item, stdClass $args, int $depth )](https://developer.wordpress.org/reference/hooks/nav_menu_link_attributes/)

Filters the HTML attributes applied to a menu item’s anchor element.

 [apply_filters( ‘the_title’, string $post_title, int $post_id )](https://developer.wordpress.org/reference/hooks/the_title/)

Filters the post title.

 [apply_filters( ‘walker_nav_menu_start_el’, string $item_output, WP_Post $menu_item, int $depth, stdClass $args )](https://developer.wordpress.org/reference/hooks/walker_nav_menu_start_el/)

Filters a menu item’s starting output.

## 󠀁[Related](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#related)󠁿

| Uses | Description | 
| [Walker_Nav_Menu::build_atts()](https://developer.wordpress.org/reference/classes/walker_nav_menu/build_atts/)`wp-includes/class-walker-nav-menu.php` |

Builds a string of HTML attributes from an array of key/value pairs.

  | 
| [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to a filter hook.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#changelog)󠁿

| Version | Description | 
| [6.7.0](https://developer.wordpress.org/reference/since/6.7.0/) | Removed redundant title attributes. | 
| [5.9.0](https://developer.wordpress.org/reference/since/5.9.0/) | Renamed `$item` to `$data_object` and `$id` to `$current_object_id` to match parent class for PHP 8 named parameter support. | 
| [4.4.0](https://developer.wordpress.org/reference/since/4.4.0/) | The ['nav_menu_item_args'](https://developer.wordpress.org/reference/hooks/nav_menu_item_args/) filter was added. | 
| [3.0.0](https://developer.wordpress.org/reference/since/3.0.0/) | Introduced. |

## 󠀁[User Contributed Notes](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#user-contributed-notes)󠁿

 1.   [Skip to note 2 content](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/?output_format=md#comment-content-3432)
 2.    [abdelrahman96](https://profiles.wordpress.org/abdelrahman96/)  [  6 years ago  ](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/#comment-3432)
 3.  [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwalker_nav_menu%2Fstart_el%2F%23comment-3432)
     Vote results for this note: 1[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwalker_nav_menu%2Fstart_el%2F%23comment-3432)
 4.  Found that and i think it may be useful
      The variable **$item** is an object that
     represents the an item of the menu. This is an example of a custom link:
 5.      ```php
         object(WP_Post)#497 (40) {
           ["ID"]=&gt;
           int(160)
           ["post_author"]=&gt;
           string(1) "1"
           ["post_date"]=&gt;
           string(19) "2016-03-26 17:59:07"
           ["post_date_gmt"]=&gt;
           string(19) "2016-03-26 17:59:07"
           ["post_content"]=&gt;
           string(15) "Home Sweet Home"
           ["post_title"]=&gt;
           string(4) "Home"
           ["post_excerpt"]=&gt;
           string(0) ""
           ["post_status"]=&gt;
           string(7) "publish"
           ["comment_status"]=&gt;
           string(6) "closed"
           ["ping_status"]=&gt;
           string(6) "closed"
           ["post_password"]=&gt;
           string(0) ""
           ["post_name"]=&gt;
           string(4) "home"
           ["to_ping"]=&gt;
           string(0) ""
           ["pinged"]=&gt;
           string(0) ""
           ["post_modified"]=&gt;
           string(19) "2016-08-31 23:53:19"
           ["post_modified_gmt"]=&gt;
           string(19) "2016-08-31 21:53:19"
           ["post_content_filtered"]=&gt;
           string(0) ""
           ["post_parent"]=&gt;
           int(0)
           ["guid"]=&gt;
           string(33) "http://localhost/wordpress/?p=160&quot;
           ["menu_order"]=&gt;
           int(1)
           ["post_type"]=&gt;
           string(13) "nav_menu_item"
           ["post_mime_type"]=&gt;
           string(0) ""
           ["comment_count"]=&gt;
           string(1) "0"
           ["filter"]=&gt;
           string(3) "raw"
           ["db_id"]=&gt;
           int(160)
           ["menu_item_parent"]=&gt;
           string(1) "0"
           ["object_id"]=&gt;
           string(3) "160"
           ["object"]=&gt;
           string(6) "custom"
           ["type"]=&gt;
           string(6) "custom"
           ["type_label"]=&gt;
           string(11) "Custom Link"
           ["title"]=&gt;
           string(4) "Home"
           ["url"]=&gt;
           string(27) "http://localhost/wordpress/&quot;
           ["target"]=&gt;
           string(0) ""
           ["attr_title"]=&gt;
           string(0) ""
           ["description"]=&gt;
           string(15) "Home Sweet Home"
           ["classes"]=&gt;
           array(7) {
             [0]=&gt;
             string(0) ""
             [1]=&gt;
             string(9) "menu-item"
             [2]=&gt;
             string(21) "menu-item-type-custom"
             [3]=&gt;
             string(23) "menu-item-object-custom"
             [4]=&gt;
             string(17) "current-menu-item"
             [5]=&gt;
             string(17) "current_page_item"
             [6]=&gt;
             string(14) "menu-item-home"
           }
           ["xfn"]=&gt;
           string(0) ""
           ["current"]=&gt;
           bool(true)
           ["current_item_ancestor"]=&gt;
           bool(false)
           ["current_item_parent"]=&gt;
           bool(false)
         }
         ```
     
 6.  The variable **$args** contains every information we pass into the function wp_nav_menu.
     This can be used to enter some information from the arguments into our WordPress
     custom menu.
 7.      ```php
         object(stdClass)#486 (16) {
           ["menu"]=&gt;
           object(WP_Term)#489 (10) {
             ["term_id"]=&gt;
             int(6)
             ["name"]=&gt;
             string(12) "Primary Menu"
             ["slug"]=&gt;
             string(12) "primary-menu"
             ["term_group"]=&gt;
             int(0)
             ["term_taxonomy_id"]=&gt;
             int(6)
             ["taxonomy"]=&gt;
             string(8) "nav_menu"
             ["description"]=&gt;
             string(0) ""
             ["parent"]=&gt;
             int(0)
             ["count"]=&gt;
             int(7)
             ["filter"]=&gt;
             string(3) "raw"
           }
           ["container"]=&gt;
           string(3) "div"
           ["container_class"]=&gt;
           string(0) ""
           ["container_id"]=&gt;
           string(0) ""
           ["menu_class"]=&gt;
           string(12) "primary-menu"
           ["menu_id"]=&gt;
           string(0) ""
           ["echo"]=&gt;
           bool(true)
           ["fallback_cb"]=&gt;
           string(12) "wp_page_menu"
           ["before"]=&gt;
           string(0) ""
           ["after"]=&gt;
           string(0) ""
           ["link_before"]=&gt;
           string(0) ""
           ["link_after"]=&gt;
           string(0) ""
           ["items_wrap"]=&gt;
           string(36) "<ul>%3$s</ul>"
           ["depth"]=&gt;
           int(0)
           ["walker"]=&gt;
           object(IBenic_Walker)#484 (4) {
             ["tree_type"]=&gt;
             array(3) {
               [0]=&gt;
               string(9) "post_type"
               [1]=&gt;
               string(8) "taxonomy"
               [2]=&gt;
               string(6) "custom"
             }
             ["db_fields"]=&gt;
             array(2) {
               ["parent"]=&gt;
               string(16) "menu_item_parent"
               ["id"]=&gt;
               string(5) "db_id"
             }
             ["max_pages"]=&gt;
             int(1)
             ["has_children"]=&gt;
             bool(false)
           }
           ["theme_location"]=&gt;
           string(7) "primary"
         }
         ```
     
 8.   * As of WordPress 5.9.0 (December 2021), **$item** has been renamed to **$data_object**.
        It is also worth noting that **$data_object** is named **$menu_item** within
        this function, and **$menu_item** is the variable used for everything useful
        within this function (such as all the **apply_filter()** hooks.
      * [jichanbachan](https://profiles.wordpress.org/jichanbachan/) [3 years ago](https://developer.wordpress.org/reference/classes/walker_nav_menu/start_el/#comment-6276)
 9.   [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwalker_nav_menu%2Fstart_el%2F%3Freplytocom%3D3432%23feedback-editor-3432)

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwalker_nav_menu%2Fstart_el%2F)
before being able to contribute a note or feedback.