

<strong>NoticePilot Dashboard</strong> – Centralized hub to manage products, launch campaigns, and configure SDK integrations.
NoticePilot is not another admin notice plugin. It is a self-hosted remote campaign distribution platform built specifically for WordPress plugin and theme authors.
If you maintain a WordPress plugin or theme that runs on hundreds or thousands of sites, you need a reliable way to push announcements, update prompts, sale banners, or deprecation warnings to your users — without shipping a new plugin release for every message. NoticePilot solves this with a hub-to-remote architecture: you manage campaigns centrally on your own site, and a lightweight PHP SDK bundled in your plugin automatically fetches and displays them on every remote installation.
NoticePilot is purpose-built for WordPress plugin and theme developers who need to communicate with their users across multiple remote installations from a single, self-hosted dashboard. It is not a tool for managing or suppressing admin notices on a single site — there are many plugins already serving that purpose.
Unlike most admin-notice plugins, NoticePilot is a complete developer communication platform:
<, >, =), and WordPress user roles.<style> blocks, and custom layouts. Your content renders exactly as authored on every remote site.Plugin authors today face a difficult choice: build a custom notice system from scratch for every product (duplicating effort), or rely on third-party SaaS platforms (adding external dependencies and data-privacy concerns). NoticePilot offers a self-hosted, privacy-respecting, zero-external-dependency alternative that runs entirely on your own WordPress installation — giving you full control over your data and your users’ experience.
This section explains the complete end-to-end workflow for wiring the NoticePilot SDK into your own plugin or theme. Follow these steps in order — they cover everything from creating your first product on the hub through to verifying notices appear on remote sites.
Install and activate the NoticePilot plugin on your central management site (not on the sites of your customers). This is the one WordPress installation that will act as your private campaign server.
Once activated, navigate to NoticePilot in the WordPress admin sidebar. This is where all products and campaigns live.
A “Product” is the bridge between the hub and one of your plugins or themes.
Super SEO Form). NoticePilot automatically generates a URL-safe slug (e.g. super-seo-form). This slug is the identifier your SDK will use when polling for campaigns.Each product gets its own REST API endpoint in the form:
https://your-hub-site.com/wp-json/noticepilot/v1/content/your-product-slug
With your product created, you can add one or more campaigns (notices) to it.
Black Friday Sale 2025).<style> blocks, and any custom layout.You can attach multiple campaigns to a single product. All active and in-schedule campaigns are returned together when the SDK polls the endpoint.
class-remote-notice-client.php.Alternatively, copy the file directly from the sdk/ directory of the NoticePilot plugin.
Copy class-remote-notice-client.php into your plugin or theme directory. A recommended location is an includes/ subdirectory:
your-plugin/
├── your-plugin.php
└── includes/
└── class-remote-notice-client.php
The SDK is fully self-contained — no Composer, no external libraries, no additional files required.
Add the following code to your plugin’s main PHP file (or to your theme’s functions.php). Replace the placeholder values with your own product slug and hub URL:
// Load the NoticePilot remote notice SDK.
require_once __DIR__ . '/includes/class-remote-notice-client.php';
add_action( 'plugins_loaded', function() {
Noticepilot_Remote_Notice_Client::init( 'your-product-slug', [
'api_url' => 'https://your-hub-site.com/wp-json/noticepilot/v1/content/your-product-slug',
'schedule' => 'daily',
'capability' => 'manage_options',
'dismiss_duration' => WEEK_IN_SECONDS,
] );
} );
Copy the exact URL from your product card’s “How To Integrate” panel to avoid typos — the slug in api_url must match the product slug precisely.
api_url (required) — The full REST URL to your product’s content endpoint on the hub. Find it in the How To Integrate panel on the product card.schedule (optional) — How often the remote site polls the hub for new campaigns. Accepted values: hourly, twicedaily, or daily. Default: daily. Use hourly for time-sensitive campaigns; use daily to reduce server load.capability (optional) — The WordPress capability a user must have to see notices. Default: manage_options (administrators only). Change to edit_posts to show notices to editors as well.dismiss_duration (optional) — How long (in seconds) a dismissed notice stays hidden before it can reappear. Default: WEEK_IN_SECONDS. Pass 0 to make dismissals permanent for that campaign ID.If you use the audience-targeting feature (plan type, plugin version, or user roles), pass a $context array as the third argument to init():
Noticepilot_Remote_Notice_Client::init( 'your-product-slug', [
'api_url' => 'https://your-hub-site.com/wp-json/noticepilot/v1/content/your-product-slug',
'schedule' => 'daily',
], [
'plan' => 'free', // 'free' or 'pro' — matches Plan Type targeting on the hub.
'version' => '2.3.1', // Your plugin's current version string — matches Version targeting.
'roles' => wp_get_current_user()->roles, // Current user's roles array.
] );
The SDK sends this context to the hub, which filters campaigns before returning them. Campaigns with no targeting rules set are always returned regardless of context.
Trigger the first fetch manually: After adding the initialization code, log in to a remote WordPress admin that has your plugin active. The SDK registers a WP-Cron event on first load (plugins_loaded). To force an immediate fetch without waiting for the cron, use WP-CLI on the remote site:
wp cron event run noticepilot_rnc_fetch_content_your-product-slug
Check the stored contents option: In the remote site’s database, look for the option noticepilot_rnc_your-product-slug_contents. It should contain the JSON-encoded campaign data returned by the hub.
View the notice in the admin: Navigate to any admin page on the remote site. Active campaigns appear as standard WordPress admin notices at the top of the page. Each notice has a dismiss (✕) button.
Check the analytics: Go back to your hub site NoticePilot Analytics. After a page load on the remote site triggers a beacon, you should see an impression logged against your campaign within the hour (after the next rollup cron runs), or immediately after clicking ↻ Refresh Data on the Analytics page.
Understanding what the SDK does automatically helps you diagnose issues:
plugins_loaded, the SDK schedules a repeating WP-Cron event (e.g. noticepilot_rnc_fetch_content_your-product-slug) on the remote site if one is not already registered.GET request to the api_url endpoint on your hub. The hub checks each campaign’s enabled flag and schedule, then returns the active ones as JSON.wp_options table (key: noticepilot_rnc_your-product-slug_contents). Notices are rendered from this local cache on every page load — no live HTTP request is made on each admin page.admin_notices, the SDK outputs each cached campaign as a standard .notice div. Campaign HTML is filtered through wp_kses() before output to prevent script injection.navigator.sendBeacon() call to the hub’s analytics tracking endpoint. This is fire-and-forget and does not block the page.noticepilot_rnc_your-product-slug_dismissed_ids. Only the 20 most recent IDs are kept. After dismiss_duration seconds, the campaign can reappear.Noticepilot_Remote_Notice_Client. It checks class_exists() before declaring itself, so it is safe to bundle in multiple plugins on the same site without conflicts.init() call is keyed by its product slug. Multiple plugins on the same remote site can each run their own SDK instance independently.class_exists( '\NoticePilot\Core' ). This is useful for offering hub-specific admin links in a bundled UI.do_action( 'noticepilot_rnc_fetch_content_your-product-slug' );