Real-world code examples for common BricksMembers integration patterns.
Level Assignment Automation
// Auto-assign level on user registration (use brm_with_event_context for integrations)
add_action('user_register', function($user_id) {
$free_level_id = 1;
brm_with_event_context(\BaselMedia\BricksMembers\Core\Event::TRIGGER_CORE, 'registration', function() use ($user_id, $free_level_id) {
brm_add_user_level($user_id, $free_level_id);
});
});
// Auto-assign level based on purchase (WooCommerce, FluentCart, and SureCart modules handle this natively; manual example below)
add_action('woocommerce_order_status_completed', function($order_id) {
$order = wc_get_order($order_id);
$user_id = $order->get_user_id();
foreach ($order->get_items() as $item) {
if ((int) $item->get_product_id() === 123) {
brm_with_event_context(\BaselMedia\BricksMembers\Core\Event::TRIGGER_WOOCOMMERCE, 'purchase', function() use ($user_id) {
brm_add_user_level($user_id, 5);
});
}
}
});
Progress Tracking Integration
// Award points on completion
add_action('brm_event_progress_completed', function(\BaselMedia\BricksMembers\Core\Event $event) {
$user_id = $event->get_user_id();
$post_id = $event->get_resource_id();
$points = (int) get_user_meta($user_id, 'points', true);
$points += 10; // Award 10 points
update_user_meta($user_id, 'points', $points);
// Check if this is a course completion
$post_type = get_post_type($post_id);
if ($post_type === 'course') {
// Award course completion badge
update_user_meta($user_id, 'course_completed_' . $post_id, true);
do_action('brm_course_completed', $user_id, $post_id);
}
});
Reading the Last Completed Tracking Item
For Bricks templates, prefer the native dynamic tag {brm_progress:completed_item:last} or its :url, :title, and :id outputs. Inside plugin internals, use the progress read service directly so the request-local cache and structure boundary resolution stay centralized.
$target_post_id = \BaselMedia\BricksMembers\Modules\Progress\CompletedItemTargetReadService::get_instance()->get_last_completed_post_id(
$user_id,
$post_id,
'toplevel'
);
$dashboard_target_id = \BaselMedia\BricksMembers\Modules\Progress\CompletedItemTargetReadService::get_instance()->get_last_completed_post_id_by_structure_id(
$user_id,
'course_tree'
);
This is a read-only path. Completion writes still go through the progress completion owner, and internal code should not route through public brm_* wrappers for this target lookup.
Webhook Integration
// Send webhook on level assignment
add_action('brm_event_access_granted', function(\BaselMedia\BricksMembers\Core\Event $event) {
$user_id = $event->get_user_id();
$level_id = $event->get_resource_id();
$level = brm_get_level_by_id($level_id);
$user = get_userdata($user_id);
wp_remote_post('https://your-api.com/webhook', [
'body' => json_encode([
'event' => 'user_level_added',
'user_id' => $user_id,
'user_email' => $user->user_email,
'level_id' => $level_id,
'level_name' => $level->name
]),
'headers' => [
'Content-Type' => 'application/json',
'X-API-Key' => 'your-api-key'
]
]);
});
Custom Dynamic Tag
// Register custom dynamic tag
add_filter('bricks/dynamic_tags_list', function($tags) {
$tags[] = [
'name' => 'brm_custom_points',
'label' => 'User Points',
'group' => 'BricksMembers',
'callback' => 'render_custom_points_tag'
];
return $tags;
});
function render_custom_points_tag($post_id, $args) {
$user_id = get_current_user_id();
if (!$user_id) {
return '0';
}
$points = (int) get_user_meta($user_id, 'points', true);
return (string) $points;
}
Batch User Level Assignment
// Bulk assign level to users
function bulk_assign_level($user_ids, $level_id) {
$success = 0;
$failed = 0;
foreach ($user_ids as $user_id) {
if (brm_add_user_level($user_id, $level_id)) {
$success++;
} else {
$failed++;
}
}
return [
'success' => $success,
'failed' => $failed
];
}
// Usage
$user_ids = [1, 2, 3, 4, 5];
$result = bulk_assign_level($user_ids, 5);
This is the service-level pattern behind the User Levels page batch-apply workflow. The standalone Bulk Assign admin page no longer exists.