Tier 2 (Pro) sites can register SignalPress destinations from separate WordPress plugins without copying files into signalpress/ or signalpress-pro/.
Bundled official services: Add a bundled service. Overview: Extending SignalPress.
Requirements
- SignalPress and SignalPress Pro active
- Tier 2 license (
signalpress_has_license_level( 2 )) - Service class implementing
SignalPress_Service - Registration on
signalpress/register_services(orsignalpress/register_providers)
Below Tier 2:
signalpress/register_servicesandsignalpress/register_providersdo not run$registry->register()returnsfalsesignalpress/providersfilter is not appliedsignalpress/bundled_service_filesadditions are ignored
Plugin structure
Text
my-signalpress-integration/ my-signalpress-integration.php ← main plugin file class-my-logging-service.php logo.svg
Service class
PHP
[
'label' => 'API key',
'type' => 'password',
],
];
}
public function is_configured( array $settings ) {
return ! empty( $settings['enabled'] ) && ! empty( $settings['api_key'] );
}
public function capture( SignalPress_Event $event, array $settings ) {
// Send with wp_remote_post(); return true or WP_Error.
return true;
}
}
Use a unique get_id() — it becomes the Service Targeting key and option namespace under signalpress_settings.
Register on boot
Load the class inside the callback so SignalPress interfaces exist:
PHP
add_action(
'signalpress/register_services',
function ( SignalPress_Provider_Registry $registry ) {
require_once __DIR__ . '/class-my-logging-service.php';
$registry->register( new My_Logging_Service() );
}
);
signalpress/register_providers fires in the same boot pass with the same registry — use either hook, not both, unless registering distinct providers.
Success and failure
PHP
$registered = $registry->register( new My_Logging_Service() );
if ( ! $registered ) {
// Tier 2 not active -- do not rely on this integration.
}
After registration
Successful registration:
- Adds a card on SignalPress → Integrations (logo, description, premium badge)
- Creates SignalPress → {Service name} when the integration is activated
- Exposes Settings, Routing, Logs, and Help tabs like built-in services
- Participates in Advanced Event Routing and Request rules when Tier 2 routing is available
Administrators (or roles with Manage integrations) activate the integration and configure credentials.
Premium and licensing
Set is_premium() to true when the destination requires a paid SignalPress tier or a hub feature flag.
Optional:
PHP
public function get_required_license_feature() {
return 'my_logging_service';
}
When set, is_service_licensed() checks the hub features map via signalpress_has_feature(). When empty, premium services fall back to signalpress_is_pro().
Filter the provider list
After registration, signalpress/providers can adjust the in-memory provider map (Tier 2 only):
PHP
add_filter(
'signalpress/providers',
function ( $providers ) {
unset( $providers['my_logging_service'] ); // rare -- prefer not registering.
return $providers;
}
);
Prefer register() / omit registration over removing providers at runtime.
Integration metadata
signalpress/integrations filters the Integrations browser array (cards, upgrade URLs, active state). Use it to adjust marketing copy — not to bypass licensing.
Testing
- Confirm Tier 2 license is active — License activation.
- Activate your WordPress plugin.
- Open Integrations — your service card should appear.
- Activate the integration and Enable service on Settings.
- Run a connection test if implemented.
- Call
sp_capture()with'services' => [ 'my_logging_service' ]and verify the Logs tab.
Hard dependency vs optional
Optional (recommended for public plugins):
PHP
if ( function_exists( 'sp_capture' ) ) {
sp_capture( 'order completed', [ 'order_id' => 123 ], [], [ 'my_logging_service' ] );
}
Hard dependency — require SignalPress active and fail gracefully in admin if Tier 2 is missing.