{"id":298319,"date":"2026-06-01T07:51:17","date_gmt":"2026-06-01T07:51:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-salesman-chat-pro\/"},"modified":"2026-06-22T17:58:35","modified_gmt":"2026-06-22T17:58:35","slug":"winaltchat-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/hsb.wordpress.org\/plugins\/winaltchat-for-woocommerce\/","author":23514820,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.32","stable_tag":"1.3.32","tested":"7.0","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"WinaltChat for WooCommerce","header_author":"Winalt Technologies","header_description":"WinaltChat adds an AI-powered chat widget to your WooCommerce store to help customers find products, answer questions, and boost sales.","assets_banners_color":"a6b8da","last_updated":"2026-06-22 17:58:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/winaltchat-for-woocommerce\/","header_author_uri":"https:\/\/winalttechnologies.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":270,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.92":{"tag":"1.0.92","author":"fahadali158","date":"2026-06-01 07:50:40"},"1.0.93":{"tag":"1.0.93","author":"fahadali158","date":"2026-06-01 08:56:30"},"1.0.95":{"tag":"1.0.95","author":"fahadali158","date":"2026-06-01 14:48:58"},"1.1.01":{"tag":"1.1.01","author":"fahadali158","date":"2026-06-01 20:02:49"},"1.1.14":{"tag":"1.1.14","author":"fahadali158","date":"2026-06-03 20:16:06"},"1.3.10":{"tag":"1.3.10","author":"fahadali158","date":"2026-06-12 18:29:59"},"1.3.32":{"tag":"1.3.32","author":"fahadali158","date":"2026-06-22 17:58:35"},"1.3.7":{"tag":"1.3.7","author":"fahadali158","date":"2026-06-07 07:41:59"},"1.3.8":{"tag":"1.3.8","author":"fahadali158","date":"2026-06-07 08:08:03"},"1.3.9":{"tag":"1.3.9","author":"fahadali158","date":"2026-06-09 11:02:14"}},"upgrade_notice":{"1.2.0":"<p>Major feature release: Live Human Chat. Two new database tables\nare created automatically on first admin page load after upgrade.\nNo breaking changes to existing AI chat functionality.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3582152,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3582152,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3582152,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3582152,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.92","1.0.93","1.0.95","1.1.01","1.1.14","1.3.10","1.3.32","1.3.7","1.3.8","1.3.9"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[90336,2364,2379,247874,286],"plugin_category":[45],"plugin_contributors":[265289,266869],"plugin_business_model":[],"class_list":["post-298319","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-chat","plugin_tags-chatbot","plugin_tags-live-chat","plugin_tags-shopping-assistant","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-fahadali158","plugin_contributors-winalttechnologies","plugin_committers-fahadali158","plugin_committers-winalttechnologies","plugin_support_reps-fahadali158"],"banners":{"banner":"https:\/\/ps.w.org\/winaltchat-for-woocommerce\/assets\/banner-772x250.png?rev=3582152","banner_2x":"https:\/\/ps.w.org\/winaltchat-for-woocommerce\/assets\/banner-1544x500.png?rev=3582152","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/winaltchat-for-woocommerce\/assets\/icon-128x128.png?rev=3582152","icon_2x":"https:\/\/ps.w.org\/winaltchat-for-woocommerce\/assets\/icon-256x256.png?rev=3582152","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>WinaltChat<\/strong> adds a fast, intelligent chat widget to your\nWooCommerce store. Customers can search your product catalogue,\nget instant answers about shipping and returns, and \u2014 when they\nneed a real person \u2014 connect to your support team through a built-in\nlive chat system, all without leaving your store.<\/p>\n\n<h4>AI Shopping Assistant<\/h4>\n\n<ul>\n<li><strong>Dual AI Modes<\/strong> \u2014 Use your own API key from Groq \u2014 LLaMA\n(Free Tier), ChatGPT (OpenAI), Claude (Anthropic), or Gemini\n(Google) for full conversational AI. No key? The built-in\n<em>Basic AI<\/em> mode runs entirely on your server with zero external\ncalls and zero ongoing cost.<\/li>\n<li><strong>Smart Product Search<\/strong> \u2014 Intent-aware search across your\nWooCommerce catalogue. Handles typos, synonyms, multilingual and mixed-language\nqueries, and follow-up questions naturally.<\/li>\n<li><strong>Product Comparisons<\/strong> \u2014 Customers can ask \"which is better, the Sony or the\nSamsung?\" and get a clear side-by-side comparison\nwith prices and key specs from your own catalogue.<\/li>\n<li><strong>Store Knowledge Base<\/strong> \u2014 Reads your shipping, returns, contact,\nand about pages to answer policy questions accurately and\ndynamically \u2014 no hardcoded answers that break for other stores.<\/li>\n<li><strong>Conversation Context<\/strong> \u2014 Remembers context within a session so\nfollow-up questions (\"does it come in blue?\") work naturally.<\/li>\n<li><strong>Amazon Affiliate Fallback<\/strong> \u2014 When a product is out of stock,\noptionally suggest an Amazon affiliate link so you still earn a\ncommission.<\/li>\n<\/ul>\n\n<h4>Live Human Chat<\/h4>\n\n<ul>\n<li><strong>Human Handoff<\/strong> \u2014 When a customer types phrases like \"I want\nto talk to a human\", \"customer service\", \"live agent\", or dozens\nof natural variants, the plugin detects the request and connects\nthem to a real person on your team.<\/li>\n<li><strong>Admin Live Chats Dashboard<\/strong> \u2014 A dedicated <strong>Live Chats<\/strong> screen\nin your WordPress admin shows all active, waiting, and closed\nconversations in a two-panel interface. Keep the tab open to stay\nmarked online for visitors.<\/li>\n<li><strong>Visitor Name Prompt<\/strong> \u2014 Before connecting, the visitor is\noptionally asked for their name. If skipped, they are identified\nas \"Visitor #ID\" so you can tell conversations apart.<\/li>\n<li><strong>Full Conversation Context for Agents<\/strong> \u2014 When a customer is\nhanded off, the admin sees the complete prior AI conversation so\nthere is no need to ask \"how can I help?\" twice.<\/li>\n<li><strong>Visitor Presence Dot<\/strong> \u2014 A green dot shows the visitor is\nactive. It turns grey within 30 seconds if they close the tab.<\/li>\n<li><strong>Two-Tier Timeout<\/strong> \u2014 If your team does not respond within\n90 seconds, the visitor sees a friendly patience message. After\n5 minutes of no reply, the chat gracefully falls back to the AI\nassistant with an optional email capture.<\/li>\n<li><strong>Intelligent Offline Handling<\/strong> \u2014 When no admin is online the AI\nkeeps helping. Visitors can optionally leave their email for a\nfollow-up. Leads appear in the admin Live Chats list with a\ndedicated Leads section and unread badge.<\/li>\n<li><strong>Session Management<\/strong> \u2014 Close chats when resolved, or delete\nthem permanently. Closed and lead sessions stay visible in\ntheir own sections until manually removed.<\/li>\n<li><strong>Zero External Dependencies<\/strong> \u2014 Live chat runs entirely within\nyour WordPress site using secure AJAX polling over the REST API.\nNo Pusher, no third-party service, no extra cost.<\/li>\n<li><strong>Email Notifications<\/strong> \u2014 Get an email when a customer starts a\nlive chat or leaves their contact details while you are offline.<\/li>\n<\/ul>\n\n<h4>Privacy &amp; Security<\/h4>\n\n<ul>\n<li>All live chat data is stored in your own WordPress database.\nNothing is sent to an external service.<\/li>\n<li>Session tokens are 32-character cryptographically random strings\n\u2014 not sequential IDs \u2014 so sessions cannot be enumerated.<\/li>\n<li>All endpoints enforce nonces, capability checks, input\nsanitization, output escaping, and rate limiting.<\/li>\n<li>Message content is sanitized server-side and rendered via\ntextContent in the browser \u2014 XSS injection is not possible.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.2 or later<\/li>\n<li>WooCommerce 7.0 or later (must be installed and active)<\/li>\n<li>PHP 7.4 or later<\/li>\n<li>An API key from Groq, OpenAI, Anthropic, or Google <em>(optional \u2014\nBasic AI and Live Chat both work without one)<\/em><\/li>\n<\/ul>\n\n<h4>Support<\/h4>\n\n<ul>\n<li><strong>Support Forum:<\/strong> <a href=\"https:\/\/wordpress.org\/support\/plugin\/winaltchat-for-woocommerce\/\">wordpress.org\/support\/plugin\/winaltchat-for-woocommerce<\/a><\/li>\n<li><strong>Email:<\/strong> support@winalttechnologies.com<\/li>\n<\/ul>\n\n<p>We aim to respond to all support requests within 48 hours.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to third-party AI providers only when you\nconfigure an external AI mode and enter your own API key. In Basic\nAI mode and during live human chat, no external AI service is used.<\/p>\n\n<p><strong>AI Providers (optional \u2014 only when an API key is configured)<\/strong><\/p>\n\n<p>Customer messages, recent conversation context, and relevant store\nand product context are sent to the AI provider you select so it\ncan generate a response. No data is sent to these providers when\nusing Basic AI mode.<\/p>\n\n<ul>\n<li><strong>Groq<\/strong> \u2014 <a href=\"https:\/\/groq.com\">groq.com<\/a> | <a href=\"https:\/\/groq.com\/privacy-policy\/\">Privacy Policy<\/a> | <a href=\"https:\/\/groq.com\/terms-of-service\/\">Terms of Service<\/a><\/li>\n<li><strong>OpenAI<\/strong> \u2014 <a href=\"https:\/\/openai.com\">openai.com<\/a> | <a href=\"https:\/\/openai.com\/policies\/privacy-policy\/\">Privacy Policy<\/a> | <a href=\"https:\/\/openai.com\/policies\/usage-policies\/\">Terms of Use<\/a><\/li>\n<li><strong>Anthropic Claude<\/strong> \u2014 <a href=\"https:\/\/anthropic.com\">anthropic.com<\/a> | <a href=\"https:\/\/www.anthropic.com\/privacy\">Privacy Policy<\/a> | <a href=\"https:\/\/www.anthropic.com\/legal\/consumer-terms\">Terms of Service<\/a><\/li>\n<li><strong>Google Gemini<\/strong> \u2014 <a href=\"https:\/\/ai.google.dev\">ai.google.dev<\/a> | <a href=\"https:\/\/policies.google.com\/privacy\">Privacy Policy<\/a> | <a href=\"https:\/\/policies.google.com\/terms\">Terms of Service<\/a><\/li>\n<\/ul>\n\n<p><strong>Amazon Associate Program (optional \u2014 only when a tag is configured)<\/strong><\/p>\n\n<p>When the Amazon fallback is enabled and no matching product is\nfound in your store, the plugin generates an Amazon search link\nwith your Associate tag. No customer data is transmitted to Amazon\nby the plugin \u2014 the link simply directs the visitor's browser.<\/p>\n\n<ul>\n<li><strong>Amazon<\/strong> \u2014 <a href=\"https:\/\/www.amazon.com\">amazon.com<\/a> | <a href=\"https:\/\/www.amazon.com\/gp\/help\/customer\/display.html?nodeId=GX7NJQ4ZB8MHFRNJ\">Privacy Notice<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>winaltchat-for-woocommerce<\/code> folder to\n   \/wp-content\/plugins\/, or install directly via the WordPress\nPlugins screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Make sure <strong>WooCommerce<\/strong> is installed and active.<\/li>\n<li>Navigate to <strong>WinaltChat \u2192 Settings<\/strong> in the WordPress admin.<\/li>\n<li><strong>AI Mode (optional):<\/strong> Choose your preferred AI provider and\nenter your API key, or leave blank to use the built-in Basic AI\nmode at zero cost.<\/li>\n<li><strong>Live Human Chat (optional):<\/strong> Scroll to the Live Human Chat\nsection, enable the toggle, set a notification email and agent\ndisplay name. A <strong>Live Chats<\/strong> item will appear in the sidebar.<\/li>\n<li>Keep the <strong>Live Chats<\/strong> tab open in your browser while you work\nto appear online to visitors requesting a human.<\/li>\n<li>Customise the chat appearance under the <strong>Chat Appearance<\/strong> tab.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20api%20key%20to%20use%20this%20plugin%3F\"><h3>Do I need an API key to use this plugin?<\/h3><\/dt>\n<dd><p>No. The built-in Basic AI mode handles product search, comparisons,\npolicy questions, and conversation without any API key or external\nservice. Real AI mode (Groq, OpenAI, Claude, Gemini) is optional\nand improves response quality for complex queries.<\/p><\/dd>\n<dt id=\"does%20live%20human%20chat%20require%20any%20external%20service%3F\"><h3>Does Live Human Chat require any external service?<\/h3><\/dt>\n<dd><p>No. It runs entirely within your WordPress site using the WordPress\nREST API. No Pusher, no LiveChat subscription, no third-party\naccounts needed.<\/p><\/dd>\n<dt id=\"how%20does%20the%20admin%20know%20a%20customer%20is%20waiting%3F\"><h3>How does the admin know a customer is waiting?<\/h3><\/dt>\n<dd><p>Two ways: a browser notification fires in the Live Chats tab (if\nyou grant notification permission), and an email is sent to your\nconfigured notify address. Keep the Live Chats tab open while\nyou work to stay marked as online.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20no%20admin%20is%20online%20when%20a%20customer%20asks%20for%20help%3F\"><h3>What happens if no admin is online when a customer asks for help?<\/h3><\/dt>\n<dd><p>The AI assistant keeps helping the customer seamlessly. A message\nexplains the team is unavailable, and the customer is offered an\noptional email field so you can follow up. No dead ends.<\/p><\/dd>\n<dt id=\"how%20long%20before%20an%20unanswered%20live%20chat%20falls%20back%20to%20the%20ai%3F\"><h3>How long before an unanswered live chat falls back to the AI?<\/h3><\/dt>\n<dd><p>At 90 seconds of no response, the visitor sees a friendly\n\"thanks for your patience\" message. At 5 minutes, the chat\ngracefully returns to AI mode with an email capture option. Both\nthresholds are configurable in the Live Human Chat settings.<\/p><\/dd>\n<dt id=\"can%20multiple%20admins%20handle%20chats%20at%20the%20same%20time%3F\"><h3>Can multiple admins handle chats at the same time?<\/h3><\/dt>\n<dd><p>Currently any admin with the manage_options capability can see and\nreply to all live chats. Multi-agent role management is planned for\na future release.<\/p><\/dd>\n<dt id=\"how%20do%20i%20remove%20all%20plugin%20data%20on%20uninstall%3F\"><h3>How do I remove all plugin data on uninstall?<\/h3><\/dt>\n<dd><p>Deleting the plugin via the WordPress Plugins screen automatically\nremoves all WinaltChat settings, options, and live chat database\ntables from your site.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20theme%3F\"><h3>Does it work with my theme?<\/h3><\/dt>\n<dd><p>Yes. The chat widget is injected into the page footer and uses its\nown scoped CSS so it does not conflict with theme styles.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>The AI chat widget loads asynchronously and does not block page\nrendering. Live chat polling only runs while an active live session\nis in progress \u2014 normal AI chat and idle pages make zero polling\nrequests.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.32<\/h4>\n\n<ul>\n<li>Improve: The \"Live Human Chat is currently disabled\" notice on the\nLive Chats page now matches the visual style of other informational\nnotices in the plugin (gradient background, accent border, icon)\ninstead of looking like a plain data panel.<\/li>\n<\/ul>\n\n<h4>1.3.31<\/h4>\n\n<ul>\n<li>New: Live Chat settings now has a Send Test Email button to confirm\nwp_mail() is working on your server \u2014 shows success or a plain\nerror message if delivery fails.<\/li>\n<li>New: Admin now receives an email notification when a visitor sends\na new message during a live chat session (rate-limited to once per\n10 minutes per session to avoid inbox spam).<\/li>\n<li>Fix: Admin console now shows a \"visitor left\" or \"chat closed\"\nsystem note and switches to read-only mode when the session is\nclosed or abandoned server-side (e.g. visitor timed out), without\nwaiting for a manual page refresh.<\/li>\n<li>Fix: When a visitor closes their browser tab or navigates away\nduring a live session, the admin console now receives an explicit\n\"Chat ended by visitor\" system note within the next poll cycle\ninstead of only showing the presence dot going grey.<\/li>\n<\/ul>\n\n<h4>1.3.30<\/h4>\n\n<ul>\n<li>New: The WinaltChat and Live Chats menu items now show a red\nnotification badge with the exact count of unread visitor messages\nwaiting for a reply, matching the native WordPress Comments\/Plugins\nbadge style.<\/li>\n<\/ul>\n\n<h4>1.3.29<\/h4>\n\n<ul>\n<li>Improve: The Live Chats menu item is now always visible in the\nWordPress admin, even when Live Human Chat is turned off. Visiting\nthe page while the feature is disabled now shows a friendly message\nwith a direct link to enable it in Settings, instead of the menu\nitem disappearing entirely.<\/li>\n<\/ul>\n\n<h4>1.3.28<\/h4>\n\n<ul>\n<li>Fix: Admin's own sent messages were being marked as \"read\" in the\ndatabase at the moment they were sent, regardless of whether the\nvisitor had actually seen them. This bypassed the existing\nread-receipt gating logic entirely and caused the admin console to\nalways show a blue (read) tick immediately, even when the visitor's\nchat was closed, minimized, or the page had been refreshed. Admin\nmessages now correctly start as unread and only turn blue once the\nvisitor has genuinely viewed them.<\/li>\n<\/ul>\n\n<h4>1.3.27<\/h4>\n\n<ul>\n<li>Fix: Admin console no longer marks visitor messages as read while\nthe admin's browser tab is in the background. Previously, visitor\nmessage read-state was marked on every poll regardless of whether\nthe admin was actually looking at the screen \u2014 now gated on tab\nvisibility (&amp;seen=1), mirroring the same technique already used for\nthe symmetric visitor-side case.<\/li>\n<\/ul>\n\n<h4>1.3.26<\/h4>\n\n<ul>\n<li>Fix: Reduced excessive gap between message text and inline timestamp on\nboth outgoing and incoming live-chat bubbles. Spacer widths are now\ncalculated to the minimum needed to prevent footer overlap plus a 4\u20135 px\nbreathing gap (outgoing: 52 px, incoming: 32 px; previously both 68 px).<\/li>\n<\/ul>\n\n<h4>1.3.25<\/h4>\n\n<ul>\n<li>Improve: Incoming admin live-chat messages now display their timestamp\ninline at the bottom-right of the bubble (WhatsApp style), matching the\nlayout used for outgoing visitor messages. Applied the same inline spacer\ntechnique \u2014 a hidden span reserves the footer's width in the text flow\nso the timestamp never overlaps the message content.<\/li>\n<\/ul>\n\n<h4>1.3.24<\/h4>\n\n<ul>\n<li>Improve: Outgoing live-chat message timestamps now appear inline after\nthe message text ends (WhatsApp style) rather than fixed at the\nbottom-right corner. An invisible inline spacer reserves the footer's\nwidth at the end of the last text line, so the absolutely-positioned\ntimestamp and tick slot naturally beside the text on both short and\nlong messages without the clipping issues that the float approach had.<\/li>\n<\/ul>\n\n<h4>1.3.23<\/h4>\n\n<ul>\n<li>Fix: Reverted float-based footer approach (caused short messages to\nrender with timestamp on a second line). Switched to absolute\npositioning with a min-width guard on the bubble: the bubble is\nalways at least 90px wide, ensuring the footer never clips on single-\nword messages while absolute positioning keeps it at the bottom-right\ncorner regardless of message length.<\/li>\n<\/ul>\n\n<h4>1.3.22<\/h4>\n\n<ul>\n<li>Fix: Short outgoing live-chat messages (e.g. a single word) no\nlonger clip their timestamp\/tick footer. Switched from absolute\npositioning to a float-based footer so the bubble's width correctly\naccounts for the footer's own size, matching WhatsApp's actual\nlayout behavior instead of an approximation that only worked by\ncoincidence on longer messages.<\/li>\n<\/ul>\n\n<h4>1.3.21<\/h4>\n\n<ul>\n<li>Improve: Visitor's outgoing message \"read\" tick now uses full white\ncontrast instead of light blue, since the outgoing bubble color is\nstore-configurable and the previous light-blue tick had very low\ncontrast against blue-themed bubbles, making the read state hard to\ndistinguish from the sent\/delivered state.<\/li>\n<li>Improve: Tightened spacing between message text and the timestamp\/\ntick footer on outgoing bubbles to sit closer to the WhatsApp-style\ncompact footer rather than appearing as a separate row.<\/li>\n<\/ul>\n\n<h4>1.3.20<\/h4>\n\n<ul>\n<li>Fix: Visitor's own outgoing live-chat messages now show a timestamp\nnext to the delivery tick, matching the admin console and standard\nmessaging-app conventions.<\/li>\n<li>Fix: Visitor's outgoing message ticks now reliably turn blue when\nthe admin reads them. The real message ID returned by the server on\nsend is now used directly instead of relying on the message\ncoincidentally reappearing in a later poll batch matched by\n(collision-prone) truncated text content.<\/li>\n<\/ul>\n\n<h4>1.3.19<\/h4>\n\n<ul>\n<li>Fix: Timestamps across admin console and visitor chat now display in\n12-hour format (\"2:05 PM\") instead of 24-hour. All three formatters\nunified to use { hour: 'numeric', minute: '2-digit', hour12: true }.<\/li>\n<li>Fix: Admin's own sent messages no longer disappear until a page refresh.\nThe premature lastId advancement in sendReply() was excluding the\njust-sent message from the immediately-following poll. Removed it.<\/li>\n<li>Fix: Admin now only sees blue ticks (message read) when the visitor\nis actively viewing the chat widget with the tab visible. The\nis_read=1 UPDATE is gated on a &amp;seen=1 parameter sent by JS only\nwhen chatOpen &amp;&amp; !document.hidden.<\/li>\n<li>Fix: Visitor outgoing message ticks now correctly upgrade to blue\nwhen the admin reads them, even after the poll cursor has advanced\npast those messages. visitor_poll() now returns visitor_read_ids and\na new updateTicksFromReadIds() method drives the upgrade.<\/li>\n<li>Fix: Live-chat admin message timestamps now appear bottom-right\ninside the bubble (WhatsApp style) instead of below it. Timestamp\nHTML moved inside .ai-bubble.assistant in formatMessage() and styled\nwith position:absolute via .has-timestamp CSS class.<\/li>\n<\/ul>\n\n<h4>1.3.18<\/h4>\n\n<ul>\n<li>Fix: Fixed a fatal error in the visitor live-chat poll endpoint that\ncaused every poll request to fail with HTTP 500. The \"mark admin\nmessages as read\" query was missing a required global $wpdb\ndeclaration and referenced an undefined variable. This was preventing\nvisitors from ever receiving admin replies during live chat.<\/li>\n<\/ul>\n\n<h4>1.3.17<\/h4>\n\n<ul>\n<li>Fix: Admin messages sent during live human chat no longer disappear\nfrom the visitor's chat window. Root cause: incoming admin messages\nwere appended directly to the DOM instead of being added to the\nchat's message history, so the next unrelated re-render (e.g. the\nvisitor sending a message) wiped them. Admin messages are now part\nof the same message history as everything else and survive all\nsubsequent re-renders.<\/li>\n<\/ul>\n\n<h4>1.3.16<\/h4>\n\n<ul>\n<li>Fix: Admin message bubbles now show a WhatsApp-style timestamp and\ngrey double-tick (delivered) in the bottom-right corner.<\/li>\n<li>Fix: Grey ticks turn blue once the visitor has read the message,\nupdating live without re-rendering the thread.<\/li>\n<li>Fix: fetch_messages() now returns is_read so tick state is\ncorrectly reflected on initial thread load.<\/li>\n<li>Fix: visitor_poll() now marks admin messages as is_read = 1 so\nthe grey-to-blue tick transition is driven by actual visitor reads.<\/li>\n<\/ul>\n\n<h4>1.3.15<\/h4>\n\n<ul>\n<li>Fix: Searches for uncatalogued product types no longer return irrelevant products; relevance gate now correctly returns no-results when no products match the search keyword.<\/li>\n<\/ul>\n\n<h4>1.3.14<\/h4>\n\n<ul>\n<li>Fix: Product searches for uncatalogued items (e.g. \"laptops\") now return a helpful no-results message instead of irrelevant products.<\/li>\n<\/ul>\n\n<h4>1.3.13<\/h4>\n\n<ul>\n<li>Fix: Message ticks now appear inside the chat bubble\nbottom-right corner (WhatsApp style) \u2014 not below it.<\/li>\n<li>Fix: All visitor messages get ticks, not just the last one.<\/li>\n<li>Fix: Tick size reduced to match standard messaging apps.<\/li>\n<li>New: Admin console now shows ticks on sent messages \u2014\nsingle grey when sent, double blue when visitor is online\nand receiving messages.<\/li>\n<\/ul>\n\n<h4>1.3.12<\/h4>\n\n<ul>\n<li>New: WhatsApp-style message ticks on visitor messages during live human\nchat \u2014 single grey tick when sent, double grey when delivered, double\nblue when the agent has read the message. Ticks only appear during live\nsessions, never during normal AI chat.<\/li>\n<\/ul>\n\n<h4>1.3.11<\/h4>\n\n<ul>\n<li>New: Timestamps in live human chat \u2014 each admin message shows the send time,\nand a centred time divider appears between messages when more than 5 minutes\nhave passed. Times display in the visitor's local timezone. Timestamps are\nshown only during live sessions, not during normal AI chat. The admin console\nalso shows timestamps on all messages in the thread.<\/li>\n<\/ul>\n\n<h4>1.3.10<\/h4>\n\n<ul>\n<li>New: Added WordPress Playground blueprint for Live Preview\non the WordPress.org plugin directory page. Visitors can\nnow try a fully working demo without installing anything.\nThe demo includes 8 sample products across 5 categories,\na complete store knowledge base (shipping, returns, contact,\nabout), and WinaltChat configured in Basic AI mode so no\nAPI key is needed.<\/li>\n<\/ul>\n\n<h4>1.3.8<\/h4>\n\n<ul>\n<li>Fix: Replaced store-specific product examples (GFC, Electromax) in readme.txt and code comments with generic international examples suitable for any WooCommerce store worldwide.<\/li>\n<li>Fix: \"Urdu\/English mixed queries\" replaced with \"multilingual and mixed-language queries\" in plugin description.<\/li>\n<\/ul>\n\n<h4>1.3.7<\/h4>\n\n<ul>\n<li>Maintenance: Trimmed changelog to WordPress.org 5000 character limit, keeping entries from 1.2.6 onwards.<\/li>\n<li>Fix: Plugin URI updated to the WordPress.org plugin page.<\/li>\n<\/ul>\n\n<h4>1.3.6<\/h4>\n\n<ul>\n<li>Security: Added per-IP rate limiting (30 requests \/ 60 seconds) to the AI chat REST endpoint to prevent API credit abuse by automated clients.<\/li>\n<li>Security: Visitor poll endpoint now verifies the WP REST nonce (via X-WP-Nonce header or ?nonce= query param) in addition to the session token, consistent with all other visitor endpoints.<\/li>\n<li>Fix: admin.js settings-save buttons now build DOM nodes with textContent \/ .text() instead of jQuery .html() string concatenation, eliminating a theoretical HTML injection path via malicious translation files.<\/li>\n<li>Fix: Chat transcript download now passes assistant message content through sanitizeViaDOM() before inserting it into the exported HTML file.<\/li>\n<li>Fix: readme.txt Tested up to corrected from 7.0 to 6.8.<\/li>\n<\/ul>\n\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Fix: Bumped minimum WordPress requirement from 6.0 to 6.2 to legitimise use of the %i identifier placeholder in $wpdb-&gt;prepare() calls \u2014 PHPCS was correctly flagging %i as unsupported below 6.2.<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Fix: PluginCheck.Security.DirectDB.UnescapedDBParameter warnings resolved \u2014 all flagged queries now use the %i identifier placeholder (WordPress 6.2+) for table names instead of PHP string interpolation, eliminating intermediate $sql variables that triggered the sniff.<\/li>\n<li>Fix: DELETE queries in the admin delete handler replaced with $wpdb-&gt;delete() \u2014 no manual SQL string construction.<\/li>\n<li>Note: WordPress.DB.DirectDatabaseQuery.SchemaChange warnings in uninstall.php are advisory-only and expected \u2014 Plugin Check always warns on DROP TABLE. They do not block WordPress.org submission.<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>Fix: Plugin Check warnings resolved \u2014 all PHPCS checks pass cleanly.<\/li>\n<li>Fix: readme.txt short description trimmed to a single line under 150 characters.<\/li>\n<li>Fix: Two DELETE queries in the admin delete handler now use $wpdb-&gt;delete() \u2014 direct session_id interpolation removed.<\/li>\n<li>Fix: Remaining UnescapedDBParameter Plugin Check warnings suppressed with inline phpcs:ignore comments where table names are trusted constants and values are prepared.<\/li>\n<\/ul>","raw_excerpt":"WinaltChat \u2013 AI-powered shopping assistant and live human chat for WooCommerce. Find products, answer questions, connect customers to your team.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/298319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=298319"}],"author":[{"embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/winalttechnologies"}],"wp:attachment":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=298319"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=298319"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=298319"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=298319"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=298319"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=298319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}