Common Patterns & Code Examples

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.

Get BricksMembers

Start Building Your Membership Site Today

Create, sell, and manage your content without limits. BricksMembers gives you everything you need to build membership and LMS sites with Bricks Builder.

Lifetime updates & bug fixes • Premium support • 0% transaction fees • 60-day money-back guarantee