Appearance
Store dynamic data
With the FluentCart or WooCommerce module on, three groups join VX's dynamic data and work everywhere VX Script runs: the Elementor tags and picker, visibility rules, Gutenberg block bindings, and Bricks.
The paths are the same for both stores on purpose, so a site that switches keeps its pages working.
In the VX picker
| Folder | Under |
|---|---|
| Product | Post |
| Product › Variation | Post |
| Cart | User |
| Customer | User |
@product(…)
The product the page is about — or the product a loop row pinned.
| Path | Type | |
|---|---|---|
id | number | |
title | text | |
price | number | |
price_formatted | text | With the currency |
price_max | number | The top of a range |
price_max_formatted | text | |
price_range | text | The whole range as text |
compare_price | number | The compare-at price |
compare_price_formatted | text | |
on_sale | yes/no | |
stock_status | text | |
in_stock | yes/no | |
stock_quantity | number | |
sku | text | |
fulfillment | text | Physical or digital |
variation_type | text | Simple or variable |
is_variable | yes/no | |
is_subscription | yes/no | |
has_subscription | yes/no | Any variation is a subscription |
purchase_url | URL | |
view_url | URL | |
categories | text | |
variations_count | number | |
thumbnail | URL | The product image. thumbnail.id gives the attachment id |
compare_price is the compare-at price on FluentCart and the regular price on WooCommerce, so a sale price and its struck-through original read the same way on both.
WooCommerce also has
| Path | Type | |
|---|---|---|
price_html | text | WooCommerce's own price markup, ranges and "From" prefixes included |
price_html for Woo stores
WooCommerce renders strikethrough sale prices, ranges, and "From" prefixes in its own markup. Binding a heading to @product(price_html) gives you exactly what a Woo theme shows, currency formatting included.
@product(variations) — a loop source
@product(variations) is loopable. Put it on a loop and read the current row with @product(variation.…):
| Path | Type |
|---|---|
id | number |
title | text |
description | text |
price, price_formatted | number, text |
compare_price, compare_price_formatted | number, text |
on_sale | yes/no |
sku | text |
stock_status, in_stock, stock_quantity | text, yes/no, number |
payment_type | text — one-time or subscription |
is_subscription | yes/no |
billing_terms | text |
purchase_url | URL |
fulfillment | text |
image | URL — the variation's own image |
On WooCommerce a variation's title is built from its attributes, and name is available alongside it.
@product(variation.…) outside a loop reads the product's default variation, which is the tidiest way to show a starting price.
A variations table in four steps
- Add a container with one row of elements — name, price, stock, a buy link.
- Set the container's VX Loop source to
@product(variations). - Bind the elements to
@product(variation.title),@product(variation.price_formatted), and@product(variation.purchase_url). - Add a visibility rule on the row so out-of-stock variations drop out.
@cart(…)
The visitor's own cart.
| Path | Type | |
|---|---|---|
items | number | Line items |
count | number | Total quantity |
subtotal | number | |
subtotal_formatted | text | |
checkout_url | URL | |
has_items | yes/no | |
has_product | yes/no | The cart holds the product this page is about |
WooCommerce also has
| Path | Type |
|---|---|
total, total_formatted | number, text |
cart_url | URL |
@customer(…)
Whoever is looking at the page.
| Path | Type | |
|---|---|---|
is_customer | yes/no | Has ever bought anything |
has_bought | yes/no | Has bought the product this page is about |
has_subscription | yes/no | Has an active subscription to it |
orders | number | |
spent | number | |
spent_formatted | text | |
since | date | Customer since |
last_order | date | WooCommerce only |
is_customer, has_bought, and has_subscription are also what the matching visibility rules test, so use the rules to show and hide and the tags to print.
On WooCommerce, has_subscription needs WooCommerce Subscriptions.
Visibility rules
Eight store rules join VX's own rule catalog, available on any element's VX Visibility section:
| Rule | About |
|---|---|
| Product is in stock | The product |
| Product is on sale | The product |
| Product is a subscription | The product |
| Viewer has bought this product | The viewer |
| Viewer has an active subscription | The viewer |
| Viewer is a customer | The viewer |
| Cart has items | The cart |
| Cart holds this product | The cart |
The rule ids are shared between the two modules, so rules built on a FluentCart site keep working if the site moves to WooCommerce, and the other way round.
Things these make easy
| Goal | Rule |
|---|---|
| A download link only for buyers | Viewer has bought this product |
| A "back in stock" notice | Hide when Product is in stock |
| A sale badge | Show when Product is on sale |
| A "resume checkout" bar | Show when Cart has items |
| A members-only block | Show when Viewer has an active subscription |
| A first-order coupon | Hide when Viewer is a customer |
Bricks
VX's own Bricks integration publishes fields only, so the store data arrives in Bricks as dynamic tags of its own, in Product, Product variation, Cart, and Customer groups in the builder's picker:
{vxm_product_price_formatted}
{vxm_product_variation_title}
{vxm_cart_count}
{vxm_customer_has_bought}The naming is mechanical: @product(variation.title) becomes {vxm_product_variation_title}, so anything in the tables above has a Bricks tag.

