Category menu item and its last 10 posts as sub-menu

i have some posts categories as element of a main navigation menu, and i’d like to display the ten lasts posts of this category as sub menu.

ex: Category1
Lastpost1
Lastpost2

Read More

The main menu is build in the admin panel, and i’m wondering if there is a hook or something to achieve that automatically.
I know how to hardcode that, but i’d like to keep using the cool menu edition from admin panel.

any ideas?

Related posts

Leave a Reply

1 comment

  1. I finally achieve it with this code in function.php

    // Front end only, don't hack on the settings page
    if ( ! is_admin() ) {
    // Hook in early to modify the menu
    // This is before the CSS "selected" classes are calculated
    add_filter( 'wp_get_nav_menu_items', 'display_lasts_ten_posts_for_categories_menu_item', 10, 3 );
    }
    
    // Add the ten last posts of af categroy menu item in a sub menu
    function display_lasts_ten_posts_for_categories_menu_item( $items, $menu, $args ) {
    
    
    $menu_order = count($items); /* Offset menu order */
    $child_items = array();
    
    // Loop through the menu items looking category menu object
    foreach ( $items as $item ) {
    
        // Test if menu item is a categroy and has no sub-category
        if ( 'category' != $item->object || ('category' == $item->object && get_category_children($item->object_id)) )
            continue;
    
        // Query the lasts ten category posts
        $category_ten_last_posts = array(
                'numberposts' => 10,
                'cat' => $item->object_id,
                'orderby' => 'date',
                'order' => 'DESC'
        );
    
        foreach ( get_posts( $category_ten_last_posts ) as $post ) {
            // Add sub menu item
            $post->menu_item_parent = $item->ID;
            $post->post_type = 'nav_menu_item';
            $post->object = 'custom';
            $post->type = 'custom';
            $post->menu_order = ++$menu_order;
            $post->title = $post->post_title;
            $post->url = get_permalink( $post->ID );
            /* add children */
            $child_items[]= $post;
        }
    }
    return array_merge( $items, $child_items );
    }
    

    This will display as sub menu, the ten last posts of a category placed as menu item or sub menu item in admin panel.

    This code is highly inspired from this: http://codeseekah.com/2012/03/05/list-all-posts-in-wordpress-navigation-menu/