Counter - Inside Menu Links
----------------

You can e.g. use the `nav_menu_item_title`<sup>[Codex][1]</sup> filter to adjust the menu titles:

    add_filter( 'nav_menu_item_title', function( $title, $item, $args, $depth )
    {
    	static $instance = 0;

        // Append an increasing counter to the menu title for menu items
        // within a given menu location and menu class

    	if(    'my-custom-location' === $args->theme_location 
            && in_array( 'my-custom-class', (array) $item->classes ) 
        )
    		$title .= sprintf( ' <span class="counter">%d</span>', ++$instance );
    
    	return $title;
    
    }, 10, 4 );

where you should adjust it to your *theme location* and *menu class*.

Counter - Outside Menu Links
----------------

The above approach will add the counter within the link title. What if we want to add it right after the menu link? Then we can use the `walker_nav_menu_start_el`<sup>[Codex][2]</sup> filter:

    add_filter( 'walker_nav_menu_start_el', function( $item_output, $item, $depth, $args )
    {
    	static $instance = 0;

        // Append an increasing counter to the menu link for menu items
        // within a given menu location and menu class

    	if(    'my-custom-location' === $args->theme_location 
            && in_array( 'my-custom-class', (array) $item->classes ) 
        )
    		$item_output .= sprintf( ' <span class="counter">%d</span>', ++$instance );
    
    	return $item_output;
    
    }, 10, 4 );


Note on the inline documentation
--------------------------------

I noticed that the [inline documentation][3] for the `nav_menu_item_title` says `$args` is an array but it seems to be a `stdClass` object. So this is somewhat confusing!

If we check out `Walker::display_element()` then we see that the `$args` input argument is in fact an array, that becomes merged to the array of the output, element and depth with:

    $cb_args = array_merge( array(&$output, $element, $depth), $args);
    call_user_func_array(array($this, 'start_el'), $cb_args);

But here `$cb_args` is an array where the fourth element is a `stdClass` object (not an array) and this is the fourth input argument of the `Walker_Nav_Menu::start_el()` method.

The [inline documentation][4] for `Walker_Nav_Menu::start_el()` also says that it's third input argument is an array. when it's an object.

I will consider creating a trac ticket for this.

Update
------

If your counter is the number of comments, you could simplify your code by using the `count` attribute. Here's an example:

    $counter = get_comments( 
        [ 
            'count'         => true,
            'post_author'   => $current_user->ID,
            'status'        => 'approve',
            // ... etc
        ]
    );

You might also want to check if the user is logged in, to avoid running this query for other visitors.

  [1]: https://developer.wordpress.org/reference/hooks/nav_menu_item_title/
  [2]: https://developer.wordpress.org/reference/hooks/walker_nav_menu_start_el/
  [3]: https://github.com/WordPress/WordPress/blob/247e33934cda514d4f11a87c852c0a4ff058a2ec/wp-includes/class-walker-nav-menu.php#L178
  [4]: https://github.com/WordPress/WordPress/blob/247e33934cda514d4f11a87c852c0a4ff058a2ec/wp-includes/class-walker-nav-menu.php#L84