Question

I have a menu with a combination of pages and categories. I need to loop through the menu and if it finds a category automatically add all child-categories as a submenu.

Page 1 | Page 2 | Custom Link
                    Category 1
                    Category 2
                        Child Category

In the example above I need to dynamically add the Child Categories to this menu

Was it helpful?

Solution

you can add them with the filter wp_get_nav_menu_items

add_filter("wp_get_nav_menu_items", function ($items, $menu, $args) {

    // don't add child categories in administration of menus
    if (is_admin()) {
        return $items;
    }


    foreach ($items as $index => $i) {

        if ("category" !== $i->object) {
            continue;
        }


        $term_children = get_term_children($i->object_id, "category");


        // add child categories

        foreach ($term_children as $index2 => $child_id) {

            $child = get_term($child_id);

            $url = get_term_link($child);


            $e = new \stdClass();

            $e->title = $child->name;
            $e->url = $url;
            $e->menu_order = 500 * ($index + 1) + $index2;
            $e->post_type = "nav_menu_item";
            $e->post_status = "published";
            $e->post_parent = $i->ID;
            $e->menu_item_parent = $i->ID;
            $e->type = "custom";
            $e->object = "custom";
            $e->description = "";
            $e->object_id = 0;
            $e->db_id = 0;
            $e->ID = 0;
            $e->classes = array();

            $items[] = $e;

        }


    }


    return $items;

}, 10, 3);
Licensed under: CC-BY-SA with attribution
Not affiliated with wordpress.stackexchange
scroll top