Direktt Extensions are regular WordPress plugins that “plug into” existing Direktt user interfaces and APIs. With them you can:
- Add custom tools to the Direktt user profile UI (used by channel admins in the mobile app).
- Add custom settings panels under Direktt > Settings in wp-admin.
- Optionally add front-end services (pages/shortcodes) that are opened from:
- User Services (subscriber-facing Services in the app).
- Admin Services (admin-only Services in the app).
This section explains where you can integrate, how to do it, and how the Direktt Extension Boilerplate is structured as a starting point.
Where You Can Plug Into the Direktt UI
There are four main integration points:
User Services (subscriber-facing)
- Shown as buttons in the Services section of the channel in the Direktt mobile app.
- Implemented as URLs (usually WordPress pages with shortcodes) configured as Service Links in the Direktt Admin Console.
Admin Services (admin-facing)
- Shown as buttons in the Admin Services section when the channel admin is in Admin mode.
- Also implemented as URLs (WordPress pages with shortcodes) configured as Admin Links in the Direktt Admin Console.
Profile Tools – extension integration point
- Appear as extra “tools” / in the Direktt user profile UI – left site drawer menu, opened from the Direktt mobile app.
- Implemented via
Direktt_Profile::add_profile_tool()inside thedirektt_setup_profile_toolsaction.
Direktt Settings Panels in wp-admin – extension integration point
- Appear under Direktt > Settings in wp-admin as extra settings screens for your extension.
- Implemented via
Direktt::add_settings_page()inside thedirektt_setup_settings_pagesaction.
The first two are covered in the User Guide (Service Links & Admin Links).
This section focuses on Profile Tools and Settings Panels, using the Direktt Extension Boilerplate as a concrete example.
Extending the Direktt User Profile (Profile Tools)
The Direktt user profile page is a WordPress page rendered by the [direktt_user_profile] shortcode (see User Guide: Setting Up User Profile).
- Default URL:
https://your-domain/direktt-profile/ - Or: a custom URL you configure in the Direktt Admin Console as User Profile Url.
From the Direktt mobile app (Admin mode):
- The admin opens a chat with a subscriber.
- Taps the Profile button.
- The app opens the profile page (using
[direktt_user_profile]), including:- Basic user info.
- Built‑in tools (Notes, Taxonomies, Messaging).
- Any custom profile tools registered by your extensions.
How Profile Tools Are Registered
Profile tools are registered via the static method:
Direktt_Profile::add_profile_tool( $params );
You call this from a function hooked to:
add_action( 'direktt_setup_profile_tools', 'your_extension_setup_profile_tool' );
The Direktt core calls do_action( 'direktt_setup_profile_tools' ); on init.
Each extension listening to this action can register its own tools.
add_profile_tool() Parameter Reference
$params is an associative array. Important keys:
| Key | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Unique ID for the tool (used in the subpage query var and as part of CSS classes). |
label |
string | Yes | Label shown in the profile tools menu in the user profile UI. |
callback |
callable | Yes | PHP function/method that renders the tool’s content when this tool is active. |
categories |
array | No | Array of Direktt User Category slugs. Tool is visible only if the current Direktt user has at least one of these categories or is admin. |
tags |
array | No | Array of Direktt User Tag slugs. Tool is visible only if the current Direktt user has at least one of these tags or is admin. |
priority |
int | No | Sort order for this tool in the tools list (lower values appear first). |
cssEnqueueArray |
array | No | List of associative arrays describing CSS files to register and enqueue when this tool is active (compatible with wp_register_style()). |
jsEnqueueArray |
array | No | List of associative arrays describing JS files to register and enqueue when this tool is active (compatible with wp_register_script()). |
Each element of cssEnqueueArray / jsEnqueueArray is itself an associative array suitable to pass directly into wp_register_style() / wp_register_script() via splat (…$css_file / …$js_file), for example:
array(
'handle' => 'my-extension-profile-css',
'src' => plugin_dir_url( __FILE__ ) . 'css/profile.css',
'deps' => array(),
'ver' => '1.0.0',
'media' => 'all',
)
array(
'handle' => 'my-extension-profile-js',
'src' => plugin_dir_url( __FILE__ ) . 'js/profile.js',
'deps' => array( 'jquery' ),
'ver' => '1.0.0',
'in_footer' => true,
)
Direktt core:
- Registers these scripts/styles during
enqueue_profile_scripts(). - Enqueues them only when:
- The current subpage matches your
id, and - The user is allowed to see the tool (matching categories/tags or admin).
- The current subpage matches your
Profile Tool Example
// Hook: register our profile tool when Direktt sets up profile tools.
add_action( 'direktt_setup_profile_tools', 'direktt_extension_boilerplate_setup_profile_tool' );
function direktt_extension_boilerplate_setup_profile_tool() {
Direktt_Profile::add_profile_tool(
array(
"id" => "direktt-boilerplate-profile-tool",
"label" => __( 'Direktt Extension Tool', 'direktt-extension-boilerplate' ),
// This function renders the content of the tool.
"callback" => 'direktt_extension_boilerplate_render_profile_tool',
// Restrict to specific user categories/tags if needed.
"categories" => [], // e.g. array( 'vip', 'beta-testers' )
"tags" => [],
// Display order; lower values appear first.
"priority" => 1,
// Optional: register & enqueue extra CSS when this tool is active.
"cssEnqueueArray" => [
array(
"handle" => "direktt-extension-boilerplate",
"src" => plugin_dir_url( __FILE__ ) . 'css/direktt-extension-boilerplate.css',
// Optional: 'deps', 'ver', 'media' can be added here as usual.
),
],
// Optional: register & enqueue extra JS when this tool is active.
"jsEnqueueArray" => [
array(
"handle" => "direktt-extension-boilerplate-profile",
"src" => plugin_dir_url( __FILE__ ) . 'js/direktt-extension-boilerplate-profile.js',
"deps" => array( 'jquery', 'direktt-extension-boilerplate-public' ),
// Optional: 'ver', 'in_footer' can be added.
),
],
)
);
}
function direktt_extension_boilerplate_render_profile_tool() {
echo __( '<h3 class="direktt-extension-boilerplate">Direktt Extension Boilerplate Profile Interface Goes Here.</h3>', 'direktt-extension-boilerplate' );
}
What happens in the UI:
- In the Direktt mobile app (Admin mode), when the admin opens a user profile:
- A new tool entry “Direktt Extension Tool” appears in the left tools panel.
- When tapped, the profile page reloads with
?subscriptionId=...&subpage=direktt-boilerplate-profile-tool. - Direktt core:
- Checks authorization (categories/tags/admin).
- Calls
direktt_extension_boilerplate_render_profile_tool(). - Enqueues your CSS/JS defined in
cssEnqueueArray/jsEnqueueArray.
Tip: Use categories/tags on the tool definition to expose profile tools only to specific segments (e.g. show a “Loyalty” tool only for
vipusers).
Adding a Custom Settings Panel Under Direktt > Settings
The second extension point lets you add your own settings panel to the Direktt Settings area in wp-admin.
- Core Direktt plugin calls
do_action( 'direktt_setup_settings_pages' );. - Extensions hook into it and call
Direktt::add_settings_page().
How Settings Pages Are Registered
Register via:
Direktt::add_settings_page( $params );
From a function hooked to:
add_action( 'direktt_setup_settings_pages', 'your_extension_setup_settings_pages' );
The Direktt core then:
- Renders the corresponding settings page inside Direktt > Settings.
- Loads your assets declared via
cssEnqueueArray / jsEnqueueArrayon that page only.
add_settings_page() Parameter Reference
$params is an associative array. Important keys:
| Key | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Unique page ID (used internally for routing and element IDs). |
label |
string | Yes | Settings tab label shown in the Direktt Settings UI. |
callback |
callable | Yes | PHP function/method that renders your settings screen HTML. |
priority |
int | No | Sorting priority among settings tabs. Lower values appear first. |
cssEnqueueArray |
array | No | List of CSS files to register & enqueue on this settings page. Each entry is an associative array suitable for wp_register_style(). |
jsEnqueueArray |
array | No | List of JS files to register & enqueue on this settings page. Each entry is an associative array suitable for wp_register_script(). |
Each cssEnqueueArray / jsEnqueueArray element is an associative array directly suitable for wp_register_style() / wp_register_script() via spread operator.
Example element:
array(
'handle' => 'my-extension-settings-css',
'src' => plugin_dir_url( __FILE__ ) . 'css/settings.css',
// Optional: 'deps', 'ver', 'media'
)
array(
'handle' => 'my-extension-settings-js',
'src' => plugin_dir_url( __FILE__ ) . 'js/settings.js',
'deps' => array( 'jquery' ),
// Optional: 'ver', 'in_footer'
)
Settings Page Example
// Hook: register our settings page when Direktt sets up settings pages.
add_action( 'direktt_setup_settings_pages', 'direktt_extension_boilerplate_setup_settings_pages' );
function direktt_extension_boilerplate_setup_settings_pages() {
Direktt::add_settings_page(
array(
"id" => "extension-boilerplate",
"label" => __( 'Extension Boilerplate Settings', 'direktt-extension-boilerplate' ),
// This function renders the settings panel HTML.
"callback" => 'direktt_extension_boilerplate_render_settings',
"priority" => 1,
// Optional CSS assets for this settings screen only.
"cssEnqueueArray" => [
array(
"handle" => "direktt-extension-boilerplate",
"src" => plugin_dir_url( __FILE__ ) . 'css/direktt-extension-boilerplate.css',
),
],
// Optional JS assets for this settings screen only.
"jsEnqueueArray" => [
array(
"handle" => "direktt-extension-boilerplate-settings",
"src" => plugin_dir_url( __FILE__ ) . 'js/direktt-extension-boilerplate-settings.js',
"deps" => array( 'jquery' ),
),
],
)
);
}
function direktt_extension_boilerplate_render_settings() {
echo __( '<h3 class="direktt-extension-boilerplate">Direktt Extension Boilerplate Settings Go Here.</h3>', 'direktt-extension-boilerplate' );
}
What happens in wp-admin:
- In wp-admin > Direktt > Settings, a new tab/section labeled “Extension Boilerplate Settings” appears.
- When that tab is active:
- Direktt calls
direktt_extension_boilerplate_render_settings(). - CSS/JS from
cssEnqueueArray/jsEnqueueArrayare enqueued for that screen.
- Direktt calls
- This is where you build your extension’s configuration UI (options forms, toggles, etc.), usually storing values with
get_option()/update_option()or via Ajax.
Front-End Assets and direktt_enqueue_public_scripts
Often you’ll want front-end JS/CSS that run on Direktt-protected pages (for Services, profile tools, etc.).
The Direktt core triggers:
do_action( 'direktt_enqueue_public_scripts' );
during its public scripts flow. Your extension can hook into this to register/enqueue assets only when there is a current Direktt user.
Example from the Boilerplate:
add_action( 'init', 'direktt_extension_boilerplate_init' );
function direktt_extension_boilerplate_init() {
// Attach our public enqueue function to Direktt's custom hook.
add_action( 'direktt_enqueue_public_scripts', 'direktt_extension_boilerplate_enqueue_public_assets' );
}
function direktt_extension_boilerplate_enqueue_public_assets() {
$direktt_user = Direktt_User::direktt_get_current_user();
if ( $direktt_user ) {
wp_enqueue_script(
'direktt-extension-boilerplate-public',
plugin_dir_url( __FILE__ ) . 'js/direktt-extension-boilerplate-public.js',
array( 'jquery', 'direktt_public' ),
'',
array(
'in_footer' => true,
)
);
}
}
Key points:
Direktt_User::direktt_get_current_user()is used to check if this request is from a Direktt-authenticated user.- If yes, we enqueue
direktt-extension-boilerplate-public.js, depending on the main direktt_public script (which providesdirektt_publicJS object with useful data such asdirektt_post_id,direktt_ajax_url,direktt_rest_base, etc.). - This script can be used both:
- In your profile tools JS (deps can include
'direktt-extension-boilerplate-public'). - In service pages (custom shortcodes, etc.).
- In your profile tools JS (deps can include
Direktt Extension Boilerplate: What It Implements
The Direktt Extension Boilerplate (GitHub: https://github.com/direktt/direktt-extension-boilerplate) provides a minimal, working example of a Direktt extension plugin. It demonstrates:
- Safety & Activation Check
- Ensures the Direktt WordPress Plugin is active before this extension is activated.
- If not, it:
- Deactivates itself.
- Shows an admin notice and a plugins list row message.
- Public Asset Hook (
direktt_enqueue_public_scripts)- Shows how to enqueue a front-end script only when there is a Direktt user.
- Provides a base JS file (
direktt-extension-boilerplate-public.js) you can extend.
- Custom Settings Page (Direktt > Settings)
- Hooks
direktt_setup_settings_pages. - Calls
Direktt::add_settings_page()with: id,label,callbackcssEnqueueArray/jsEnqueueArray- Renders a minimal settings screen (“Direktt Extension Boilerplate Settings Go Here.”).
- Hooks
- Custom Profile Tool (User Profile UI)
- Hooks
direktt_setup_profile_tools. - Calls
Direktt_Profile::add_profile_tool()with: id,label,callback- Optional categories/tags filters.
cssEnqueueArray/jsEnqueueArray.- Renders a minimal profile tool tab (“Direktt Extension Boilerplate Profile Interface Goes Here.”).
- Hooks
You can clone this boilerplate and:
- Rename the plugin, text-domain, and handles.
- Replace the settings and profile tool callbacks with your own logic.
- Add further hooks:
- Direktt actions (
direktt/action/...). - Direktt message hooks (
direktt/message/template/...). - Direktt user events (
direktt/user/...).
- Direktt actions (
- Add Service pages with your own shortcodes, then wire them into Service Links/Admin Links in the Direktt Admin Console.
With these integration points, you can build powerful Direktt Extensions that feel native inside both Direktt mobile app and WordPress wp-admin, while leveraging standard WordPress plugin patterns.

