UI & Branding Filter Hooks
FluentBoards Core IntermediateFilter hooks for the admin app, menus, script loading, avatars and logos, notification emails, and the Pro frontend portal and invitation pages. See the Filter Hooks overview for every filter grouped by area.
Hooks marked Pro run only when FluentBoards Pro is active. Source paths are relative to the plugin root. Paths that start with fluent-boards-pro/ are in the Pro plugin. Every filter must return the value it receives (modified or not).
Admin App
fluent_boards/app_url
Filters the base URL of the FluentBoards app. It is used for app links, email links, task redirects (fluent_boards_page_url()) and the base_url app variable. When the frontend portal or the board shortcode is active, Pro overrides it at priority 100.
Parameters
$urlstring: the app base URL, ending in#/
Default: admin_url('admin.php?page=fluent-boards#/')
Usage
add_filter('fluent_boards/app_url', function ($url) {
return home_url('/projects/#/');
}, 10, 1);2
3
Source: app/Functions/helpers.php, app/Hooks/Handlers/ExternalPages.php, fluent-boards-pro/boot/app.php
fluent_boards/app_vars
Filters the variables localized to the app as window.fluentAddonVars. This is the main way to pass server data to front-end add-ons.
Parameters
$varsarray: app variables, includingslug,nonce,rest,me,has_pro,base_url,asset_url,priorities,dashboard_notices,board_menu_items,file_upload_limit,transand more
Default: the full variables array built by AdminMenuHandler::getAddonVars()
Usage
add_filter('fluent_boards/app_vars', function ($vars) {
$vars['my_addon'] = [
'enabled' => true,
];
return $vars;
}, 10, 1);2
3
4
5
6
Source: app/Hooks/Handlers/AdminMenuHandler.php
fluent_boards/app_logo
Filters the logo URL shown in the app's top bar.
Parameters
$urlstring: the logo image URL
Default: the plugin's assets/images/logo.svg
Usage
add_filter('fluent_boards/app_logo', function ($url) {
return 'https://example.com/my-logo.svg';
}, 10, 1);2
3
Source: app/Hooks/Handlers/AdminMenuHandler.php
fluent_boards/app_icon
Filters the small icon URL shown in the app's top bar. Pro also filters it for the board shortcode.
Parameters
$urlstring: the icon image URL
Default: the plugin's assets/images/icon.svg
Usage
add_filter('fluent_boards/app_icon', function ($url) {
return 'https://example.com/my-icon.svg';
}, 10, 1);2
3
Source: app/Hooks/Handlers/AdminMenuHandler.php
fluent_boards/dashboard_notices
Filters the notices shown at the top of the FluentBoards dashboard. Each item is an HTML string, rendered as raw HTML in the dashboard.
Parameters
$noticesstring[]: HTML notice strings
Default: []
Note: The HTML is output unescaped. Escape any dynamic values yourself.
Usage
add_filter('fluent_boards/dashboard_notices', function ($notices) {
$notices[] = '<p>' . esc_html__('Planned maintenance on Friday.', 'my-plugin') . '</p>';
return $notices;
}, 10, 1);2
3
4
Source: app/Hooks/Handlers/AdminMenuHandler.php
fluent_boards/skip_no_conflict
On FluentBoards admin pages, scripts from other plugins are dequeued to avoid conflicts ("no-conflict" mode). Return true from this filter to turn that off.
Parameters
$skipbool: whether to skip no-conflict mode
Default: false
Usage
add_filter('fluent_boards/skip_no_conflict', '__return_true');Source: app/Hooks/Handlers/AdminMenuHandler.php
fluent_boards/asset_listed_slugs
Filters the allow-list of plugin script paths that no-conflict mode keeps on FluentBoards pages. Each entry is a regex fragment matched against the script src. The entries are joined with |. Scripts outside the plugins directory are never dequeued.
Parameters
$slugsstring[]: regex fragments with escaped slashes, for example'\/my-plugin\/'
Default: ['\/fluent-crm\/']. '\/fluent-boards\/' is always appended after the filter runs. On the Pro frontend portal, '\/fluent-boards-pro\/' and '\/fluent-security\/' are appended too (see portal_asset_listed_slugs).
Usage
add_filter('fluent_boards/asset_listed_slugs', function ($slugs) {
$slugs[] = '\/my-addon\/';
return $slugs;
}, 10, 1);2
3
4
Source: app/Hooks/Handlers/AdminMenuHandler.php, fluent-boards-pro/app/Hooks/Handlers/FrontendRenderer.php
fluent_boards/portal_asset_listed_slugs
Filters the final allow-list of plugin script paths kept on the frontend portal page. This list is used only for the portal.
Parameters
$slugsstring[]: theasset_listed_slugsresult plus'\/fluent-boards\/','\/fluent-boards-pro\/'and'\/fluent-security\/', de-duplicated
Default: as described above
Usage
add_filter('fluent_boards/portal_asset_listed_slugs', function ($slugs) {
$slugs[] = '\/my-portal-addon\/';
return $slugs;
}, 10, 1);2
3
4
Source: fluent-boards-pro/app/Hooks/Handlers/FrontendRenderer.php
Menus
fluent_boards/core_menu_items
Filters the first app top-bar menu items, before "Reports", "Community" (admins only) and "Front Portal" are appended. Use it to add items next to Dashboard and Boards.
Parameters
$menuItemsarray: menu key ⇒ item. Each item haskey,label,permalink, and optionallytarget.
Default: dashboard and boards
Usage
add_filter('fluent_boards/core_menu_items', function ($menuItems) {
$menuItems['my_page'] = [
'key' => 'my_page',
'label' => __('My Page', 'my-plugin'),
'permalink' => fluent_boards_page_url() . 'my-page',
];
return $menuItems;
}, 10, 1);2
3
4
5
6
7
8
Source: app/Hooks/Handlers/AdminMenuHandler.php
fluent_boards/menu_items
Filters the complete app top-bar menu, after all core items are added. Use it to add, remove or reorder items. The result is re-indexed with array_values().
Parameters
$menuItemsarray: menu key ⇒ item (key,label,permalink, optionaltarget)
Default: dashboard, boards, reports, plus help (Community, admins only) and front (Front Portal, only when the portal URL differs from the admin URL)
Usage
add_filter('fluent_boards/menu_items', function ($menuItems) {
unset($menuItems['reports']);
return $menuItems;
}, 10, 1);2
3
4
Source: app/Hooks/Handlers/AdminMenuHandler.php
fluent_boards/board_menu_items
Filters the items of the board sidebar menu (the board's "More" menu). The result is sorted by position and then validated on the server.
Parameters
$menuItemsarray: a list (numeric array) of menu items
This filter receives one argument. It does not pass a board ID, and the menu is built once for the app, not per board.
Default: about_this_board (1), board_activity (2), change_background (3), notification_settings (4), board_labels (5), custom_fields (6), board_members (7), archived_items (8), webhooks (9), associated_crm_contacts (9, removed when FluentCRM is not active), duplicate_board (10), restore_board (10), export (10.5, Pro), archive_board (11), delete_board (11). Values in parentheses are position.
Menu item structure
[
'key' => 'unique_identifier', // Required
'label' => 'Menu Label', // Required
'type' => 'custom', // 'default' for core items. Any other value is treated as 'custom'.
'position' => 10.5, // Optional. Lower comes first. Decimals let you slot between items. Missing = 999.
'icon' => '<svg>...</svg>', // Custom items: icon HTML
'html' => '<div>...</div>', // Custom items: panel content HTML
'width' => '500px', // Optional. Must be a non-empty string, or the item is dropped.
'render_in' => 'drawer', // Optional: 'drawer' (default) or 'modal'
'role' => 'admin', // Optional: 'admin' hides the item from non-admins
]2
3
4
5
6
7
8
9
10
11
Items without a key or label are removed. icon and html are rendered as raw HTML, so escape dynamic values yourself.
Usage
add_filter('fluent_boards/board_menu_items', function ($menuItems) {
$menuItems[] = [
'key' => 'my_custom_item',
'label' => 'My Custom Item',
'type' => 'custom',
'position' => 10.5,
'icon' => '<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor"><circle cx="8" cy="8" r="6"/></svg>',
'html' => '<div>Custom content</div>',
'width' => '500px',
'render_in' => 'drawer',
];
return $menuItems;
}, 10, 1);2
3
4
5
6
7
8
9
10
11
12
13
14
Source: app/Hooks/Handlers/BoardMenuHandler.php
Avatars & Logos
fluent_boards/get_avatar
Filters the avatar URL that FluentBoards shows for a user or email (fluent_boards_user_avatar()).
Parameters
$urlstring: the avatar URL$emailstring: the email address
Default: the user's FluentBoards profile photo, then a custom avatar attachment, then get_avatar_url(). For emails without a WordPress user, the Gravatar URL (with a ui-avatars.com fallback when a name is known).
Usage
add_filter('fluent_boards/get_avatar', function ($url, $email) {
return $url;
}, 10, 2);2
3
Source: app/Functions/helpers.php
fluent_boards/site_logo
Filters the site logo URL used in the header of notification emails.
Parameters
$logoUrlstring: the logo URL
Default: the theme's custom logo (get_theme_mod('custom_logo')) if set, otherwise ''. When it is empty, the email header shows the site title as text.
Usage
add_filter('fluent_boards/site_logo', function ($logoUrl) {
return 'https://example.com/email-logo.png';
}, 10, 1);2
3
Source: app/Functions/helpers.php
Emails
fluent_boards/email_header
Filters the header HTML of FluentBoards notification emails. The result is passed through wp_kses_post().
Parameters
$headerHtmlstring: the header markup
Default: an img tag with the site_logo (100px wide) when a logo exists, otherwise a div with the site title
Usage
add_filter('fluent_boards/email_header', function ($headerHtml) {
return $headerHtml . '<p>Project updates</p>';
}, 10, 1);2
3
Source: app/Views/emails/common-header.php
fluent_boards/email_footer
Filters the footer HTML of FluentBoards notification emails. The result is passed through wp_kses_post().
Parameters
$footerTextstring: the footer markup
Default: ''
Usage
add_filter('fluent_boards/email_footer', function ($footerText) {
return '<p>Sent by Example Inc.</p>';
}, 10, 1);2
3
Source: app/Views/emails/template.php, app/Views/emails/comment-added.php
Frontend Portal & Invitations
fluent_boards/no_permission_message
Filters the message shown on the frontend portal or the board shortcode when the logged-in user has no board access. The message is output inside a div and is not escaped.
Parameters
$messagestring: the message
Default: 'You do not have permission to view the projects' (translatable)
Usage
add_filter('fluent_boards/no_permission_message', function ($message) {
return esc_html__('Ask your project manager for access.', 'my-plugin');
}, 10, 1);2
3
Source: fluent-boards-pro/app/Hooks/Handlers/SingleBoardShortCodeHandler.php, fluent-boards-pro/app/Hooks/Handlers/FrontendRenderer.php
fluent_boards/login_header
Filters the heading above the login form shown to logged-out visitors on the frontend portal.
Parameters
$textstring: the heading text
Default: 'Please login to view the project' (translatable)
Usage
add_filter('fluent_boards/login_header', function ($text) {
return esc_html__('Sign in to your client area', 'my-plugin');
}, 10, 1);2
3
Source: fluent-boards-pro/app/Hooks/Handlers/FrontendRenderer.php
fluent_boards/invitation_form_title
Filters the title of the quick registration form that invited users see.
Parameters
$titlestring: the title
Default: 'Fluent Boards'
Usage
add_filter('fluent_boards/invitation_form_title', function ($title) {
return get_bloginfo('name');
}, 10, 1);2
3
Source: fluent-boards-pro/app/Views/register_member_form.php
fluent_boards/invitation_form_registration_text
Filters the subtitle of the invitation registration form.
Parameters
$textstring: the subtitle
Default: 'Quick Registration Form' (translatable)
Usage
add_filter('fluent_boards/invitation_form_registration_text', function ($text) {
return esc_html__('Create your account to join the board', 'my-plugin');
}, 10, 1);2
3
Source: fluent-boards-pro/app/Views/register_member_form.php
fluent_boards/invite_expiry_seconds
Filters how long a board invitation link stays valid, in seconds.
Parameters
$secondsint: the link lifetime$boardIdint: the board ID$emailstring: the invited email address
Default: 172800 (48 hours). Values below 300 seconds (5 minutes) are raised to 300.
Usage
add_filter('fluent_boards/invite_expiry_seconds', function ($seconds, $boardId, $email) {
return 7 * DAY_IN_SECONDS;
}, 10, 3);2
3
Source: fluent-boards-pro/app/Hooks/Handlers/InvitationHandler.php