WordPress how to add all menus into post


1. Use a shortcode to display all menus

You can create a custom shortcode that lists all registered menus, then insert that shortcode into any post.

Here’s a simple way to do it:

Step 1: Add this to your theme’s functions.php file:

function list_all_menus_shortcode() {
    $menus = wp_get_nav_menus();
    $output = '';

    if (!empty($menus)) {
        foreach ($menus as $menu) {
            $menu_items = wp_get_nav_menu_items($menu->term_id);

            if (!empty($menu_items)) {
                $output .= '<h2>' . esc_html($menu->name) . '</h2>';
                $output .= '<ul>';

                foreach ($menu_items as $item) {
                    $output .= '<li><a href="' . esc_url($item->url) . '">' . esc_html($item->title) . '</a></li>';
                }

                $output .= '</ul>';
            }
        }
    } else {
        $output = '<p>No menus found.</p>';
    }

    return $output;
}
add_shortcode('all_menus', 'list_all_menus_shortcode');


Step 2: Use [all_menus] shortcode inside your post content.

✅ Now when you insert [all_menus] into any post or page, it will automatically display all menus with their items.


2. Use a shortcode to print all menu names quoted and separated by a comma

function print_all_menu_names_shortcode() {
    $menus = wp_get_nav_menus();
    $names = [];

    if (!empty($menus)) {
        foreach ($menus as $menu) {
            $names[] = '"' . esc_html($menu->name) . '"';
        }
        return implode(', ', $names);
    } else {
        return 'No menus found.';
    }
}
add_shortcode('print_menu_names', 'print_all_menu_names_shortcode');


How to use:

  • Add the code to your theme’s functions.php or your custom plugin.
  • Then just put this shortcode wherever you want the menu names to appear:
[print_menu_names]

✅ This will output something like:

"Main Menu", "Footer Menu", "Sidebar Menu"


3. Use a shortcode to print all menus in a custom sort

Each WordPress menu has a unique ID ($menu->term_id) and a name ($menu->name).
You can identify them either by their ID or by their name.

Then, you manually set the order you want.


Here’s how you can do it:

Update the shortcode function like this:

function list_all_menus_shortcode() {
    $menus = wp_get_nav_menus();
    $output = '';

    if (!empty($menus)) {
        // Step 1: Define the hard-coded order you want (by menu ID or menu name)
        $custom_order = [
            'Main Menu',     // by name
            'Footer Menu',
            'Sidebar Menu',
        ];
        
        // Step 2: Reorder the menus according to your custom order
        $ordered_menus = [];
        foreach ($custom_order as $name) {
            foreach ($menus as $menu) {
                if ($menu->name === $name) { // use $menu->term_id if you want to match by ID
                    $ordered_menus[] = $menu;
                    break;
                }
            }
        }

        foreach ($ordered_menus as $menu) {
            $menu_items = wp_get_nav_menu_items($menu->term_id);

            if (!empty($menu_items)) {
                $output .= '<h2>' . esc_html($menu->name) . '</h2>';
                $output .= '<ul>';

                foreach ($menu_items as $item) {
                    $output .= '<li><a href="' . esc_url($item->url) . '">' . esc_html($item->title) . '</a></li>';
                }

                $output .= '</ul>';
            }
        }
    } else {
        $output = '<p>No menus found.</p>';
    }

    return $output;
}
add_shortcode('all_menus', 'list_all_menus_shortcode');


Important notes:

  • Replace "Main Menu", "Footer Menu", etc., in $custom_order with your real menu names.
  • Alternatively, you can match by term_id instead of name if you prefer.

👉 To find your menu IDs easily, go to:
WordPress Dashboard → Appearance → Menus, then hover over a menu — you’ll see a URL like:

/wp-admin/nav-menus.php?action=edit&amp;menu=45

Here, menu=45 means term_id = 45.

If you want to match by ID, change the matching line:

if ($menu->term_id == $id) {

instead of name matching.

A contemporary logo for a Cypriot ethical hacking group, combining traditional and digital motifs. The logo includes an abstract representation of a castle tower, signifying defense and strategy, with a circuit board pattern. The Cyprus flag is cleverly integrated into the tower design. Above the tower flies a stylized eagle, representing vigilance in cybersecurity. The group's initials, 'CEH', are interwoven into the base of the tower in a futuristic typeface.

This post is also available in: Greek

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.