{"id":357026,"date":"2026-09-07T08:50:47","date_gmt":"2026-09-07T08:50:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/saito-navi\/"},"modified":"2026-09-07T08:50:27","modified_gmt":"2026-09-07T08:50:27","slug":"saito-navi","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/saito-navi\/","author":23325312,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.7.2","stable_tag":"0.7.2","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Saito Navi","header_author":"Troteseil Lucas","header_description":"Floating engagement hub for WordPress\/WooCommerce: cookie consent (Google Consent Mode V2), sticky add-to-cart on the product page, accessibility (language, text size, contrast, cursor, underlined links), all driven from a single button.","assets_banners_color":"688eeb","last_updated":"2026-09-07 08:50:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/github.com\/Lucas-tsl","rating":0,"author_block_rating":0,"active_installs":0,"downloads":55,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.7.2":{"tag":"0.7.2","author":"lucastsl","date":"2026-09-07 08:50:27","revision":3684502}},"upgrade_notice":{"0.7.2":"<p>No action required on upgrade. Product edit screen only changes when the\nNavi FAQ plugin is also active.<\/p>","0.7.1":"<p>No action required on upgrade. Internal-only fixes (WordPress.org review).<\/p>","0.7.0":"<p>Existing story preview videos keep working. Sites upgrading from before\n0.6.0 with MP4 videos uploaded via the old form: the files remain in\ntheir upload folder and are cleaned up on uninstall as before.<\/p>","0.6.0":"<p>No action required on upgrade.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3684502,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3684502,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3684502,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"navi\/stories":{"name":"navi\/stories","title":"Navi Stories"}},"tagged_versions":["0.7.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3684502,"resolution":"1","location":"assets","locale":"","width":863,"height":1139},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3684502,"resolution":"10","location":"assets","locale":"","width":1801,"height":880},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3684502,"resolution":"11","location":"assets","locale":"","width":1809,"height":884},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3684502,"resolution":"2","location":"assets","locale":"","width":862,"height":902},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3684502,"resolution":"3","location":"assets","locale":"","width":862,"height":496},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3684502,"resolution":"4","location":"assets","locale":"","width":864,"height":782},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3684502,"resolution":"5","location":"assets","locale":"","width":864,"height":1266},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3684502,"resolution":"6","location":"assets","locale":"","width":863,"height":1205},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3684502,"resolution":"7","location":"assets","locale":"","width":1474,"height":852},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3684502,"resolution":"8","location":"assets","locale":"","width":1804,"height":885},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3684502,"resolution":"9","location":"assets","locale":"","width":1803,"height":888}},"screenshots":{"1":"Navi &gt; Navi, General tab: floating button position, plugin language,\nappearance (colors, corner radius).","2":"Cookie consent tab: banner settings, with concrete Google Tag Manager \/\nConsent Mode V2 setup instructions.","3":"Accessibility tab: module activation and per-device visibility.","4":"Sticky add-to-cart tab: module activation and custom CSS selectors for\nthemes not covered by the built-in fallback.","5":"Stories tab, Bubbles: display options and a live bubble appearance\npreview.","6":"Stories tab, Mockup: phone mockup colors with a live preview.","7":"Stories tab on the WooCommerce product edit page: up to 4 configurable\nvideo stories.","8":"Sticky add-to-cart panel on a variable product page, swatch selector\n(front-end).","9":"Accessibility panel: text size, contrast, cursor, underlined links\n(front-end).","10":"Cookie preferences modal (GDPR, Google Consent Mode V2) on the visitor\nside.","11":"Story video bubble and desktop panel (phone mockup) on the product\npage."}},"plugin_section":[],"plugin_tags":[1953,16626,142281,10817,286],"plugin_category":[34,45],"plugin_contributors":[262647],"plugin_business_model":[],"class_list":["post-357026","plugin","type-plugin","status-publish","hentry","plugin_tags-accessibility","plugin_tags-cookie-consent","plugin_tags-sticky-add-to-cart","plugin_tags-stories","plugin_tags-woocommerce","plugin_category-accessibility","plugin_category-ecommerce","plugin_contributors-lucastsl","plugin_committers-lucastsl"],"banners":{"banner":"https:\/\/ps.w.org\/saito-navi\/assets\/banner-772x250.png?rev=3684502","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/saito-navi\/assets\/icon-128x128.png?rev=3684502","icon_2x":"https:\/\/ps.w.org\/saito-navi\/assets\/icon-256x256.png?rev=3684502","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-1.png?rev=3684502","caption":"Navi &gt; Navi, General tab: floating button position, plugin language,\nappearance (colors, corner radius)."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-2.png?rev=3684502","caption":"Cookie consent tab: banner settings, with concrete Google Tag Manager \/\nConsent Mode V2 setup instructions."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-3.png?rev=3684502","caption":"Accessibility tab: module activation and per-device visibility."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-4.png?rev=3684502","caption":"Sticky add-to-cart tab: module activation and custom CSS selectors for\nthemes not covered by the built-in fallback."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-5.png?rev=3684502","caption":"Stories tab, Bubbles: display options and a live bubble appearance\npreview."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-6.png?rev=3684502","caption":"Stories tab, Mockup: phone mockup colors with a live preview."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-7.png?rev=3684502","caption":"Stories tab on the WooCommerce product edit page: up to 4 configurable\nvideo stories."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-8.png?rev=3684502","caption":"Sticky add-to-cart panel on a variable product page, swatch selector\n(front-end)."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-9.png?rev=3684502","caption":"Accessibility panel: text size, contrast, cursor, underlined links\n(front-end)."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-10.png?rev=3684502","caption":"Cookie preferences modal (GDPR, Google Consent Mode V2) on the visitor\nside."},{"src":"https:\/\/ps.w.org\/saito-navi\/assets\/screenshot-11.png?rev=3684502","caption":"Story video bubble and desktop panel (phone mockup) on the product\npage."}],"raw_content":"<!--section=description-->\n<p>Saito Navi gathers several customer engagement modules for WooCommerce\nbehind <strong>a single floating button<\/strong> (gear icon, corner of the screen):<\/p>\n\n<ul>\n<li><strong>Cookie consent<\/strong> \u2014 GDPR banner, Google Consent Mode V2, preferences\nmodal, logo auto-detected from the site identity if no URL is set.<\/li>\n<li><strong>Accessibility<\/strong> \u2014 language switcher (WPML-compatible, falls back to\nGTranslate if WPML is absent), text size, high contrast, enlarged\ncursor, underlined links.<\/li>\n<li><strong>Sticky add-to-cart<\/strong> \u2014 a panel that follows the visitor on the\nWooCommerce product page, works with simple and variable products, a\nkeyboard-accessible swatch selector, compatible with WCBoost Variation\nSwatches, and a custom CSS selector setting for themes not covered by\nthe built-in fallback chain.<\/li>\n<li><strong>Stories<\/strong> \u2014 up to 4 video bubbles per product (YouTube or an\nuploaded MP4), a dedicated tab on the WooCommerce product page, a\ndesktop panel with a pure-CSS phone mockup (no external image), and a\nmobile full-screen stories-style view. Displayed by default after the\nproduct gallery, or wherever you like via the <code>[navi_stories]<\/code>\nshortcode.<\/li>\n<\/ul>\n\n<p>Built from the ground up to welcome new modules without touching the\ncore: each module registers itself and talks to the central button\nthrough a generic event, and no module knows about the others.<\/p>\n\n<p>Everything is configurable from the Back Office (<strong>Navi<\/strong> menu): colors,\ncorner radius, button position, and for each module its own \"Show on\ndesktop\" \/ \"Show on mobile\" setting.<\/p>\n\n<p>Sibling of <a href=\"https:\/\/github.com\/Lucas-tsl\/navi-prestashop\">Navi for PrestaShop<\/a>\n\u2014 same name, same spirit (one hub rather than independent widgets), two\nseparate implementations adapted to each ecosystem.<\/p>\n\n<h4>External services and embedded content<\/h4>\n\n<ul>\n<li><strong>Google Consent Mode V2<\/strong>: the Cookie consent module pushes the\nvisitor's choices into <code>window.dataLayer<\/code> (the standard Google Tag\nManager\/gtag.js mechanism). The plugin itself never sends any request\nto a Google server \u2014 the site must already have gtag.js\/GTM in place\nfor this signal to be used.<\/li>\n<li><strong>YouTube (\"no-cookie\" mode)<\/strong>: the Stories module displays configured\nvideos via <code>youtube-nocookie.com<\/code> in an iframe, only on product pages\nwhere a YouTube story has been configured by the site administrator.\nSee the <a href=\"https:\/\/policies.google.com\/privacy\">YouTube privacy policy<\/a>.<\/li>\n<li><strong>YouTube thumbnails<\/strong>: when an administrator sets a YouTube story\nwithout a custom preview, the plugin makes a server-side <code>HEAD<\/code> request\n(3s timeout, no data sent beyond the request itself, no account or API\nkey involved) to <code>img.youtube.com<\/code> to check whether the HD thumbnail\n(<code>maxresdefault.jpg<\/code>) exists for that video, falling back to a lower\nresolution (<code>hqdefault.jpg<\/code>) if it doesn't \u2014 this avoids storing a\nbroken image URL for videos (mostly YouTube Shorts) that only have the\nlower-resolution thumbnail. This request only happens when a product is\nsaved with a YouTube story configured, never on a visitor's page load.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>saito-navi<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install\ndirectly from <strong>Plugins &gt; Add New<\/strong>.<\/li>\n<li>Activate the plugin from the <strong>Plugins<\/strong> menu.<\/li>\n<li>WooCommerce must be installed and active (required for the Sticky\nadd-to-cart and Stories modules; the Cookie consent and Accessibility\nmodules work without it).<\/li>\n<li>Configure the modules from the new <strong>Navi<\/strong> menu in the Back Office.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20woocommerce%20required%3F\"><h3>Is WooCommerce required?<\/h3><\/dt>\n<dd><p>The core and the Cookie consent \/ Accessibility modules work without\nWooCommerce. The Sticky add-to-cart and Stories modules are tied to the\nWooCommerce product page and therefore require it to be active \u2014 a\nnotice is shown in the Back Office if WooCommerce is missing or inactive.<\/p><\/dd>\n<dt id=\"where%20are%20uploaded%20mp4%20story%20videos%20stored%3F\"><h3>Where are uploaded MP4 story videos stored?<\/h3><\/dt>\n<dd><p>Story preview videos are picked or uploaded through the standard\nWordPress Media Library (the same picker used everywhere else in the\nadmin), so they're stored like any other media file, never inside the\nplugin folder \u2014 the latter can be overwritten on every plugin update,\nunlike the uploads folder.<\/p><\/dd>\n<dt id=\"does%20the%20accessibility%20module%27s%20language%20switcher%20work%20without%20wpml%3F\"><h3>Does the Accessibility module's language switcher work without WPML?<\/h3><\/dt>\n<dd><p>Yes: if it detects the GTranslate plugin installed, it falls back to it;\notherwise the language switcher simply doesn't appear (the other\naccessibility settings remain available).<\/p><\/dd>\n<dt id=\"does%20the%20sticky%20add-to-cart%20work%20with%20my%20theme%3F\"><h3>Does the sticky add-to-cart work with my theme?<\/h3><\/dt>\n<dd><p>A fallback chain of CSS selectors covers standard WooCommerce markup and\nthe most common themes. If your theme has an unusual structure, a\n\"custom CSS selector\" setting per field (price, name, image) is\navailable under Navi &gt; Cart.<\/p><\/dd>\n<dt id=\"does%20the%20sticky%20add-to-cart%20work%20with%20block%20themes%20%28site%20editor%29%3F\"><h3>Does the sticky add-to-cart work with block themes (Site Editor)?<\/h3><\/dt>\n<dd><p>Yes: WooCommerce's default block-based Single Product template still\nrenders the classic variations form under the hood, which the sticky\ncart already detects. The one exception is WooCommerce's own\nexperimental \"Add to Cart + Options (Beta)\" block (fully JavaScript-\ndriven, no classic form) \u2014 not supported while it remains in beta.<\/p><\/dd>\n<dt id=\"can%20i%20place%20the%20story%20bubbles%20as%20a%20block%20instead%20of%20a%20shortcode%3F\"><h3>Can I place the story bubbles as a block instead of a shortcode?<\/h3><\/dt>\n<dd><p>Yes: the \"Navi Stories\" block does the same thing as <code>[navi_stories]<\/code>,\nwith a \"Product ID\" field in the block settings.<\/p><\/dd>\n<dt id=\"can%20i%20control%20where%20the%20story%20bubbles%20are%20displayed%3F\"><h3>Can I control where the story bubbles are displayed?<\/h3><\/dt>\n<dd><p>By default they appear right after the product gallery. Use the\n    [navi_stories] shortcode to place them anywhere else instead (post\ncontent, a page builder, or a theme template) \u2014 add\n    id=\"123\" to target a specific product, or leave it empty to use the\ncurrent product page. To avoid showing the bubbles twice, turn off\n\"Afficher automatiquement\" under Navi &gt; Stories if you use the shortcode\nexclusively.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.7.2<\/h4>\n\n<ul>\n<li>Stories now integrates with the companion Navi FAQ plugin when it's\nactive: both share a single \"Navi\" panel on the product edit screen\n(one internal tab per feature) instead of each adding its own separate\nentry under \"Product data\". Without Navi FAQ, Stories keeps its own\n\"Stories (Navi)\" tab under \"Product data\" as before.<\/li>\n<\/ul>\n\n<h4>0.7.1<\/h4>\n\n<ul>\n<li>WordPress.org review: replaced every inline <code>&lt;script&gt;<\/code>\/<code>&lt;style&gt;<\/code> block\nwith <code>wp_register_script()<\/code>\/<code>wp_enqueue_script()<\/code>\/<code>wp_localize_script()<\/code>\nand <code>wp_enqueue_style()<\/code>\/<code>wp_add_inline_style()<\/code> (hash-preserving\nreferer field, Google Consent Mode injection, admin dashboard tabs,\nStories settings live preview, Stories product tab). No behavior\nchange.<\/li>\n<li>Documented the <code>wp_remote_head()<\/code> call to <code>img.youtube.com<\/code> (YouTube\nHD thumbnail availability check) in the \"External services and\nembedded content\" section.<\/li>\n<\/ul>\n\n<h4>0.7.0<\/h4>\n\n<ul>\n<li>Story preview video is now picked directly from the WordPress Media\nLibrary (restricted to MP4 files) instead of a raw file upload field \u2014\nno more dedicated upload folder to manage or clean up on uninstall.<\/li>\n<li>Fixed: YouTube fallback thumbnail could stay broken for Shorts\n(vertical videos without a <code>maxresdefault.jpg<\/code>) \u2014 now falls back to\n  hqdefault.jpg automatically.<\/li>\n<li>Expanded PHPUnit test suite (Stories validation, Accessibility language\nfallback, module registry).<\/li>\n<\/ul>\n\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>\"Navi Stories\" block (Gutenberg), alongside the <code>[navi_stories]<\/code>\nshortcode.<\/li>\n<li>Onboarding: one-time redirect to Navi &gt; Navi after activation, \"First\nsteps\" card on the General tab.<\/li>\n<li>Verified compatibility with WooCommerce's default block-based Single\nProduct template (see FAQ).<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Shortcode <code>[navi_stories]<\/code>, configurable bubble appearance (solid or\ngradient border, size), WordPress.org submission readiness.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>New Stories module: product video bubbles (YouTube\/MP4), desktop\npanel, mobile full-screen view, appearance settings under Navi &gt;\nStories.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Appearance parity with Navi for PrestaShop: configurable corner\nradius, per-module visibility by device, plugin logo as the admin\nmenu icon.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Sticky add-to-cart module: simple and variable products, swatch\nselector, custom CSS selector settings.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release: core (3-state floating button), Cookie consent and\nAccessibility modules.<\/li>\n<\/ul>","raw_excerpt":"One floating button for cookie consent, accessibility, sticky add-to-cart and product video stories.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/357026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=357026"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lucastsl"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=357026"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=357026"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=357026"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=357026"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=357026"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=357026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}