Connected Content: Link Courses to Products

Available since BricksMembers 1.4.0.

Connected Content links two local WordPress content items without merging them into a single object. A typical setup is a public WooCommerce, FluentCart, or SureCart product connected to a separate BricksMembers course. The product stays as the sales and checkout page while the course remains the learning experience.

Once two items are connected you can display fields from one side on the other, filter a native Bricks post loop by the relationship, or optionally synchronize selected values when another plugin requires a stored copy on the current post.

When to Use Connected Content

  • Keep a WooCommerce product as the public sales page and a BricksMembers course as the protected learning area.
  • Show product marketing fields, ACF values, native Content Fields, or WooCommerce product data in a course template without entering them twice.
  • Show course information on a connected product page while keeping the course as the canonical source.
  • Return only products connected to the current course, or only courses connected to the current product, in a normal Bricks Posts query loop.
  • Copy a selected source field into a target field when a shortcode, integration, or third-party plugin can only read stored data from the current post.

Connected Content is separate from commerce access mapping. You still map the WooCommerce, FluentCart, or SureCart product to a BricksMembers level inside the relevant Integrations provider tab (WooCommerce, FluentCart, or SureCart). That mapping controls what a purchase grants. Connected Content controls the editorial relationship and field flow between the product and the course.

Recommended Course and Product Architecture

For most paid courses, keep three separate responsibilities:

  1. Commerce product: public landing page, sales copy, pricing, checkout, orders, taxes, coupons, and subscriptions.
  2. BricksMembers course: curriculum, modules, lessons, progress, drip rules, learner navigation, and protected course content.
  3. BricksMembers level: the access contract between the purchase and the protected course.

In this model the course is the Owner and the product is the Connected side. Connect the two with Connected Content. This avoids forcing objects with different responsibilities into one post and scales cleanly to bundles, multiple courses, and all-access products.

Step 1: Enable the Module

  1. Go to BricksMembers → Modules.
  2. Enable Connected Content.
  3. Open BricksMembers → Connected Content (in the Content group).

Step 2: Create a Connection Type

A connection type defines which post types can be linked on each side. Example values:

  • Key: course_product
  • Label: Course Product
  • Owner post types: your top-level course post type
  • Connected post types: WooCommerce Product, FluentCart Product, or a local SureCart product post

The key becomes the stable identifier used by Bricks controls and advanced dynamic tags. After adding or changing a type, select which post types it is Enabled on, then click Save Definitions. The Connections tab will not work until definitions are saved.

Step 3: Connect the Course and Product

  1. Open the Connections tab.
  2. Select the connection type.
  3. Choose the course as the Owner post and the commerce product as the Connected post.
  4. Click Add Connection.

A post may have more than one relation of the same type. Dynamic aliases resolve one primary relation, so use Set Owner Primary or Set Connected Primary when the relevant side has multiple connections. A single relation is selected as primary automatically.

Display a Connected Field Without Copying It

Dynamic Aliases are the preferred approach when Bricks only needs to display a value. They read the value live from the primary connected post, keeping a single source of truth.

  1. Open the Dynamic Aliases tab and click Add Alias.
  2. Enter an Alias key, such as product_hero.
  3. Select the course_product connection type.
  4. Choose the Source endpoint. Pick Other side when the alias should read whichever endpoint is opposite the current post. Choose Owner or Connected only when the source must always be a specific side.
  5. Enter the Inner Bricks tag, for example acf_product_hero, brm_cf:course_duration, post_title, featured_image, or a supported WooCommerce product tag.
  6. Set the Exposure. Keep Inherit source access unless this is intentionally public marketing data.
  7. Use {brm_connected:product_hero} in Bricks.

On lessons and other descendants, BricksMembers first checks the current post and then the top-level structure item. This means a relation stored on the course can still power connected fields inside lesson templates.

Advanced Tag Syntax

You can also project a tag inline without creating an alias:

{brm_connected:course_product:connected:acf_product_hero}
{brm_connected:course_product:other:post_title}
{brm_connected:course_product:owner:brm_cf:course_duration}

The format is {brm_connected:connection_type:endpoint:inner_bricks_tag}. Advanced tags always inherit the source post’s access rules. Prefer a named alias for normal projects because the shorter tag is easier to maintain and can be reviewed centrally.

Filter a Native Bricks Query Loop

  1. Create a normal Bricks Posts query loop.
  2. Choose the post type you want to return, such as products or courses.
  3. In the native Posts query loop control, find the Connected Content control and set it to your connection type.
  4. Continue using the normal order, pagination, taxonomy, and other query settings as usual.

The control is available on native Posts loops hosted by Section, Container, Block, Div, Accordion, Slider, and Posts elements. When Bricks leaves the query object type at its default, AtomikMembers treats it as Posts, so you do not need to select Posts explicitly.

Connected Content adds a filter to the native query; it does not create a separate query type. When the module, connection type, relation, or structure anchor is unavailable, the query returns no posts instead of silently showing unrelated content.

Community Linked Content (Separate Feature)

BRM Community discussions have their own linked-content workflow. Inside a Community Item or Reply design, the brm-community-link element with Link Direction set to Show linked content returns the single authorized WordPress post attached to that discussion. This is part of the Community module, not the Connected Content module. Connected Content links arbitrary posts through configured connection types; Community linked content exposes the post already attached to a discussion entry.

Use Field Sync Only When a Stored Copy Is Required

Some shortcodes and third-party integrations only inspect fields on the current post. In that case, configure a directional Field Sync mapping to materialize a copy. If Bricks can render the value through a Dynamic Alias, do not synchronize it unnecessarily.

  1. Open the Field Sync tab and click Add Mapping.
  2. Select the connection type and choose the source and target sides.
  3. Select the source and target families: POST (WordPress post field), ACF, BRM_CF (Content Field), or META (explicitly typed safe post meta). When using META, you must also specify the Meta value type.
  4. Enter the field keys. For POST fields, supported keys are title, excerpt, content, slug, and featured_image.
  5. Enable and save the mapping. Future source saves queue the update in the background.
  6. Select the mapping under Mapping for initial sync and click Run Initial Sync to process existing connections.

Sync is one-way. If two values need to move in opposite directions, decide which object owns each value and create separate non-conflicting mappings. BricksMembers rejects circular mappings and multiple active mappings that try to own the same target field.

Supported Commerce Boundaries

  • WooCommerce: products are local WordPress posts. Connected Content can project supported WooCommerce Bricks tags and safely synchronize the product name, description, short description, slug, or image through WooCommerce’s product API.
  • FluentCart: local product posts can participate through normal WordPress fields, ACF, Content Fields, and safe local metadata.
  • SureCart: local product posts can be connected and used for local-field projection. SureCart cloud product data is outside this workflow, and WordPress post fields on the local SureCart product are not Field Sync targets.

Pricing, inventory, variations, subscriptions, checkout, payment data, passwords, tokens, Bricks internals, and BricksMembers canonical metadata are deliberately blocked from Field Sync.

Content Fields, ACF, and Connected Content

  • Content Fields or ACF define and store data on a post.
  • Connected Content defines which posts are related and lets one side read or selectively synchronize fields from the other.
  • Commerce product-to-level mapping decides which BricksMembers access level a purchase grants. Configure this in the relevant Integrations provider tab (WooCommerce, FluentCart, or SureCart).

You can keep using ACF on an existing site. Native BricksMembers Content Fields are an alternative when you want BricksMembers to own the field definitions and Bricks integrations. Connected Content works with both.

Troubleshooting

  • The alias is empty: confirm the module, connection type, alias, and connection are all enabled. Check the selected source endpoint and primary relation. Then confirm the viewer can access the source post or that the alias exposure is intentionally public.
  • The query returns no posts: confirm the loop is a native Posts query, the returned post type matches the connected side, and the current post or its top-level course has a relation of the selected type.
  • A lesson cannot find its product: connect the product to the top-level course. Structure fallback is limited to the top-level item and does not scan arbitrary parents or metadata.
  • Field Sync does not run: confirm the mapping and connection type are enabled, save the source side (not the target), and check the job queue at BricksMembers → Automations → Jobs. Use Run Initial Sync for existing relations.
  • A field is rejected: use an existing ACF field key, existing Content Field key, supported WordPress field, or an explicitly typed safe meta key. Protected and commerce-sensitive targets are intentionally unavailable.

Recommended Setup for One Course

  1. Create the WooCommerce, FluentCart, or SureCart product as the public sales page.
  2. Create the separate BricksMembers course and its lessons.
  3. Create a course access level and require it on the course content.
  4. Map the commerce product to that level in the relevant Integrations provider tab (WooCommerce, FluentCart, or SureCart).
  5. Create a course_product Connected Content type with the course as Owner and the product as Connected. Select the post types it is Enabled on and click Save Definitions.
  6. Open the Connections tab and link the two posts with Add Connection.
  7. Keep each field on the object that owns it. Use Dynamic Aliases to display it on the other side, and use Field Sync only when an external consumer requires stored target data.
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