Two Pipelines
Pipeline A — ProcessShortcodes Middleware
Pipeline A runs as HTTP middleware on all public frontend HTML responses. It fires after the full page has been rendered to a string, scanning the complete output for shortcode tags.
Shortcodes Handled by Pipeline A
[list:N]— list menu embedding[page:N]— CMS page links[product:N]— product page links[category:N]— category page links[brand:N]— brand page links
Processing Order
1
[list:N] Expansion
Scans the final rendered HTML for
[list:N] patterns and renders each matched list menu as a structured <ul>/<li> HTML block.2
Internal Item Compilation
Resolves each list item’s content into
<a> tags wrapped in <ul>/<li> HTML structure.3
Embedded Plugin/Download in List Items
[download:N] and [plugin:slug] shortcodes embedded inside list menu items are also resolved at this stage, within Pipeline A.4
Post-Expansion Resolve
A second pass resolves any standalone
[page:N], [product:N], [category:N], and [brand:N] tags remaining in the page content or footer layouts.Pipeline B — ContentParserService::parse()
Pipeline B is called explicitly on individual content fields — before the content is inserted into the page template. It processes Blade directives and the richer embedded-content shortcodes.
Shortcodes Handled by Pipeline B
[cms-form id=N][code-embed:N][download:N][plugin:slug]- Blade directives (
@auth,{{ }},{!! !!}, etc.)
Processing Order (Four Sequential Passes)
Passes are sequential and non-overlapping. This means a
[plugin:slug] shortcode inside a [download:N]-rendered block will not be processed, because downloads are resolved before plugins.Shortcode Support Matrix
The table below shows which shortcodes are supported in each content context, and which pipeline resolves them.¹[download:N]and[plugin:slug]inside list menu items are resolved automatically during list menu rendering, which runs within Pipeline A.
Model Accessors That Enable Pipeline B
Pipeline B is invoked through Eloquent model accessors. When your Blade template uses the parsed accessor instead of the raw column,ContentParserService::parse() is automatically called.
Example:
Adding Pipeline B to a New Content Field
To enable full shortcode and Blade directive processing on a custom model field, add a parsed accessor and callContentParserService::parse():
