Add Custom Tab to Groups Directory

This is an example of how to add a custom tab to the Groups Directory.
And call a custom template when that tab is clicked.

The same approach can be used to add a custom tab to the Members Directory.

The tab will be called Custom and it will load a template called groups-custom.php.

[sourcecode language=”php”]
// add Custom tab on Groups Page
function asdf_groups_custom_tab() {

if ( bp_is_current_action( ‘custom’ ) )
return;

$button_args = array(
‘id’ => ‘groups-custom’,
‘component’ => ‘groups’,
‘link_text’ => __( ‘Custom’, ‘buddypress’ ),
‘link_title’ => __( ‘Custom’, ‘buddypress’ ),
‘link_class’ => ‘group-custom no-ajax’,
‘link_href’ => trailingslashit( bp_get_groups_directory_permalink() . ‘custom’ ),
‘wrapper’ => false,
‘block_self’ => false,
);

?>
<li><?php echo bp_get_button( apply_filters( ‘bp_get_group_custom_button’, $button_args ) ); ?></a></li>
<?php
}
add_action( ‘bp_groups_directory_group_filter’, ‘asdf_groups_custom_tab’ );

// load the Groups Custom template
function asdf_groups_show_custom() {

if ( !bp_is_groups_component() || !bp_is_current_action( ‘custom’ ) ) {
return false;
}

new BP_Groups_Theme_Compat_Custom(); // see class below

bp_core_load_template( ‘groups/groups-custom’ );

}
add_action( ‘bp_actions’, ‘asdf_groups_show_custom’ );

// enable the loading of the custom template
class BP_Groups_Theme_Compat_Custom {

public function __construct() {
add_action( ‘bp_setup_theme_compat’, array( $this, ‘is_group’ ) );
}

public function is_group() {

if ( ! bp_is_groups_component() )
return;

if ( bp_is_current_action( ‘custom’ ) ) {

add_action( ‘bp_template_include_reset_dummy_post_data’, array( $this, ‘create_dummy_post’ ) );
add_filter( ‘bp_replace_the_content’, array( $this, ‘create_content’ ) );

}
}

public function create_dummy_post() {

bp_theme_compat_reset_post( array(
‘ID’ => 0,
‘post_title’ => ‘Groups Custom’,
‘post_author’ => 0,
‘post_date’ => 0,
‘post_content’ => ”,
‘post_type’ => ‘page’,
‘post_status’ => ‘publish’,
‘is_page’ => true,
‘comment_status’ => ‘closed’
) );
}

public function create_content() {
return bp_buffer_template_part( ‘groups/groups-custom’, null, false );
}

}

[/sourcecode]

This example assumes that the groups-custom.php template is in your theme at this location:
.../wp-content/themes/your-theme/buddypress/groups/groups-custom.php

If you want to load the template from a plugin, you need to register the location of the template:

[sourcecode language=”php”]
// add path to plugin templates
function asdf_register_template_location() {
return dirname( __FILE__ ) . ‘/templates/’;
}

function asdf_template_start() {

if( function_exists( ‘bp_register_template_stack’ ) )
bp_register_template_stack( ‘asdf_register_template_location’ );

}
add_action( ‘bp_init’, ‘asdf_template_start’ );

[/sourcecode]

More info about using BP Theme Compat in plugins.