{"id":371258,"date":"2026-09-22T10:49:48","date_gmt":"2026-09-22T10:49:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/partsyncer-recently-viewed-products\/"},"modified":"2026-09-22T10:49:20","modified_gmt":"2026-09-22T10:49:20","slug":"partsyncer-recently-viewed-products","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/partsyncer-recently-viewed-products\/","author":23565155,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.7.1","stable_tag":"1.7.1","tested":"7.1.2","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"PartSyncer Recently Viewed Products","header_author":"PartSyncer","header_description":"A cookie-free \"recently viewed products\" strip for WooCommerce. Each visitor's history is kept in their browser; show it on the product page, in a widget area, with a shortcode or a block. Works with any theme.","assets_banners_color":"08467c","last_updated":"2026-09-22 10:49:20","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/partsyncer.com\/recently-viewed-products","header_author_uri":"https:\/\/partsyncer.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":40,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.7.1":{"tag":"1.7.1","author":"partsyncer","date":"2026-09-22 10:49:20","revision":3707105}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3707105,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3707105,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3707105,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3707105,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.7.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3707105,"resolution":"1","location":"assets","locale":"","width":665,"height":343},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3707105,"resolution":"2","location":"assets","locale":"","width":855,"height":1155},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3707105,"resolution":"3","location":"assets","locale":"","width":404,"height":343}},"screenshots":{"1":"The recently-viewed strip on a product page.","2":"Settings.","3":"The floating corner button's popup panel."}},"plugin_section":[],"plugin_tags":[195325,52958,7126,6903,286],"plugin_category":[45],"plugin_contributors":[282013],"plugin_business_model":[],"class_list":["post-371258","plugin","type-plugin","status-publish","hentry","plugin_tags-browsing-history","plugin_tags-recently-viewed-products","plugin_tags-recently-viewed","plugin_tags-related-products","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-partsyncer","plugin_committers-partsyncer"],"banners":{"banner":"https:\/\/ps.w.org\/partsyncer-recently-viewed-products\/assets\/banner-772x250.png?rev=3707105","banner_2x":"https:\/\/ps.w.org\/partsyncer-recently-viewed-products\/assets\/banner-1544x500.png?rev=3707105","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/partsyncer-recently-viewed-products\/assets\/icon-128x128.png?rev=3707105","icon_2x":"https:\/\/ps.w.org\/partsyncer-recently-viewed-products\/assets\/icon-256x256.png?rev=3707105","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/partsyncer-recently-viewed-products\/assets\/screenshot-1.png?rev=3707105","caption":"The recently-viewed strip on a product page."},{"src":"https:\/\/ps.w.org\/partsyncer-recently-viewed-products\/assets\/screenshot-2.png?rev=3707105","caption":"Settings."},{"src":"https:\/\/ps.w.org\/partsyncer-recently-viewed-products\/assets\/screenshot-3.png?rev=3707105","caption":"The floating corner button's popup panel."}],"raw_content":"<!--section=description-->\n<p>PartSyncer Recently Viewed remembers the products a visitor has looked at and shows them a strip of thumbnails to jump back to. The history is stored in the visitor's own browser (localStorage) \u2014 no cookies, no accounts, no server-side data \u2014 so it works behind a full-page cache.<\/p>\n\n<p><strong>What you get<\/strong><\/p>\n\n<ul>\n<li>A \"Recently viewed\" strip auto-placed on the single product page.<\/li>\n<li>A <code>[partsyncer_recently_viewed]<\/code> shortcode, a <em>Recently Viewed<\/em> block, a classic widget, and an Elementor widget \u2014 use whichever fits your page.<\/li>\n<li>Carousel, grid or list layout, with a choice of sort order (recent, newest, random, or price).<\/li>\n<li>Optional \"Add to cart\" button and live stock availability on each item, plus an individual remove button.<\/li>\n<li>Configurable heading and history length.<\/li>\n<\/ul>\n\n<p><strong>Theme-agnostic<\/strong><\/p>\n\n<p>The plugin renders its own markup and stylesheet, so it works with any WooCommerce-compatible theme. Every colour\/size is a <code>--psrv-*<\/code> CSS variable a theme can override.<\/p>\n\n<p><strong>Privacy<\/strong><\/p>\n\n<p>No cookies. No accounts. No server-side storage. Nothing leaves the browser.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin does not collect, store, or transmit any personal data on the server. Each visitor's browsing history is kept entirely in their own browser (localStorage), never sent to the site or any third party, and works without cookies. Uninstalling the plugin removes its one settings option; it holds no visitor data to erase.<\/p>\n\n<h3>Trademarks<\/h3>\n\n<p>WooCommerce is a registered trademark of Automattic Inc. This plugin is not affiliated with, endorsed by, or sponsored by Automattic or WooCommerce.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce.<\/li>\n<li>Upload the plugin and activate it.<\/li>\n<li>The strip appears on product pages automatically. Adjust the heading and length at <strong>WooCommerce \u2192 PartSyncer Recently Viewed<\/strong>.<\/li>\n<li>To place it elsewhere, add <code>[partsyncer_recently_viewed]<\/code> or the <em>Recently Viewed<\/em> block.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20use%20cookies%3F\"><h3>Does it use cookies?<\/h3><\/dt>\n<dd><p>No. It uses <code>localStorage<\/code>, so it needs no cookie notice and is safe with page caching.<\/p><\/dd>\n<dt id=\"does%20woocommerce%20not%20already%20have%20this%3F\"><h3>Does WooCommerce not already have this?<\/h3><\/dt>\n<dd><p>WooCommerce ships a cookie-based \"Recently Viewed Products\" widget. This plugin is cookieless (localStorage), which is friendlier to page caches and privacy rules, and adds a shortcode, a block and an auto-placed product-page strip.<\/p><\/dd>\n<dt id=\"how%20do%20i%20restyle%20it%3F\"><h3>How do I restyle it?<\/h3><\/dt>\n<dd><p>Override the <code>--psrv-*<\/code> CSS variables or target the <code>.psrv*<\/code> classes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Internal cleanup: no functional changes. Author\/branding fields updated, and readme now documents this plugin's privacy stance (no server-side data collection) and the WooCommerce trademark notice.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>New \"Category filtering\" setting: on a product category page, only show recently-viewed items that belong to that category or one of its parent categories (e.g. only recently-viewed Transmission parts show on the Transmission category page). Off by default; only applies to items recorded while it's turned on.<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Fixed: clicking \"Add to cart\" a second time on a low-stock item (e.g. only 1 available) could fail and redirect to the product page with an error, because WooCommerce only reduces its displayed stock count at checkout, not at add-to-cart \u2014 so the button still looked available. The button now shows a disabled \"Added\" state after a successful add instead of staying clickable.<\/li>\n<li>Live stock\/price data is no longer served from a stale cache immediately after an add-to-cart, so any real change (another shopper buying the last unit, a stock update) shows up right away.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>The \"Add to cart\" button now uses a 5px corner radius (was a full pill) and always defaults to white text for better contrast on a coloured background.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Redesigned each item's layout: image, title, SKU\/part number, price and a colour-coded stock badge (amber when low, green otherwise, threshold from WooCommerce's own \"notify at\" stock setting) are now laid out cleanly side by side \u2014 no more crowding.<\/li>\n<li>The \"Add to cart\" button is now a pill with a small cart icon, and shorter (\"Add\").<\/li>\n<li>The popup panel header now shows a clock icon and a subtitle (\"N parts \u00b7 saved for N days\" \/ \"kept until you clear it\").<\/li>\n<li>Everything still restyles via <code>--psrv-*<\/code> CSS variables, so a theme can recolour it (including a full dark-mode popup, as PartSyncer's own theme now does) without touching the plugin.<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Fixed the price and stock text overlapping in the list layout and the popup panel \u2014 each item now uses a small grid (image, title, then price\/stock\/add-to-cart each in their own column) instead of cramming everything into one row.<\/li>\n<li>Stock text is now a small coloured badge for better visibility.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>The floating button can now sit at the top, middle or bottom of its screen edge (previously bottom only).<\/li>\n<li>An \"Add to cart\" button on each item (simple, in-stock, purchasable products only \u2014 others link to the product page instead), added via AJAX with no page reload.<\/li>\n<li>Live stock availability text (e.g. \"5 in stock\") on each item, checked against the WooCommerce Store API.<\/li>\n<li>An individual remove (\u00d7) button on every item, with an Undo toast, so a single product can be dropped from the history without clearing everything.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Elementor widget: \"Recently Viewed Products\" is now available in the Elementor editor, alongside the shortcode and block.<\/li>\n<li>List layout option, in addition to carousel and grid.<\/li>\n<li>Sort order option: most recent (default), newest first, random, price low-to-high, or price high-to-low.<\/li>\n<li>Option to exclude free (zero-price) products from being recorded and shown.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Optional floating corner button + popup panel (like the familiar \"recently viewed\" bubble pattern), showing the full history with its own Clear\/Undo. Position and edge offset are configurable, so it won't collide with a chat or WhatsApp bubble from another plugin.<\/li>\n<li>The inline strip gains a \"View all\" link when there are more items than fit inline (floating mode only).<\/li>\n<li>Classic (non-block) widget added, for older themes and widget areas.<\/li>\n<li>Accessibility: the popup panel traps focus while open.<\/li>\n<li>Basic RTL groundwork: layout uses flex\/grid flow (no hardcoded text direction); the floating button's screen corner is a deliberate position choice and does not flip with text direction, matching how similar corner widgets behave.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Cross-tab sync: the strip stays in sync between tabs.<\/li>\n<li>\"Clear\" now shows an Undo toast instead of clearing silently.<\/li>\n<li>The out-of-stock check now caches Store API responses for a few minutes (sessionStorage).<\/li>\n<li>Developer event: <code>psrv:product-recorded<\/code> (document-level CustomEvent, for analytics integrations).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Choose where the strip appears: product pages, the cart page (classic or block), and\/or shop &amp; category pages.<\/li>\n<li>Layout option: carousel or a grid with a configurable column count.<\/li>\n<li>Option to hide products that are now out of stock (checked against the WooCommerce Store API).<\/li>\n<li>Optional \"forget after N days\", and a \"Clear\" link on the strip.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"A cookie-free &quot;recently viewed products&quot; strip for WooCommerce. Each visitor&#039;s history is kept in their browser. Product page, shortcode, block.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/371258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=371258"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/partsyncer"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=371258"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=371258"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=371258"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=371258"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=371258"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=371258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}