8 min read
Create BuddyPress Group Types and Group Categories
Once a BuddyPress community passes a few dozen groups, members stop finding the right one. The fix is group types: a label such as “Class”, “Chapter” or “Project Team” that sits on each group, gets its own directory view and lets members filter. BuddyPress has shipped this in core since version 2.6 (2016), and since BuddyPress 7.0 (2020) you can create types from the dashboard without writing a line of code.
This post originally covered our BP Create Group Type plugin, which filled that gap before the core admin screen existed. That plugin was closed on WordPress.org in March 2022 and we no longer recommend installing it. Everything it did, and a bit more, is now possible with core BuddyPress plus a few lines of PHP where you want custom behaviour. Here is how we set it up on client sites today.
Group types vs. group categories: what BuddyPress actually gives you
People ask for “group categories” and usually mean one of three different things. It is worth being precise, because BuddyPress only handles one of them natively.
- Group types are a flat taxonomy on the group object. A group can have one or more types. Each type can have a directory view at
/groups/type/{slug}/. This is what core provides. - Hierarchical groups (parent and child groups, sub-groups) are not in core. BuddyBoss Platform has them; on plain BuddyPress you need a third-party plugin or custom code.
- Topic tags on groups (many free-form labels per group) are also not in core. If you need this, a custom taxonomy registered against the
bp_groupobject type is the usual route.
For most communities, types are enough. A university site might use “Course”, “Club” and “Department”. A professional network might use “Local Chapter”, “Special Interest” and “Vendor”. Keep the list short. We have never seen a site benefit from more than eight or so types; past that, members ignore the filter.
Create group types from the dashboard (no code)
On BuddyPress 7.0 or newer (the current branches are 14.x, 12.x and 11.x as of July 2026, all of which have this), go to Groups → Group Types in wp-admin. The screen works like the Categories screen for posts: a form on the left, a table of existing types on the right.
- Group Type ID. Lower-case letters, numbers and hyphens, no spaces. This becomes the internal key and the default URL slug, and it cannot be edited later. Pick something you can live with, such as
local-chapter. - Singular name and Plural name. “Local Chapter” and “Local Chapters”. The singular name shows in the group header and the admin metabox; the plural shows on directory tabs.
- Has Directory View. Tick this if you want a filterable listing at
/groups/type/local-chapter/. A Custom type directory slug field appears so you can use a different slug than the ID. - Show on Group Creation. Lets the group creator pick this type during the create-group wizard. Leave it off for types only admins should assign (for example “Official”).
- Show on Group. Displays the type label in the single group header.
- Click Add new Group Type. A notice confirms the save and the type appears in the table, where you can edit the names or delete it.
To assign types to groups you already have, go to Groups → All Groups, tick the groups, choose the type from the Bulk actions dropdown and apply. One caution from the BuddyPress docs: bulk assignment replaces existing types on those groups rather than adding to them. For individual groups, open the group in admin and use the Group Type metabox, which allows multiple types per group. Group admins can also change it from the front end under the group’s Manage → Settings tab when the type is enabled for the creation screen.
Register group types in code when you need them version-controlled
Dashboard-created types live in the database. On sites where the theme or a site plugin is deployed through Git, we prefer to register types in code so staging and production stay in sync. The function is bp_groups_register_group_type(), hooked to bp_groups_register_group_types.
add_action( 'bp_groups_register_group_types', 'wbcom_register_group_types' );
function wbcom_register_group_types() {
bp_groups_register_group_type(
'course',
array(
'labels' => array(
'name' => 'Courses',
'singular_name' => 'Course',
),
'has_directory' => 'courses',
'show_in_create_screen' => true,
'show_in_list' => true,
'create_screen_checked' => false,
'description' => 'Discussion space for an enrolled course.',
)
);
bp_groups_register_group_type(
'official',
array(
'labels' => array(
'name' => 'Official Groups',
'singular_name' => 'Official',
),
'has_directory' => 'official',
'show_in_create_screen' => false,
'show_in_list' => true,
)
);
}
A few notes on the arguments, all of which are documented in the BuddyPress codex:
has_directoryaccepts a string slug orfalse. The string becomes the URL segment after/groups/type/.show_in_create_screencontrols whether members see it in the wizard.show_in_listcontrols whetherbp_group_type_list()outputs it in templates; it defaults to the value ofshow_in_create_screen.create_screen_checkedpre-selects the type in the wizard. Useful when 90 percent of new groups should be one type.descriptionis shown under the checkbox on the create screen. Write it for members, not for yourself.
Code-registered types and dashboard-registered types can coexist. If both define the same ID, the code version wins, which is a handy way to lock a type down.
Query, display and filter groups by type
Registering the type is half the job. The reason to do it is so you can build pages around it. Three tools cover almost every case.
The groups loop
bp_has_groups() accepts a group_type argument that takes a single slug, an array, or a comma-separated string. group_type__in and group_type__not_in are also available for include and exclude logic.
if ( bp_has_groups( array( 'group_type' => 'course', 'per_page' => 12 ) ) ) :
while ( bp_groups() ) : bp_the_group();
// Your template markup.
endwhile;
endif;
Getting and setting a type
bp_groups_get_group_type( $group_id ) returns the first type (pass false as the second argument to get all of them as an array). bp_groups_set_group_type( $group_id, 'course' ) assigns it; pass true as a third argument to append rather than replace. We use this in onboarding flows where a group created through a LearnDash or WooCommerce hook should land in the right type automatically.
Template output
Inside the loop, bp_group_type_list() prints the type labels with optional links to the directory view. On the single group header, the “Show on Group” setting (or show_in_list in code) handles it for you in both the Nouveau and Legacy template packs, and in BuddyX and Reign.
Directory filtering
When at least one type has a directory view, the Groups directory gains a type filter in Nouveau’s dropdown. You can also link straight to /groups/type/courses/ from a menu. If you want one directory tab per type (the thing our old plugin added), the free BuddyPress Shortcodes plugin can render a filtered groups list on any page, which is often the cleaner answer: one landing page per type with its own copy and SEO title.
A worked example: a training company with three audiences
Here is a setup we deployed for a certification provider running LearnDash and BuddyPress on the Reign theme. They wanted cohort groups for each course run, regional meetup groups run by members, and a small set of staff-only groups.
| Type ID | Directory | Show on creation | Who creates them | Why |
|---|---|---|---|---|
cohort | /groups/type/cohorts/ | No | Created by code when a course run is published | Members should not be able to spin up fake cohorts |
meetup | /groups/type/meetups/ | Yes, pre-checked | Any member | Most member-created groups are regional meetups |
staff | None | No | Admins only, assigned in wp-admin | No public listing wanted at all |
Two things made this work. First, the cohort type is hidden from the create screen, and a small function on groups_create_group assigns it when our LearnDash integration creates the group. Second, the Groups menu item in the header points at /groups/type/meetups/ rather than /groups/, so new members land on the list that matters to them. Cohorts are reached from the course page instead.
Common problems and how we fix them
The type directory returns a 404
Rewrite rules have not been flushed. Visit Settings → Permalinks and click Save without changing anything. If you registered the type in code, make sure your hook fires on bp_groups_register_group_types and not on init, or the type may not exist when BuddyPress builds its routes.
Types do not appear in the create-group wizard
Check “Show on Group Creation” (dashboard) or show_in_create_screen (code). Also confirm the Groups component is active under Settings → BuddyPress → Components, and that Enable group creation for all users is ticked in Settings → BuddyPress → Options if you expect non-admins to see the wizard at all.
Bulk assignment wiped a type
As noted above, bulk actions in Groups → All Groups replace rather than append. For groups that need two types, set them one at a time from the metabox, or script it with bp_groups_set_group_type( $id, $type, true ).
Types show on the Reign or BuddyX group cards but not in a custom theme
The group card template needs to call bp_group_type_list() or check bp_groups_get_group_type(). Copy buddypress/groups/groups-loop.php from the template pack into your child theme and add the call where you want the label.
Frequently asked questions
Do I still need the BP Create Group Type plugin?
No. It was closed on WordPress.org in March 2022 and is not maintained. Core BuddyPress 7.0 and newer covers creating types, directory views and header display. For per-type listing pages, use a shortcode or a custom template.
Can a group belong to more than one type?
Yes. The admin metabox and bp_groups_set_group_type() with the append flag both support multiple types. The front-end creation wizard lets the creator tick several boxes as well. Only bulk assignment is single-type.
Does this work with BuddyBoss Platform?
BuddyBoss has its own Group Types screen under Groups → Group Types with extra options such as restricting who can create each type. The PHP functions above still exist because BuddyBoss forked BuddyPress, but test on staging, as some template functions differ.
Can I restrict who joins a group based on its type?
Not with types alone. Types are labels, not permissions. Combine them with group status (public, private, hidden) or with a membership plugin. Our BuddyPress Private Community Pro plugin can gate whole sections of the site by membership level if that is the real goal.
Where to start
Open Groups → Group Types, create two or three types with directory views, and bulk-assign your existing groups. Live with it for a month before adding more. If you later move the site to a Git-deployed theme, port the definitions into bp_groups_register_group_type() so they travel with the codebase. And if you need hierarchy or member-restricted types, budget for either BuddyBoss Platform or a small custom plugin rather than stretching group types past what they were designed for.
Related reading