De Gratis Verzending balk geeft je klanten real-time informatie over hoeveel ze nog moeten besteden om in aanmerking te komen voor gratis verzending. Deze handleiding legt stap voor stap uit hoe je dit onderdeel kunt integreren in je Shopify theme.
De DT Gratis Verzending balk geeft je klanten real-time informatie over hoeveel ze nog moeten besteden om in aanmerking te komen voor gratis verzending. Deze handleiding legt stap voor stap uit hoe je dit onderdeel kunt integreren in je Shopify theme.
Show Image
dt-gratis-verzending.liquid
{% schema %}
{
"name": "DT Gratis Verzending",
"settings": [
{
"type": "color",
"id": "background_color",
"label": "Background Color",
"default": "#212121"
},
{
"type": "color",
"id": "text_color",
"label": "Text Color",
"default": "#ffffff"
},
{
"type": "number",
"id": "free_shipping_threshold",
"label": "Free Shipping Threshold (in EUR)",
"default": 150
},
{
"type": "text",
"id": "progress_message",
"label": "Progress Message",
"default": "Je bent nog €[amount] verwijderd van gratis verzending*"
},
{
"type": "text",
"id": "success_message",
"label": "Success Message",
"default": "Gefeliciteerd! Je bestelling komt in aanmerking voor gratis verzending"
},
{
"type": "text",
"id": "static_message",
"label": "Static Message (optional)",
"default": "Gratis verzending voor alle bestellingen vanaf €150 in Nederland!*"
},
{
"type": "checkbox",
"id": "use_static_message",
"label": "Use Static Message (instead of dynamic)",
"default": false
}
],
"presets": [
{
"name": "DT Gratis Verzending",
"category": "Promotional"
}
]
}
{% endschema %}
<style>
.dynamic-shipping-bar {
background-color: {{ section.settings.background_color }};
color: {{ section.settings.text_color }};
text-align: center;
padding: 10px 20px;
font-size: 14px;
width: 100%;
}
.shipping-success-message,
.shipping-progress-message,
.shipping-static-message {
transition: opacity 0.3s ease;
}
.hidden {
display: none;
}
</style>
<div class="dynamic-shipping-bar" id="dynamic-shipping-bar">
{% if section.settings.use_static_message %}
<div class="shipping-static-message">
{{ section.settings.static_message }}
</div>
{% else %}
<div class="shipping-success-message hidden">
{{ section.settings.success_message }}
</div>
<div class="shipping-progress-message">
{{ section.settings.progress_message }}
</div>
{% endif %}
</div>
<script>
(function() {
// Configuratie-instellingen van de sectie ophalen
const config = {
threshold: {{ section.settings.free_shipping_threshold | json }},
useStaticMessage: {{ section.settings.use_static_message | json }},
progressMessage: {{ section.settings.progress_message | json }}
};
// Alleen actief als we niet in statische modus zitten
if (!config.useStaticMessage) {
// Initiële update bij pagina laden
document.addEventListener('DOMContentLoaded', function() {
updateShippingBar();
});
// Cart events voor verschillende Shopify thema's
document.addEventListener('cart:refresh', updateShippingBar);
document.addEventListener('cart:updated', updateShippingBar);
// Directe Ajax cart implementaties
if (typeof window.Shopify !== 'undefined' && window.Shopify.onCartUpdate) {
const originalOnCartUpdate = window.Shopify.onCartUpdate;
window.Shopify.onCartUpdate = function(cart) {
if (typeof originalOnCartUpdate === 'function') {
originalOnCartUpdate(cart);
}
updateShippingBarWithCart(cart);
};
}
// Monitor cart form submissions en quantity wijzigingen
monitorCartChanges();
}
function monitorCartChanges() {
// Wacht even tot de pagina volledig is geladen
setTimeout(function() {
// Cart forms (toevoegen aan winkelwagen)
document.querySelectorAll('form[action="/cart/add"]').forEach(form => {
form.addEventListener('submit', function() {
setTimeout(updateShippingBar, 500);
});
});
// Quantity inputs
document.querySelectorAll('input[name="updates[]"], [data-quantity-input]').forEach(input => {
input.addEventListener('change', function() {
setTimeout(updateShippingBar, 500);
});
});
// Verwijder knoppen
document.querySelectorAll('[data-cart-remove], .cart__remove, .cart-item__remove, [href*="/cart/change?"]').forEach(button => {
button.addEventListener('click', function() {
setTimeout(updateShippingBar, 500);
});
});
}, 1000);
}
function updateShippingBar() {
// Get current cart data through Shopify's cart API
fetch('/cart.js')
.then(response => response.json())
.then(cart => {
updateShippingBarWithCart(cart);
})
.catch(error => console.error('Error fetching cart:', error));
}
function updateShippingBarWithCart(cart) {
const cartTotal = cart.total_price / 100; // Convert from cents to euros
// Get elements
const progressMessage = document.querySelector('.shipping-progress-message');
const successMessage = document.querySelector('.shipping-success-message');
// Calculate remaining amount to qualify for free shipping
const remaining = Math.max(0, config.threshold - cartTotal);
// Update message
if (remaining > 0) {
// Nog niet aan gratis verzending
// Formatteer het bedrag
const formattedRemaining = remaining.toFixed(2).replace('.', ',');
// Vervang placeholder in originele template
if (progressMessage) {
progressMessage.textContent = config.progressMessage.replace('[amount]', formattedRemaining);
}
// Toon progress message, verberg success message
if (progressMessage) progressMessage.classList.remove('hidden');
if (successMessage) successMessage.classList.add('hidden');
} else {
// Komt in aanmerking voor gratis verzending!
if (progressMessage) progressMessage.classList.add('hidden');
if (successMessage) successMessage.classList.remove('hidden');
}
}
// Periodieke refresh (voor het geval andere methoden niet werken)
setInterval(updateShippingBar, 5000);
// Start de initiële update
updateShippingBar();
})();
</script>
Er zijn twee manieren om de DT Gratis Verzending balk aan je thema toe te voegen:
Wanneer je de sectie hebt toegevoegd, kun je de volgende instellingen configureren:
[amount]
als placeholder voor het resterende bedrag[amount]
gebruikt in het voortgangsberichtDeze gratis verzendingsbalk kan verder worden aangepast door ontwikkelaars:
Deze code is getest en werkt met:
Al sinds mijn vijftiende bouw ik websites. Nu, 10+ jaar en 50+ projecten verder, combineer ik design, Shopify‑development en data‑gedreven marketing tot één 360° e‑commerce‑aanpak.
Check me op socials voor updates, tips en een kijkje achter de schermen.