Liquid Ajax Cart re-renders elements with the data-ajax-cart-section attribute after each POST Shopify Cart API Ajax request.
It uses Shopify Bundled section rendering under the hood,
so the data-ajax-cart-section must be used inside a Shopify section.
Before sending a Shopify Ajax Cart API Ajax request, which are initiated by user cart-related actions
(such as adding a product to the cart or changing item quantity) or by a developer (using
the methods
add,
change,
update,
clear
of the liquidAjaxCart object), Liquid Ajax Cart does the following:
data-ajax-cart-section elements;sections property to the body of the request so that Shopify returns the re-rendered HTML of the Shopify sections found (Bundled section rendering).POST /cart/add.js
"Content-Type": "application/json"
{
"items": [
{
"id": 40934235668668,
"quantity": 1
}
]
}
POST /cart/add.js
"Content-Type": "application/json"
{
"items": [
{
"id": 40934235668668,
"quantity": 1
}
],
"sections": "my-ajax-cart"
}
If the request is successful, Shopify retrieves the re-rendered HTML for the data-ajax-cart-section elements from the response.
It then replaces the current data-ajax-cart-section elements’ outer HTML
with the new one.
Apply the data-ajax-cart-section to the element whose content should be re-rendered
when the cart is changed after a Shopify Cart API Ajax request.
In the following example the re-rendering is only enabled for the .my-cart__wrapper element:
<div class="my-cart">
<h2>Cart</h2>
<div class="my-cart__wrapper" data-ajax-cart-section>
<!-- Cart content -->
</div>
</div>
{% schema %} { "name": "My Ajax cart" } {% endschema %}
If you want to have an immutable HTML element inside a data-ajax-cart-section container —
add the data-ajax-cart-static-element attribute to this element.
HTML code of an immutable container will not be replaced when the parent data-ajax-cart-section element is updated.
If you want multiple containers whose content should be re-rendered inside a Shopify section — apply the data-ajax-cart-section to them.
In the following example the re-rendering is enabled for the .my-cart__wrapper and .my-cart__footer elements:
<div class="my-cart">
<div class="my-cart__header">Cart</div>
<div class="my-cart__items" data-ajax-cart-section>
<!-- Cart items container is updatable
because of the data-ajax-cart-section attribute -->
</div>
<div class="my-cart__another-content">
<!-- Another content that is not updatable
because there is no parent data-ajax-cart-section attribute -->
</div>
<div class="my-cart__footer" data-ajax-cart-section>
<!-- Cart footer container is updatable
because of the data-ajax-cart-section attribute -->
</div>
</div>
{% schema %} { "name": "My Ajax cart" } {% endschema %}
It is useful when you have HTML elements (like the .my-cart__another-content in the example above)
that must be immutable and when they are placed between containers requiring re-rendering.
If you want to have an immutable element within a data-ajax-cart-section element — use the data-ajax-cart-static-element attribute with it.
When you have multiple data-ajax-cart-section containers,
make sure that your Shopify section always returns
the constant number of the data-ajax-cart-section containers in the same order.
If the amount varies, it is considered as an exception
and the whole HTML of the section will be replaced completely with the new HTML.
The second data-ajax-cart-section container sometimes appears, sometimes — doesn’t:
<div class="my-cart">
<div class="my-cart__header">Cart</div>
<div class="my-cart__items" data-ajax-cart-section >
<!-- Cart items -->
</div>
<div class="my-cart__another-content">
<!-- Another content that is not updatable -->
</div>
{% if cart.item_count > 0 %}
{% comment %}
Wrong, because a [data-ajax-cart-section] container
must not depend on any condition
{% endcomment %}
<div class="my-cart__footer" data-ajax-cart-section >
<!-- Cart footer -->
</div>
{% endif %}
</div>
{% schema %} { "name": "My Ajax cart" } {% endschema %}
All the data-ajax-cart-section containers always appear:
<div class="my-cart">
<div class="my-cart__header">Cart</div>
<div class="my-cart__items" data-ajax-cart-section >
<!-- Cart items -->
</div>
<div class="my-cart__another-content">
<!-- Another content that is not updatable -->
</div>
<div class="my-cart__footer" data-ajax-cart-section >
{% if cart.item_count > 0 %}
<!-- Footer content -->
{% endif %}
</div>
</div>
{% schema %} { "name": "My Ajax cart" } {% endschema %}