How to var_dump nav menu items from anywhere?

The items are set up in wp_nav_menu(). There is a useful filter you can use: 'wp_nav_menu_objects'. It offers the items as $sorted_menu_items and the arguments of the wp_nav_menu() call as $args.

From wp-includes/nav-menu-template.php::wp_nav_menu():

$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );

So …

  • hook into this filter,
  • store the data somewhere,
  • return the $sorted_menu_items unchanged and
  • print the collected data after all menus are done.

In my following example I print the data on 'shutdown' – that’s the latest hook WordPress fires.

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: T5 Collect Nav Menu Items
 * Description: Appends debug information about currently processed nav menu items to pages.
 */

add_filter( 'wp_nav_menu_objects', array ( 'T5_Nav_Menu_Collector', 'collect' ), 99, 2 );

class T5_Nav_Menu_Collector
{
    /**
     * Stores the data
     * @type array
     */
    protected static $collection = array ();

    /**
     * Collect nav menu data.
     *
     * @wp-hook wp_nav_menu_objects
     * @param   array $sorted_menu_items
     * @param   array $args
     * @return  array $sorted_menu_items   Not changed.
     */
    public static function collect( $sorted_menu_items, $args )
    {
        // Since we *know* we have data, we register the print action.
        add_action( 'shutdown', array ( __CLASS__, 'print_collection' ) );

        self::$collection[] = array(
            'args'  => $args,
            'items' => $sorted_menu_items
        );
        return $sorted_menu_items;
    }

    /**
     * Dump the collected data.
     *
     * @wp-hook shutdown
     * @return  void
     */
    public static function print_collection()
    {
        $output = htmlspecialchars( print_r( self::$collection, TRUE ) );
        print "<pre><b>Nav Menu Data</b>\n\n$output</pre>";
    }
}

If there is no nav menu – nothing happens. But if we could collect some data, we get a nice long list at the end of a document with all item properties we can use in other filters.

Leave a Comment