{"id":313778,"date":"2026-05-25T15:10:46","date_gmt":"2026-05-25T15:10:46","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/tab-teaser\/"},"modified":"2026-05-28T09:32:36","modified_gmt":"2026-05-28T09:32:36","slug":"tab-teaser","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/tab-teaser\/","author":23111453,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"2.0.0","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Tab Teaser","header_author":"Josip Me\u0161trovi\u0107","header_description":"Re-engages visitors who switch browser tabs by changing the page title and favicon while the tab is inactive. Supports flashing animation, trigger delay, bundled SVG icons, custom media-library images, live preview, and rich page targeting.","assets_banners_color":"f6f8fc","last_updated":"2026-05-28 09:32:36","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/josipmestrovic\/tab-teaser","header_author_uri":"https:\/\/e-com.hr","rating":5,"author_block_rating":0,"active_installs":0,"downloads":63,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jokster33","date":"2026-05-25 15:10:34"},"2.0.0":{"tag":"2.0.0","author":"jokster33","date":"2026-05-28 09:32:36"}},"upgrade_notice":{"2.0.0":"<p>Major upgrade. WordPress now owns your normal title and favicon; Tab Teaser is scoped to the inactive state. New: 12 light\/dark SVG presets, two flashing modes, deferred boot, perfectly-synced title+favicon swaps, polished UI. The Active title and Normal favicon fields are removed.<\/p>","1.0.0":"<p>First public release of Tab Teaser.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3551817,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3551817,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","2.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3551817,"resolution":"1","location":"assets","locale":"","width":1352,"height":715},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3551817,"resolution":"2","location":"assets","locale":"","width":961,"height":407},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3551817,"resolution":"3","location":"assets","locale":"","width":954,"height":671}},"screenshots":{"1":"The settings page with live preview pane.","2":"Bundled SVG favicon presets (tile picker).","3":"Targeting by URL pattern.","4":"Live \"Simulate Tab Switch\" preview."}},"plugin_section":[],"plugin_tags":[264201,984,307,3841,264345],"plugin_category":[50,55],"plugin_contributors":[264346],"plugin_business_model":[],"class_list":["post-313778","plugin","type-plugin","status-publish","hentry","plugin_tags-abandonment","plugin_tags-conversion","plugin_tags-engagement","plugin_tags-favicon","plugin_tags-tab-title","plugin_category-media","plugin_category-seo-and-marketing","plugin_contributors-jokster33","plugin_committers-jokster33"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tab-teaser\/assets\/icon-256x256.png?rev=3551817","icon_2x":"https:\/\/ps.w.org\/tab-teaser\/assets\/icon-256x256.png?rev=3551817","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/tab-teaser\/assets\/screenshot-1.png?rev=3551817","caption":"The settings page with live preview pane."},{"src":"https:\/\/ps.w.org\/tab-teaser\/assets\/screenshot-2.png?rev=3551817","caption":"Bundled SVG favicon presets (tile picker)."},{"src":"https:\/\/ps.w.org\/tab-teaser\/assets\/screenshot-3.png?rev=3551817","caption":"Targeting by URL pattern."}],"raw_content":"<!--section=description-->\n<p><strong>Tab Teaser<\/strong> is a lightweight engagement plugin that pulls visitors back when they switch to another browser tab. The moment your tab loses focus, Tab Teaser swaps the page title and favicon to a custom, attention-grabbing message. When the visitor switches back, everything is restored instantly.<\/p>\n\n<p>It is especially effective on cart, checkout, signup, and long-form sales pages where every distracted visitor matters.<\/p>\n\n<h4>What it does (and doesn\u2019t)<\/h4>\n\n<p>Tab Teaser is scoped on purpose. WordPress already owns your normal page title and favicon \u2014 the plugin doesn\u2019t touch them. It only steps in once the visitor switches to another tab, and steps right back out when they return. That focused scope is what keeps the settings short, the frontend payload tiny, and the plugin friction-free to install alongside any theme or page-builder.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Custom inactive title<\/strong> \u2014 show any message (emoji supported) when the visitor leaves the tab.<\/li>\n<li><strong>Two flashing modes<\/strong> \u2014 <em>Use site title + Site Icon<\/em> alternates your inactive pair with the page\u2019s normal title and favicon. <em>Use a custom alternative pair<\/em> alternates between two plugin-managed pairs (your inactive title\/favicon \u2194 a configurable Flash title\/Flash favicon) so you can rotate two distinct messages.<\/li>\n<li><strong>Trigger delay<\/strong> \u2014 wait N seconds after the tab is hidden before swapping. Visitors who tab back in time never see the change.<\/li>\n<li><strong>12 bundled SVG favicons<\/strong> \u2014 hand-crafted icons (Alert, Shopping Cart, Raised Hand, Bell, Fire, Broken Heart, Googly Eyes, Watching Eye, New Message, Clock, Gift, Sparkle) ship with the plugin, each in paired light + dark variants. Crisp at every size, zero HTTP overhead.<\/li>\n<li><strong>Light \/ dark theme aware<\/strong> \u2014 the plugin detects the visitor\u2019s OS color-scheme preference and picks the matching favicon variant automatically, updating live if the visitor toggles their theme. You can also upload your own light <strong>and<\/strong> dark inactive \/ flash favicon.<\/li>\n<li><strong>Custom favicon upload<\/strong> \u2014 pick any image (PNG, JPG, ICO, SVG) from the WordPress Media Library.<\/li>\n<li><strong>Live preview<\/strong> \u2014 see exactly how your tab will look as you edit settings. Includes a \"Simulate Tab Switch\" button.<\/li>\n<li><strong>Rich page targeting<\/strong> \u2014 run on every page, on selected pages \/ posts \/ custom post types \/ taxonomy terms, or on URL patterns (<code>\/checkout\/*<\/code>). Independent <strong>exclude<\/strong> rules always win over includes.<\/li>\n<li><strong>No external requests<\/strong> \u2014 every asset is local. No tracking, no telemetry, no third-party scripts.<\/li>\n<li><strong>Accessible &amp; lightweight<\/strong> \u2014 vanilla JavaScript on the frontend, ~3 KB minified payload, no jQuery dependency.<\/li>\n<li><strong>Multisite-aware uninstall<\/strong> \u2014 every option is removed cleanly when the plugin is deleted.<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>Tab Teaser does not collect, store, or transmit any visitor data. It does not make any external HTTP requests. It only reads the browser's standard <code>visibilitychange<\/code> event to decide when to swap the tab title and favicon.<\/p>\n\n<h4>Performance<\/h4>\n\n<p>Tab Teaser is engineered for <strong>zero measurable impact on Core Web Vitals<\/strong>. Here is exactly how:<\/p>\n\n<ul>\n<li><strong>Deferred bootstrap<\/strong> \u2014 the script waits for <code>window.load<\/code> (i.e. after every image, stylesheet and render-blocking asset has finished) <strong>plus a configurable additional delay<\/strong> (default 2 seconds) before doing anything. It therefore never competes with LCP, FID\/INP, or your critical resources.<\/li>\n<li><strong>Vanilla JavaScript, no dependencies<\/strong> \u2014 no jQuery, no framework, no polyfills. The entire frontend payload is one file, ~3 KB minified, ~1.5 KB gzipped.<\/li>\n<li><strong>Loaded only where needed<\/strong> \u2014 the script is enqueued only on pages that pass your targeting rules. Run it on <code>\/checkout\/*<\/code> only and the rest of your site ships <strong>zero extra bytes<\/strong>.<\/li>\n<li><strong>No external HTTP requests<\/strong> \u2014 every asset (icons, script) is served from your own origin. No CDN dependency, no third-party DNS, no privacy concerns.<\/li>\n<li><strong>No injected CSS on the frontend<\/strong> \u2014 the plugin does not output any stylesheet on visitor-facing pages.<\/li>\n<li><strong>Inert until the tab is hidden<\/strong> \u2014 once initialized, the script only attaches one passive <code>visibilitychange<\/code> listener. No timers run, no DOM mutations happen, until the visitor actually leaves the tab.<\/li>\n<li><strong>Cache-friendly<\/strong> \u2014 because everything runs in the browser, the plugin is fully compatible with full-page caching, CDN caching, and static-site exporters.<\/li>\n<li><strong>SVG favicons<\/strong> \u2014 bundled icons are hand-authored SVG, so they're a few hundred bytes each and stay crisp at any DPR.<\/li>\n<\/ul>\n\n<p>In practice, this means a Lighthouse \/ PageSpeed Insights run against a page with Tab Teaser enabled measures identically to the same page without it.<\/p>\n\n<h4>Developer hooks<\/h4>\n\n<ul>\n<li><code>tab_teaser_should_load<\/code> (filter) \u2014 final boolean override before frontend assets are enqueued.<\/li>\n<li><code>tab_teaser_settings_defaults<\/code> (filter) \u2014 modify the default settings array.<\/li>\n<li><code>tab_teaser_localized_data<\/code> (filter) \u2014 modify the data passed to the frontend script.<\/li>\n<li><code>tab_teaser_bundled_presets<\/code> (filter) \u2014 register additional bundled favicon tiles.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<h4>Automatic<\/h4>\n\n<ol>\n<li>In your WordPress dashboard, go to <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Search for <strong>Tab Teaser<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Go to <strong>Tab Teaser<\/strong> in the admin sidebar to configure.<\/li>\n<\/ol>\n\n<h4>Manual<\/h4>\n\n<ol>\n<li>Download the plugin ZIP.<\/li>\n<li>Upload the unzipped <code>tab-teaser<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin from <strong>Plugins<\/strong> in your WordPress admin.<\/li>\n<li>Go to <strong>Tab Teaser<\/strong> in the admin sidebar to configure.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>No. Tab Teaser is engineered for zero measurable impact on Core Web Vitals \u2014 see the <strong>Performance<\/strong> section under Description for the full breakdown. In short: the script defers itself until after <code>window.load<\/code> plus an additional configurable delay (default 2 seconds), is pure vanilla JavaScript (~3 KB minified), is loaded only on targeted pages, makes no external HTTP requests, and stays inert until the visitor actually leaves the tab.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20caching%20plugins%3F\"><h3>Does it work with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. The plugin's frontend logic runs entirely in the browser using JavaScript and the standard <code>visibilitychange<\/code> API, so it is unaffected by full-page caching, CDN caching, or static-site exporters.<\/p><\/dd>\n<dt id=\"does%20tab%20teaser%20track%20visitors%20or%20collect%20any%20data%3F\"><h3>Does Tab Teaser track visitors or collect any data?<\/h3><\/dt>\n<dd><p>No. The plugin does not collect, store, or transmit any visitor data. It does not make any external HTTP requests. See the Description section for the full privacy statement.<\/p><\/dd>\n<dt id=\"can%20i%20use%20tab%20teaser%20to%20change%20my%20normal%20page%20title%20or%20favicon%3F\"><h3>Can I use Tab Teaser to change my normal page title or favicon?<\/h3><\/dt>\n<dd><p>No \u2014 by design. WordPress already owns your normal on-tab title (the page title) and favicon (Site Icon, set in Appearance \u2192 Customize \u2192 Site Identity). Tab Teaser intentionally keeps its scope to the <em>inactive<\/em> state so it stays a small, focused plugin you can install carefree alongside any theme. If you came here looking for a way to swap a dark-mode-aware brand favicon on the active tab, a dedicated favicon plugin is the right tool for that job.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20mobile%20browsers%3F\"><h3>Does it work on mobile browsers?<\/h3><\/dt>\n<dd><p>Yes. The <code>visibilitychange<\/code> event is supported in every modern mobile browser, including iOS Safari (13+) and Android Chrome.<\/p><\/dd>\n<dt id=\"can%20i%20run%20it%20only%20on%20my%20checkout%20page%3F\"><h3>Can I run it only on my checkout page?<\/h3><\/dt>\n<dd><p>Yes. Switch the targeting mode to \"On selected content\" and pick the checkout page in the include list, or use \"On URLs that match patterns\" with <code>\/checkout\/*<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20exclude%20specific%20pages%3F\"><h3>Can I exclude specific pages?<\/h3><\/dt>\n<dd><p>Yes. The targeting card has independent \"Exclude\" lists for content, taxonomy terms, and URL patterns. Exclusions always win over includes.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20%2F%20easy%20digital%20downloads%20%2F%20membership%20plugins%3F\"><h3>Does it work with WooCommerce \/ Easy Digital Downloads \/ membership plugins?<\/h3><\/dt>\n<dd><p>Yes. Targeting works with any registered public post type or taxonomy, including WooCommerce products, EDD downloads, BBPress topics, etc. They appear automatically in the targeting selectors.<\/p><\/dd>\n<dt id=\"how%20do%20i%20localize%20%2F%20translate%20the%20plugin%3F\"><h3>How do I localize \/ translate the plugin?<\/h3><\/dt>\n<dd><p>The plugin uses the text-domain <code>tab-teaser<\/code>. Translations are loaded automatically from <code>\/wp-content\/languages\/plugins\/<\/code> if available.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Added: deferred script loading. Tab Teaser now waits for <code>window.load<\/code> plus a configurable delay (default 2 seconds) before initializing, so it never competes with your page\u2019s critical assets.<\/li>\n<li>Added: light \/ dark favicon support. Bundled presets ship with paired light + dark SVGs, and the plugin live-detects the visitor\u2019s OS theme (with live updates on theme switch). Custom uploads can opt-in to a separate dark variant.<\/li>\n<li>Added: nine new bundled SVG icons \u2014 Bell, Fire, Broken Heart, Googly Eyes, Watching Eye, New Message, Clock, Gift, Sparkle \u2014 in addition to the existing Alert, Cart, and Raised Hand presets (12 total, all with light + dark variants).<\/li>\n<li>Added: two flashing modes. \u201cUse site title + Site Icon\u201d alternates your inactive pair with the page\u2019s normal title and favicon. \u201cUse a custom alternative pair\u201d alternates between two plugin-managed pairs (inactive title\/favicon \u2194 a configurable Flash title \/ Flash favicon).<\/li>\n<li>Added: new \u201cPerformance\u201d settings card hosting the script load delay control.<\/li>\n<li>Added: explicit Performance section in the readme.<\/li>\n<li>Removed: Active title override and Normal favicon override. WordPress now owns the active-tab title and favicon (Site Icon) without any plugin interference \u2014 Tab Teaser is scoped strictly to the inactive state, keeping the settings page short and the plugin friction-free.<\/li>\n<li>Improved: preset favicon tiles use a clean single-icon look \u2014 the live preview\u2019s Light\/Dark theme switcher shows what each variant looks like in context.<\/li>\n<li>Improved: live preview auto-starts in the inactive state on page load, so visitors of the settings page see the effect immediately. Click \u201cStop Simulating\u201d to view the active state.<\/li>\n<li>Improved: live preview always boots in the Light theme so the layout is recognizable on first load.<\/li>\n<li>Improved: the simulator\u2019s \u201cAnother tab\u201d placeholder appends \u201c(ACTIVE)\u201d while your tab is inactive, making the swap unmistakable.<\/li>\n<li>Improved: widened the live-preview sidebar so the simulator and its controls have more room.<\/li>\n<li>Improved: Performance card moved to the bottom of the settings page so the most common configuration stays above the fold.<\/li>\n<li>Improved: Tips card refreshed to reflect the new workflow (scope, light\/dark favicons, flashing modes, e-commerce targeting) and converted to an accordion so the sidebar stays compact.<\/li>\n<li>Improved: when flashing animation is enabled, the simulator now keeps the tab visually inactive throughout and only flips the title \/ favicon \u2014 matching the real frontend behavior.<\/li>\n<li>Improved: live preview tabs use higher-contrast colors for the inactive (background) tab in both light and dark themes, so the title stays readable while the simulation runs.<\/li>\n<li>Improved: settings UI clarity and helper copy throughout. Settings split into a focused \u201cGeneral\u201d card (inactive title, inactive favicon, trigger delay) and a dedicated \u201cFlashing Mode\u201d card with an inline help tooltip explaining each mode.<\/li>\n<li>Improved: \u201cZero impact on performance\u201d tip now documents the 2-second post-load script delay and warns that switching tabs within 2 seconds of reload during testing may miss the init window \u2014 real visitors are never affected.<\/li>\n<li>Changed: default inactive title is now \u201cWhere Did You Go? \ud83e\udd28\u201d and the default inactive favicon is Googly Eyes \u2014 a friendlier, more attention-grabbing out-of-the-box experience.<\/li>\n<li>Fixed: original favicon is now reliably restored when the visitor returns to the tab. Uses a persistent managed <code>&lt;link rel=\"icon\"&gt;<\/code> with href mutation \u2014 the only pattern Chromium honors for live tab-favicon refresh (element removals are ignored by the tab UI).<\/li>\n<li>Fixed: tab title and favicon now swap in lockstep on every transition (entering inactive, every flash tick, returning to active). Favicons are pre-fetched, converted to inline <code>data:<\/code> URIs, and pre-decoded at init, so swaps trigger zero network and land on the same paint as the title write.<\/li>\n<li>Fixed: the \u201cSite icon\u201d tile in the inactive \/ flash favicon picker now resolves to the site\u2019s actual favicon (WordPress Site Icon when configured, otherwise <code>\/favicon.ico<\/code>). Previously the tile saved an empty value and the favicon never changed on tab switch.<\/li>\n<li>Fixed: admin simulation now shows the correct site favicon for both the \u201cSite icon\u201d tile and the active-state preview (it no longer falls back to the inactive favicon, which made the simulation misleading).<\/li>\n<li>Fixed: live preview no longer fails to auto-start on a hard page load \u2014 initialization is now deferred to the next animation frame.<\/li>\n<li>Fixed: toggling \u201cEnable flashing\u201d while the live preview is simulating now updates immediately \u2014 the simulator reconciles the flashing timer with the current setting instead of requiring a stop \/ start.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<\/ul>","raw_excerpt":"Re-engage visitors who switch browser tabs by changing the page title and favicon while the tab is inactive.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/313778","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=313778"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jokster33"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=313778"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=313778"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=313778"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=313778"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=313778"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=313778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}