BuddyPress: Adding a new tab in groups

I’m trying to add a new tab to my groups on BuddyPress. All the groups will have different content preferrably from the database.

How can I accomplish this?

Related posts

Leave a Reply

3 comments

  1. There’s an example of this on the buddypress forums which is a good place to start looking for answers.

    http://buddypress.org/community/groups/creating-extending/forum/topic/can-someone-explain-how-to-add-tabs-to-the-profile-page/

    For the sake of answering here though here goes:

    bp_core_new_subnav_item( array(
       'name' => 'My Group Page',
       'slug' => 'my-group-page',
       'parent_url' => $bp->loggedin_user->domain . $bp->groups->slug . '/',
       'parent_slug' => $bp->groups->slug,
       'screen_function' => 'my_groups_page_function_to_show_screen',
       'position' => 40 ) );
    

    And the screen function to render the page:

    function my_groups_page_function_to_show_screen() {
    
        //add title and content here - last is to call the members plugin.php template
        add_action( 'bp_template_title', 'my_groups_page_function_to_show_screen_title' );
        add_action( 'bp_template_content', 'my_groups_page_function_to_show_screen_content' );
        bp_core_load_template( apply_filters( 'bp_core_template_plugin', 'members/single/plugins' ) );
    }
    
        function my_groups_page_function_to_show_screen_title() {
            echo 'My Page Title';
        }
        function my_groups_page_function_to_show_screen_content() { 
    
            // page content goes here
    
        }
    
  2. This worked for me:

    function setup_group_nav(){
        global $bp; 
        /* Add some group subnav items */
        $user_access = false;
        $group_link = '';
        if( bp_is_active('groups') && !empty($bp->groups->current_group) ){
            $group_link = $bp->root_domain . '/' . bp_get_groups_root_slug() . '/' . $bp->groups->current_group->slug . '/';
            $user_access = $bp->groups->current_group->user_has_access;
            bp_core_new_subnav_item( array( 
                'name' => __( 'Custom', 'custom'),
                'slug' => 'custom', 
                'parent_url' => $group_link, 
                'parent_slug' => $bp->groups->current_group->slug,
                'screen_function' => 'bp_group_custom', 
                'position' => 50, 
                'user_has_access' => $user_access, 
                'item_css_id' => 'custom' 
            ));
        }
    }
    add_action( 'bp_init', 'setup_group_nav' );
    
    function bp_group_custom() {
        add_action('bp_template_title', 'my_new_group_show_screen_title');
        add_action('bp_template_content', 'my_new_group_show_screen_content');
    
        $templates = array('groups/single/plugins.php', 'plugin-template.php');
        if (strstr(locate_template($templates), 'groups/single/plugins.php')) {
            bp_core_load_template(apply_filters('bp_core_template_plugin', 'groups/single/plugins'));
        } else {
            bp_core_load_template(apply_filters('bp_core_template_plugin', 'plugin-template'));
        }
    
    }
    
    function my_new_group_show_screen_title() {
        echo 'New Tab Title';
    }
    
    function my_new_group_show_screen_content() {
        echo 'New tab page content';
    
    }
    
  3. For your example to work, you need to wrap it in a function like this (that you’ll place in functions.php) :

    function my_setup_nav() {
        global $bp;
        bp_core_new_subnav_item( array(
           'name' => 'My Group Page',
           'slug' => 'my-group-page',
           'parent_url' => $bp->loggedin_user->domain . $bp->groups->slug . '/',
           'parent_slug' => $bp->groups->slug,
           'screen_function' => 'my_groups_page_function_to_show_screen',
           'position' => 40 ) );
    }
    add_action( 'bp_setup_nav', 'my_setup_nav' );
    

    and place you rendreing function after obviously.