{"id":121,"date":"2026-09-30T09:00:00","date_gmt":"2026-09-30T07:00:00","guid":{"rendered":"https:\/\/yindle.com\/?p=121"},"modified":"2026-09-30T09:00:00","modified_gmt":"2026-09-30T07:00:00","slug":"cache-regels-gepersonaliseerde-winkelwagen","status":"publish","type":"post","link":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/","title":{"rendered":"Cache rules for personalised basket routes"},"content":{"rendered":"<p><strong>Never cache a personal basket as though it were a public product page.<\/strong> Specifically exclude basket, checkout and account context from page caches and CDN storage, while still serving static files and public catalogue pages quickly. This prevents visitors from seeing outdated quantities or even data from another session.<\/p>\n<p>\u201cTurn off caching\u201d for the entire store is not a good answer either. It makes safe pages unnecessarily slow and conceals which components actually depend on a session. The right approach starts with a map of routes, cookies, AJAX actions and fragments that read or write personal state.<\/p>\n<h2>Map the boundaries of personal content<\/h2>\n<p>The basket page and checkout are obvious exceptions, but there are other boundaries. Consider a basket-restoration link, a saved-baskets page in My account, dynamic quantities in the header and an endpoint that shares a selection. Even an empty HTML shell can receive personal information through a later request. Document not only URLs, but also which source determines the visible state.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Component<\/th>\n<th>Desired caching behaviour<\/th>\n<th>Check<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Public product page<\/td>\n<td>Cacheable, with a carefully managed dynamic basket fragment<\/td>\n<td>Price and stock rules match the source<\/td>\n<\/tr>\n<tr>\n<td>Basket and checkout<\/td>\n<td>No shared page cache<\/td>\n<td>Sessions and users remain separate<\/td>\n<\/tr>\n<tr>\n<td>My account lists<\/td>\n<td>Private caching, with no shared cache<\/td>\n<td>Logging out clears visible personal state<\/td>\n<\/tr>\n<tr>\n<td>Sharing or restoration action<\/td>\n<td>No-store for the action\u2019s result<\/td>\n<td>The back button does not show an old sensitive page<\/td>\n<\/tr>\n<tr>\n<td>Static CSS and JavaScript<\/td>\n<td>Long-lived caching with a file version<\/td>\n<td>A new release gets a new URL<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2>Use several layers of protection<\/h2>\n<p>Send explicit cache headers with personal responses, exclude relevant paths at the hosting layer and respect cookies indicating an active basket or logged-in session. No layer is sufficient on its own. A reverse proxy may interpret application headers differently; a CDN rule may change later; a plugin may add a new path.<\/p>\n<p>Pay attention to cache keys too. Using only the URL is unsafe when language, currency, customer group or session affects the response. Putting everything in the key can instead create an explosion of variations. Decide for each component: public variants may be cached in a controlled way, while personal content should arrive through a private request or remain entirely uncached. In a broader integration architecture, <a href=\"\/en\/connect\/\">Yindle Connect<\/a> helps keep responsibilities clear between the store and underlying systems.<\/p>\n<p>Browser caching needs its own check. A no-store response prevents a sensitive restoration or checkout page from reappearing through back navigation, but may affect the user experience. Test it deliberately. For requests that change data, avoid a GET link that silently performs an action; have the link open an overview first, then replace or save only through a protected POST action. This separates sharing from the personal change.<\/p>\n<h2>Fictional example: a restoration link shows the wrong header<\/h2>\n<p>Wholesaler Kade shares project baskets with business customers. After an optimisation round, the restoration page is cached. The product lines are reloaded, but the header contains a previous visitor\u2019s basket total. No names leak, yet trust is immediately damaged: the recipient sees an amount that does not belong to their selection.<\/p>\n<p>Kade splits the page. The public explanation and styling are cacheable; basket contents, quantities and actions are retrieved from the user\u2019s own session. The restoration response gets no-store, account paths are excluded in both hosting and application, and static assets receive a version in the filename. Two employees then test simultaneously using different browsers and incognito windows.<\/p>\n<p>After each release, Kade runs a small smoke test from a cold cache. This matters: a developer with a logged-in administrator cookie often bypasses the cache and misses the problem. The test therefore runs as a guest, as a customer and through the public hostname. The route map is also checked again after changes to the CDN, cookie banner or optimisation plugin.<\/p>\n<h2>A practical cache-safety test<\/h2>\n<ol>\n<li>Create two accounts with clearly different baskets.<\/li>\n<li>Alternate between opening the basket, checkout, My account and a shared restoration link.<\/li>\n<li>Repeat in a normal window, incognito and on a second device.<\/li>\n<li>Check response headers and the behaviour of the CDN or host cache.<\/li>\n<li>Use the back and forward buttons after logging in, logging out and restoring a basket.<\/li>\n<li>Test header quantities, the mini-basket, coupons, language and customer group.<\/li>\n<li>Clear only the central cache and check whether the problem returns.<\/li>\n<li>Include new personal routes in the release checklist.<\/li>\n<\/ol>\n<p>Assign one owner to the route map. Performance work, checkout development and marketing plugins can all introduce new cache boundaries. For complex stores, a periodic technical review is often cheaper than investigating an unexplained session error afterwards. At <a href=\"\/en\/custom-software\/\">custom software<\/a> you can read how process and technology can be designed together.<\/p>\n<p><a href=\"\/en\/contact\/\">Have Yindle check the cache boundaries of your WooCommerce flow.<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Cache public store content for speed, while keeping basket, checkout and account state verifiably separate for each session.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-121","post","type-post","status-publish","format-standard","hentry","category-e-commerce"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Veilige cache-regels voor WooCommerce-carts<\/title>\n<meta name=\"description\" content=\"Breng persoonlijke WooCommerce-routes, sessies en cartfragmenten in kaart en voorkom dat cache verouderde of verkeerde winkelwagenstaat toont.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Veilige cache-regels voor WooCommerce-carts\" \/>\n<meta property=\"og:description\" content=\"Breng persoonlijke WooCommerce-routes, sessies en cartfragmenten in kaart en voorkom dat cache verouderde of verkeerde winkelwagenstaat toont.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/\" \/>\n<meta property=\"og:site_name\" content=\"Yindle\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-30T07:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/yindle.com\/wp-content\/themes\/yindle\/assets\/images\/yindle-social-share.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Yindle\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Yindle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/cache-rules-for-personalised-basket-routes\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/cache-rules-for-personalised-basket-routes\\\/\"},\"author\":{\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/#organization\"},\"headline\":\"Cache-regels voor gepersonaliseerde winkelwagenroutes\",\"datePublished\":\"2026-09-30T07:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/cache-rules-for-personalised-basket-routes\\\/\"},\"wordCount\":717,\"publisher\":{\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/#organization\"},\"articleSection\":[\"E-commerce\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/cache-rules-for-personalised-basket-routes\\\/\",\"url\":\"https:\\\/\\\/yindle.com\\\/en\\\/cache-rules-for-personalised-basket-routes\\\/\",\"name\":\"Veilige cache-regels voor WooCommerce-carts\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/#website\"},\"datePublished\":\"2026-09-30T07:00:00+00:00\",\"description\":\"Breng persoonlijke WooCommerce-routes, sessies en cartfragmenten in kaart en voorkom dat cache verouderde of verkeerde winkelwagenstaat toont.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/cache-rules-for-personalised-basket-routes\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/yindle.com\\\/en\\\/cache-rules-for-personalised-basket-routes\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/cache-rules-for-personalised-basket-routes\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/yindle.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cache-regels voor gepersonaliseerde winkelwagenroutes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/yindle.com\\\/en\\\/\",\"name\":\"Yindle\",\"description\":\"Software voor e-commerce en klantprocessen\",\"publisher\":{\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/yindle.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/#organization\",\"name\":\"Yindle B.V.\",\"url\":\"https:\\\/\\\/yindle.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/yindle.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/yindle-site-icon.png\",\"contentUrl\":\"https:\\\/\\\/yindle.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/yindle-site-icon.png\",\"width\":512,\"height\":512,\"caption\":\"Yindle B.V.\"},\"image\":{\"@id\":\"https:\\\/\\\/yindle.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"legalName\":\"Yindle B.V.\",\"address\":{\"@type\":\"PostalAddress\",\"streetAddress\":\"Markt 43\",\"postalCode\":\"5554 CA\",\"addressLocality\":\"Valkenswaard\",\"addressCountry\":\"NL\"},\"identifier\":{\"@type\":\"PropertyValue\",\"propertyID\":\"KvK\",\"value\":\"99695367\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Safe cache rules for WooCommerce baskets","description":"Map personal WooCommerce routes, sessions and basket fragments, and prevent caches from showing outdated or incorrect basket state.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/","og_locale":"en_GB","og_type":"article","og_title":"Veilige cache-regels voor WooCommerce-carts","og_description":"Breng persoonlijke WooCommerce-routes, sessies en cartfragmenten in kaart en voorkom dat cache verouderde of verkeerde winkelwagenstaat toont.","og_url":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/","og_site_name":"Yindle","article_published_time":"2026-09-30T07:00:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/yindle.com\/wp-content\/themes\/yindle\/assets\/images\/yindle-social-share.png","type":"image\/png"}],"author":"Yindle","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Yindle","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/#article","isPartOf":{"@id":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/"},"author":{"@id":"https:\/\/yindle.com\/en\/#organization"},"headline":"Cache-regels voor gepersonaliseerde winkelwagenroutes","datePublished":"2026-09-30T07:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/"},"wordCount":717,"publisher":{"@id":"https:\/\/yindle.com\/en\/#organization"},"articleSection":["E-commerce"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/","url":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/","name":"Safe cache rules for WooCommerce baskets","isPartOf":{"@id":"https:\/\/yindle.com\/en\/#website"},"datePublished":"2026-09-30T07:00:00+00:00","description":"Map personal WooCommerce routes, sessions and basket fragments, and prevent caches from showing outdated or incorrect basket state.","breadcrumb":{"@id":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/yindle.com\/en\/cache-rules-for-personalised-basket-routes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/yindle.com\/en\/"},{"@type":"ListItem","position":2,"name":"Cache-regels voor gepersonaliseerde winkelwagenroutes"}]},{"@type":"WebSite","@id":"https:\/\/yindle.com\/en\/#website","url":"https:\/\/yindle.com\/en\/","name":"Yindle","description":"Software for e-commerce and customer processes","publisher":{"@id":"https:\/\/yindle.com\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/yindle.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/yindle.com\/en\/#organization","name":"Yindle B.V.","url":"https:\/\/yindle.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/yindle.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/yindle.com\/wp-content\/uploads\/2026\/09\/yindle-site-icon.png","contentUrl":"https:\/\/yindle.com\/wp-content\/uploads\/2026\/09\/yindle-site-icon.png","width":512,"height":512,"caption":"Yindle B.V."},"image":{"@id":"https:\/\/yindle.com\/en\/#\/schema\/logo\/image\/"},"legalName":"Yindle B.V.","address":{"@type":"PostalAddress","streetAddress":"Markt 43","postalCode":"5554 CA","addressLocality":"Valkenswaard","addressCountry":"NL"},"identifier":{"@type":"PropertyValue","propertyID":"KvK","value":"99695367"}}]}},"_links":{"self":[{"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/posts\/121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/comments?post=121"}],"version-history":[{"count":1,"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/posts\/121\/revisions"}],"predecessor-version":[{"id":943,"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/posts\/121\/revisions\/943"}],"wp:attachment":[{"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/media?parent=121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/categories?post=121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yindle.com\/en\/wp-json\/wp\/v2\/tags?post=121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}