Portal (E5)
The member portal is a /members page (slug configurable via general.portal_slug) that renders [omembership_portal]. The shortcode delegates to OMembership_Portal::render(), which composes five filterable sections.
Default sections
| Key | Label | Callback |
|---|---|---|
home | Home | Dashboard summary, active plans count |
courses | My Courses | Progress per course (lessons completed / total) |
community | Discussions | Recent topics from spaces the member can read |
directory | Members | Searchable member directory |
account | Account | Subscription, billing history, profile |
Themes re-order or remove sections via:
phpadd_filter( 'omem/portal/sections', function( array $sections, int $user_id ): array {
unset( $sections['directory'] );
return $sections;
}, 10, 2 );Themes
Eight built-in themes ship: Indigo (default), Aurora, Obsidian, Atelier, Penelope, Nebula, Compass, Prism. The active theme writes a single class to the portal wrapper; CSS variables drive the rest. Theme tokens are documented in assets/css/portal.css and OMembership_Frontend::valid_themes().
Templates
The portal resolves portal.php through OMembership_Templates::render() before falling back to the inline renderer. Drop a portal.php into your theme's omembership/ directory to take full control of the markup.
Launcher
A floating launcher widget renders on every page when settings.launcher.enabled is true. Eight anchor positions are supported:
top-left top-center top-right
middle-left middle-right
bottom-left bottom-center bottom-rightPer-axis offsets (offset_x, offset_y) let admins nudge the launcher around existing chat widgets or cookie banners. The launcher renders into wp_footer and skips pages matched by the hide_on glob list.
The widget fetches member state lazily through the REST API:
GET /wp-json/omem/v1/me/progressThe nonce + REST URL are bridged into JS via wp_localize_script under the global OMembershipLauncher.
Account Hub integration
If Orravo Core's unified Account Hub is active, OMembership_Account_Hub::init() registers the portal sections through orravo_account_sections and assets through orravo_account_enqueue, so the same surface renders inside the suite-wide account page. Both hooks no-op when the hub is absent.

