current_page_item is missing inside wp_nav_menu

If you’re not actually using a custom nav menu, why are you not just outputting wp_page_menu() directly?

Problem

As-implemented, your walker will never be executed (or, more accurately, you can’t control whether or not it is executed), because you’re not passing 'theme_location' (correct usage) or 'menu' (sub-optimal usage) to the args array.

Here’s how the wp_nav_menu() output works:

  1. WordPress looks for 'menu' defined in the args array. This value corresponds to the slug of a user-created custom nav menu. So if the user creates a Menu named “Short Header Menu”, the slug would be 'short-header-menu', which would correspond to 'menu' => 'short-header'menu'. If the menu is found, it is used.
  2. WordPress looks for 'theme_location' defined in the args array. This value corresponds to the user-defined custom nav menu assigned by the user to the Theme Location. So, if the user creates a Menu named “Short Header Menu”, and assigns it to the (Theme-defined) Theme Location “Primary Menu” (defined by the Theme via register_nav_menus( array( 'primary-menu' => "Primary Menu 0 0), the 'short-header-menu' would be the menu returned. If found, it is used.
  3. If neither 'menu' nor 'theme_location' is defined the args array, WordPress queries all of the user-created custom nav menus. If the user has created custom nav menus, WordPress uses the first one that has menu items.
  4. If all of the above fail, WordPress outputs the fallback menu, as defined via 'fallback_cb'.

So, in your example, you’re not passing either 'menu' or 'theme_location' to the args array. If the user (e.g. you) hasn’t created any custom nav menus, then WordPress is outputting the 'fallback_cb', which by definition is wp_page_menu().

Now, wp_nav_menu() passes its $args array to the fallback function, but wp_page_menu() doesn’t accept a 'walker' parameter. So your custom walker is being ignored.

Solution

  1. Properly register custom nav menu Theme locations, via register_nav_menus()
  2. Create custom nav menus, via Appearance -> Menus
  3. Assign a custom nav menu to a registered Theme Location
  4. Pass the 'theme_location' parameter to your wp_nav_menu() $args array

Addendum

Note, if the sole purpose of your custom walker is to add the .current-page-item class, then you don’t need your custom walker at all. The wp_nav_menu() classes are backwards-compatible with wp_page_menu(), which means that the .current-page-item class is already output by wp_nav_menu().