Updated for version 0.9.80+
The xAPI / LRS module sends learning events to an external Learning Record Store using xAPI 1.0.3. This reference documents the integration class, event mapping, statement structure, filter, and options.
Table of Contents
- Checking Module Status
- XapiLrsIntegration
- Event-to-xAPI Mapping
- Statement Structure
- Filter: brm_xapi_statement
- Options Reference
- Cron Hook
- Reset Enabled Cache
Checking Module Status
use BaselMedia\BricksMembers\Core\ModuleRegistry;
if ( ModuleRegistry::is_active( 'xapi_lrs' ) ) {
// xAPI integration is available.
}
XapiLrsIntegration
Namespace: BaselMedia\BricksMembers\Integrations\XapiLrsIntegration
Singleton integration class. Loaded only when the xAPI module is enabled. Listens for brm_event, enqueues matching events to brm_xapi_queue table, and processes the queue via cron.
$integration = \BaselMedia\BricksMembers\Integrations\XapiLrsIntegration::get_instance();
Queue delay: 5 minutes (QUEUE_PROCESS_DELAY_SECONDS = 300)
Batch size: 500 statements per cron run
Retry behavior: Rows are deleted only on successful send (2xx). Failed sends remain in the queue for retry on the next cron run.
Event-to-xAPI Mapping
| BRM Event | xAPI Verb IRI |
|---|---|
progress_completed | http://adlnet.gov/expapi/verbs/completed |
certificate_issued | http://adlnet.gov/expapi/verbs/earned |
quiz_passed | http://adlnet.gov/expapi/verbs/passed |
quiz_failed | http://adlnet.gov/expapi/verbs/failed |
submission_reviewed | http://adlnet.gov/expapi/verbs/experienced |
Statement Structure
Each statement follows xAPI 1.0.3:
- actor:
mbox(mailto:user@example.com),namefrom WordPress user - verb: Resolved from event type (see mapping above)
- object: Activity ID
{home_url}/activity/{resource_type}/{resource_id}, definition with human-readable name - result: For quiz/certificate —
success,score.scaledwhen available - context:
platform: "BricksMembers", extensions withtype,resource_type,resource_id,trigger,correlation_id - timestamp: ISO 8601 from event timestamp
Filter: brm_xapi_statement
Modify the statement before sending to the LRS.
add_filter( 'brm_xapi_statement', function( array $statement, \BaselMedia\BricksMembers\Core\Event $event ) {
$statement['context']['extensions']['https://yoursite.com/custom'] = array(
'custom_field' => 'value',
);
return $statement;
}, 10, 2 );
Parameters:
$statement(array) — The xAPI statement array$event(Event) — The source BricksMembers event
Returns: Modified statement array (must remain valid xAPI structure)
Options Reference
| Option | Type | Default |
|---|---|---|
brm_enable_xapi_lrs | bool | false |
brm_xapi_endpoint | string | '' |
brm_xapi_key | string | '' |
brm_xapi_secret | string | '' |
brm_xapi_events | array | ['progress_completed','certificate_issued','quiz_passed','quiz_failed'] |
brm_xapi_key and brm_xapi_secret are non-autoload and excluded from settings export/import.
Cron Hook
Hook: brm_xapi_process_queue
Scheduled via wp_schedule_single_event( time() + 300, 'brm_xapi_process_queue' ) when events are enqueued. Processes up to 500 rows per run; remaining rows processed in subsequent cron runs. Failed statements (non-2xx) are not deleted and are retried on the next run.
Reset Enabled Cache
XapiLrsIntegration::reset_enabled_cache() — Call after settings change to clear the in-request cache for endpoint/key/secret checks. Called automatically when settings are saved.
Related
User guide: xAPI / LRS Integration Guide