| 开发者 | designforonline |
|---|---|
| 更新时间 | 2026年8月14日 16:09 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
/wp-content/plugins/forerunner-ai-live-chat/You need to provide a webhook URL that processes the chat messages. This could be an endpoint from n8n (recommended), Zapier, Make, Pipedream, a custom AI service, or any other system that can respond to HTTP requests.
This plugin does not store conversation history by default. All messages are sent to your configured webhook URL. Data storage depends on your webhook implementation.
Yes, you can customize colors, messages, bot icons, and the overall appearance through the admin settings. The plugin includes comprehensive color customization options.
Yes, the chat widget is fully responsive and optimized for mobile devices, tablets, and desktop computers.
Voice chat functionality can be added through our compatible extensions (such as the optional DFO Voice plugin). The base plugin focuses on text-based conversations.
The plugin only connects to the webhook URL you specify in the settings. It's designed to work with any AI service or webhook-capable platform. No third-party connections are made without your explicit configuration.
Yes. We provide a free starter workflow for n8n which you can import and adapt. See the "Example Workflows" section for the download link.
(?<!…)), which is a parse-time SyntaxError on Safari < 16.4, so the entire widget script aborted before it could inject the bubble. Replaced with equivalent lookbehind-free patterns so the script parses and the bubble renders on iOS 15+.--theme-form-text-initial-color / focus colour is a common case — on alphaintelligence.one those resolve to #ffffff and #7DF9FF) were winning because the input had no colour of its own. The input now forces a dark text colour, matching caret/placeholder, and a white background so theme form tokens cannot wash the text out.requestAnimationFrame rather than one setTimeout per word with punctuation pauses and random jitter. A long answer completes in about six seconds instead of twelve to eighteen, the rate stays even instead of arriving in bursts when timers drift or the browser is busy, and a message interrupted by a background tab or a long task resumes where it left off rather than jumping to the end. Words now fade in as intended — the previous fade was dead, since the reveal class was applied before the word was inserted, leaving nothing to transition from.mousemove on the whole document and called getBoundingClientRect() on every single event, forcing a full synchronous layout of the page each time. Profiling a page with an Elementor popup showed 29.8ms of forced layout attributed to the widget across one popup interaction — roughly 0.2ms per mouse move at rest, rising to about 1ms per move while the page is mutating. The handler now caches the bubble's position (refreshed twice a second and on resize) and writes the shimmer angle once per animation frame instead of once per event, and the listener is registered as passive. No visual change to the effect.localStorage.setItem() call at the very start of widget setup, with no try/catch. On any browser or mode where storage access throws — Safari Private Browsing being the classic case, where WebKit has a long history of throwing QuotaExceededError on writes — that exception was uncaught and silently aborted the rest of setup, including the widget's own HTML injection, so nothing appeared at all with no visible error. Now falls back to a session-only visitor ID if storage is unavailable, so the widget still renders; it just won't persist the ID across page loads for that visit./track nonce is embedded in page HTML at render time, same as the tracking toggle — on a page held in cache longer than a WordPress nonce's ~24h lifetime, every /track beat from that cached page silently failed with invalid_nonce, even with tracking fully enabled and working. The nonce's lifetime is now extended to 30 days for this endpoint specifically, and the widget also self-heals: on an actual invalid_nonce rejection (and only that rejection — not disabled/bot/rate-limited, which are intentional and must not be retried), it fetches a fresh nonce from a new lightweight endpoint and retries that one beat. No extra requests on the normal, successful path.foreaili_active_visitors / foreaili_live_chat_visitors) verified a nonce but never independently checked manage_options inside the handler itself. Low practical risk (that nonce is only ever printed on an already admin-gated page), but a leaked nonce would have been enough on its own. Now checks capability explicitly.foreaili_debug_ip_detection) had no nonce check at all. Brought in line with its sibling debug_chat_history handler, which already did this correctly./track visitor-tracking endpoint accepted requests from anywhere with no verification — a security review found it could be hit directly (e.g. with curl) without ever loading the site, and every outcome (disabled, bad params, bot, success) returned an identical 200 OK, making it impossible to tell real tracking traffic from noise in server logs. The endpoint now requires a nonce generated when the page renders (so blind requests that never loaded the site are rejected) and returns a distinct HTTP status per outcome: 403 when tracking is disabled/bot-blocked/nonce-invalid, 400 for malformed requests, 429 when a single visitor is sending requests faster than the tracking interval allows, and 200 only for a genuinely accepted beat.wp_localize_script() bakes settings straight into the cached page HTML, so a cached copy kept serving the old values until it happened to expire. Saving the Visitor Tracking toggle (and updating the plugin) now best-effort purges WP Rocket, WP Super Cache, W3 Total Cache, LiteSpeed Cache, SG Optimizer, WP Fastest Cache, and Cache Enabler so the change takes effect immediately. No effect on sites without a page cache./v1/realtime?protocol=webrtc to the GA endpoint /v1/realtime/calls.forerunner_ai_persist_visitor_tracking because $data_changed only flipped on page navigation (a 2.4.5 perf optimisation). last_activity updated in memory but never persisted, so visitors vanished after ~90 s and reappeared on their next navigation. Heartbeats now always refresh the transient cache.wp_foreaili_messages database table instead of one-hour transients, so conversation history survives object-cache evictions and server restarts.GET /wp-json/forerunner-ai/v1/conversations and /conversations/{visitor_id}) feed the Pro inbox without any admin-ajax round-trips. Both require manage_options.forerunner_ai_messages_purge) prunes old rows automatically so the table never grows unbounded.dbDelta to create the new table; existing in-flight transient chats continue to work and get added to the table from the next message onwards.forerunner_ai_live_chat_agents option, drops pending chat-request transients, and strips stale chatStatus/agentId/agentName fields from visitor records.