{"id":248668,"date":"2025-09-01T08:16:37","date_gmt":"2025-09-01T08:16:37","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/init-chat-engine\/"},"modified":"2026-08-14T11:42:58","modified_gmt":"2026-08-14T11:42:58","slug":"init-chat-engine","status":"publish","type":"plugin","link":"https:\/\/ug.wordpress.org\/plugins\/init-chat-engine\/","author":14479633,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.6","stable_tag":"1.3.6","tested":"7.1","requires":"5.5","requires_php":"7.4","requires_plugins":null,"header_name":"Init Chat Engine","header_author":"Init HTML","header_description":"A lightweight, community-focused chat system built with REST API and Vanilla JS. Embed anywhere using the [init_chatbox] shortcode.","assets_banners_color":"39b3f8","last_updated":"2026-08-14 11:42:58","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/inithtml.com\/plugin\/init-chat-engine\/","header_author_uri":"https:\/\/inithtml.com\/","rating":0,"author_block_rating":0,"active_installs":60,"downloads":2204,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.6":{"tag":"1.1.6","author":"brokensmile.2103","date":"2025-09-01 08:31:03"},"1.1.7":{"tag":"1.1.7","author":"brokensmile.2103","date":"2025-09-13 11:20:42"},"1.1.8":{"tag":"1.1.8","author":"brokensmile.2103","date":"2025-09-13 14:57:02"},"1.1.9":{"tag":"1.1.9","author":"brokensmile.2103","date":"2025-10-01 03:09:10"},"1.2.0":{"tag":"1.2.0","author":"brokensmile.2103","date":"2025-10-02 06:50:04"},"1.2.1":{"tag":"1.2.1","author":"brokensmile.2103","date":"2025-10-07 13:34:20"},"1.2.2":{"tag":"1.2.2","author":"brokensmile.2103","date":"2025-10-07 14:52:10"},"1.2.3":{"tag":"1.2.3","author":"brokensmile.2103","date":"2025-10-14 15:39:20"},"1.2.4":{"tag":"1.2.4","author":"brokensmile.2103","date":"2025-10-18 03:25:17"},"1.2.5":{"tag":"1.2.5","author":"brokensmile.2103","date":"2025-10-18 08:22:09"},"1.2.6":{"tag":"1.2.6","author":"brokensmile.2103","date":"2025-10-29 14:28:45"},"1.2.7":{"tag":"1.2.7","author":"brokensmile.2103","date":"2025-11-10 02:52:18"},"1.2.8":{"tag":"1.2.8","author":"brokensmile.2103","date":"2025-11-11 05:27:09"},"1.2.9":{"tag":"1.2.9","author":"brokensmile.2103","date":"2026-02-13 02:10:24"},"1.3.0":{"tag":"1.3.0","author":"brokensmile.2103","date":"2026-03-02 13:35:12"},"1.3.1":{"tag":"1.3.1","author":"brokensmile.2103","date":"2026-03-26 04:20:31"},"1.3.2":{"tag":"1.3.2","author":"brokensmile.2103","date":"2026-03-30 03:53:44"},"1.3.3":{"tag":"1.3.3","author":"brokensmile.2103","date":"2026-03-30 04:52:25"},"1.3.4":{"tag":"1.3.4","author":"brokensmile.2103","date":"2026-04-07 04:00:12"},"1.3.4.1":{"tag":"1.3.4.1","author":"brokensmile.2103","date":"2026-05-17 16:08:13"},"1.3.4.2":{"tag":"1.3.4.2","author":"brokensmile.2103","date":"2026-05-18 14:48:52"},"1.3.5":{"tag":"1.3.5","author":"brokensmile.2103","date":"2026-08-01 08:00:42"},"1.3.6":{"tag":"1.3.6","author":"brokensmile.2103","date":"2026-08-14 11:42:58"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3353713,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3353713,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3353713,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3353713,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.6","1.1.7","1.1.8","1.1.9","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.2.8","1.2.9","1.3.0","1.3.1","1.3.2","1.3.3","1.3.4","1.3.4.1","1.3.4.2","1.3.5","1.3.6"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3353713,"resolution":"1","location":"assets","locale":"","width":896,"height":644},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3353713,"resolution":"2","location":"assets","locale":"","width":841,"height":682},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3353713,"resolution":"3","location":"assets","locale":"","width":868,"height":716},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3353713,"resolution":"4","location":"assets","locale":"","width":756,"height":369}},"screenshots":{"1":"Admin settings panel - Basic configuration","2":"Admin settings panel - Security and moderation","3":"Admin settings panel - Advanced options and maintenance","4":"Frontend chatbox interface with guest and user messages"}},"plugin_section":[],"plugin_tags":[5707,2316,4035,3518,80],"plugin_category":[41,43,44],"plugin_contributors":[242666],"plugin_business_model":[],"class_list":["post-248668","plugin","type-plugin","status-publish","hentry","plugin_tags-chat","plugin_tags-community","plugin_tags-lightweight","plugin_tags-realtime","plugin_tags-shortcode","plugin_category-communication","plugin_category-customization","plugin_category-discussion-and-community","plugin_contributors-brokensmile2103-1","plugin_committers-brokensmile2103-1"],"banners":{"banner":"https:\/\/ps.w.org\/init-chat-engine\/assets\/banner-772x250.png?rev=3353713","banner_2x":"https:\/\/ps.w.org\/init-chat-engine\/assets\/banner-1544x500.png?rev=3353713","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/init-chat-engine\/assets\/icon-128x128.png?rev=3353713","icon_2x":"https:\/\/ps.w.org\/init-chat-engine\/assets\/icon-256x256.png?rev=3353713","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/init-chat-engine\/assets\/screenshot-1.png?rev=3353713","caption":"Admin settings panel - Basic configuration"},{"src":"https:\/\/ps.w.org\/init-chat-engine\/assets\/screenshot-2.png?rev=3353713","caption":"Admin settings panel - Security and moderation"},{"src":"https:\/\/ps.w.org\/init-chat-engine\/assets\/screenshot-3.png?rev=3353713","caption":"Admin settings panel - Advanced options and maintenance"},{"src":"https:\/\/ps.w.org\/init-chat-engine\/assets\/screenshot-4.png?rev=3353713","caption":"Frontend chatbox interface with guest and user messages"}],"raw_content":"<!--section=description-->\n<p>Init Chat Engine is a clean and minimal frontend chatbox plugin, designed for homepage or site-wide communication with comprehensive administrative controls.<\/p>\n\n<p>This plugin is the core user system behind the <a href=\"https:\/\/en.inithtml.com\/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins\/\">Init Plugin Suite<\/a> \u2013 optimized for frontend-first interaction, extensibility, and real-time gamification.<\/p>\n\n<p>GitHub repository: <a href=\"https:\/\/github.com\/brokensmile2103\/init-chat-engine\">https:\/\/github.com\/brokensmile2103\/init-chat-engine<\/a><\/p>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<p><strong>Frontend Experience:<\/strong>\n- Built with 100% REST API and Vanilla JS\n- No jQuery, no bloat \u2013 blazing fast\n- Fully embeddable via <code>[init_chatbox]<\/code> shortcode\n- Guest messaging support (optional)\n- Smart polling system (adaptive 3.5\u201310s based on activity, up to 20s when the chatbox is scrolled out of view)\n- Browser notifications when new messages arrive\n- Scroll-up to load history, scroll-down to auto-scroll\n- Optimistic sending &amp; \"new message\" jump button\n- Clean UI with customizable themes\n- Template override supported (<code>chatbox.php<\/code>)<\/p>\n\n<p><strong>Administrative Control:<\/strong>\n- <strong>Complete Settings Panel<\/strong> - Basic, Security, and Advanced configurations\n- <strong>Message Management<\/strong> - Search, view, delete messages with pagination\n- <strong>User Moderation<\/strong> - Ban\/unban users by IP or user ID with expiration\n- <strong>Rate Limiting<\/strong> - Prevent spam with configurable message limits\n- <strong>Word Filtering<\/strong> - Block messages containing prohibited words\n- <strong>Statistics Dashboard<\/strong> - View chat activity, user engagement, and trends\n- <strong>Cleanup Tools<\/strong> - Automatic and manual cleanup of old messages\n- <strong>Custom CSS Support<\/strong> - Full styling customization options<\/p>\n\n<p><strong>Security &amp; Moderation:<\/strong>\n- IP-based and user-based banning system\n- Configurable rate limiting (messages per minute)\n- Word filtering with custom blocked word lists\n- Message moderation queue (optional)\n- Automatic cleanup of old messages and expired bans\n- Admin override capabilities<\/p>\n\n<p><strong>Multilingual Ready:<\/strong>\n- Translation-ready with full <code>.pot<\/code> file included\n- Vietnamese translation included\n- Easy to translate to any language<\/p>\n\n<p>Perfect for community-based sites, forums, fanpages, manga readers, SaaS dashboards, customer support, or any interactive chat widget.<\/p>\n\n<h3>Shortcode Attributes<\/h3>\n\n<p>Shortcode <code>[init_chatbox]<\/code> supports the following attributes:<\/p>\n\n<ul>\n<li><code>height<\/code> - Set chat height (e.g., <code>height=\"400px\"<\/code>)<\/li>\n<li><code>width<\/code> - Set chat width (e.g., <code>width=\"100%\"<\/code>)<\/li>\n<li><code>theme<\/code> - Apply custom theme (e.g., <code>theme=\"dark\"<\/code>)<\/li>\n<li><code>show_avatars<\/code> - Override avatar setting (<code>true<\/code>\/<code>false<\/code>)<\/li>\n<li><code>show_timestamps<\/code> - Override timestamp setting (<code>true<\/code>\/<code>false<\/code>)<\/li>\n<li><code>title<\/code> - Add custom chat title<\/li>\n<li><code>class<\/code> - Add custom CSS classes<\/li>\n<li><code>id<\/code> - Set custom container ID<\/li>\n<\/ul>\n\n<p>Example: <code>[init_chatbox height=\"500px\" title=\"Community Chat\" theme=\"modern\"]<\/code><\/p>\n\n<h3>Filters for Developers<\/h3>\n\n<p>This plugin provides filters and actions to allow developers to extend word filtering, message processing, and chat behavior without modifying core files.<\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_word_filter_strategy<\/code><\/strong><br \/>\nModify word filtering strategy (<code>substring<\/code>, <code>word<\/code>, <code>regex<\/code>).<br \/>\n<strong>Applies to:<\/strong> Message validation<br \/>\n<strong>Params:<\/strong> <code>string $strategy<\/code>, <code>array $settings<\/code>, <code>string $message<\/code><\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_blocked_words<\/code><\/strong><br \/>\nModify the blocked-words list before validation.<br \/>\n<strong>Applies to:<\/strong> Message validation<br \/>\n<strong>Params:<\/strong> <code>array $blocked_words<\/code>, <code>array $settings<\/code>, <code>string $message<\/code><\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_bypass_filter<\/code><\/strong><br \/>\nBypass filtering under custom conditions (VIP, internal users, etc.).<br \/>\n<strong>Applies to:<\/strong> Message validation<br \/>\n<strong>Params:<\/strong> <code>bool $bypass<\/code>, <code>string $message<\/code>, <code>WP_User|null $user<\/code>, <code>array $settings<\/code><\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_word_block_hit<\/code><\/strong> <em>(action)<\/em><br \/>\nTriggered when a word filter rule blocks a message.<br \/>\n<strong>Applies to:<\/strong> Message validation<br \/>\n<strong>Params:<\/strong> <code>string $blocked_word<\/code>, <code>string $message<\/code>, <code>string $strategy<\/code><\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_enrich_message_row<\/code><\/strong><br \/>\nExtend chat message data (add flags, metadata, user info, etc.).<br \/>\n<strong>Applies to:<\/strong> Backend DB \u2192 JSON output<br \/>\n<strong>Params:<\/strong> <code>array $message_row<\/code>, <code>WP_User|null $user<\/code><\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is licensed under the GPLv2 or later.<br \/>\nYou are free to use, modify, and distribute it under the same license.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Configure settings under <code>Settings \u2192 Chat Engine<\/code>.<\/li>\n<li>Add the <code>[init_chatbox]<\/code> shortcode anywhere you want the chatbox to appear.<\/li>\n<li>Optional: Visit <code>Chat Engine \u2192 Management<\/code> to moderate messages and users.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20guests%20send%20messages%3F\"><h3>Can guests send messages?<\/h3><\/dt>\n<dd><p>Yes, if enabled in the plugin settings under Basic Settings. Guests will be asked to enter a display name before sending messages.<\/p><\/dd>\n<dt id=\"how%20do%20i%20moderate%20messages%20and%20users%3F\"><h3>How do I moderate messages and users?<\/h3><\/dt>\n<dd><p>Go to <code>Chat Engine \u2192 Management<\/code> to view recent messages, ban\/unban users, and see chat statistics. You can search messages, delete inappropriate content, and ban users by IP or user account.<\/p><\/dd>\n<dt id=\"does%20it%20support%20real-time%20messaging%3F\"><h3>Does it support real-time messaging?<\/h3><\/dt>\n<dd><p>This plugin uses REST API with smart polling (3.5-10 second intervals) for broad compatibility. No WebSocket setup required, works on any hosting.<\/p><\/dd>\n<dt id=\"how%20many%20messages%20are%20stored%3F\"><h3>How many messages are stored?<\/h3><\/dt>\n<dd><p>Configurable in settings (default: 1000 messages). Old messages are automatically deleted when the limit is reached. You can also set up automatic cleanup based on age.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20chat%20appearance%3F\"><h3>Can I customize the chat appearance?<\/h3><\/dt>\n<dd><p>Yes, multiple ways:\n- Use the Custom CSS field in Advanced Settings\n- Override the template by placing <code>chatbox.php<\/code> in your theme's <code>init-chat-engine\/<\/code> folder\n- Use shortcode attributes for basic styling\n- Disable plugin CSS entirely and use your own<\/p><\/dd>\n<dt id=\"how%20does%20the%20ban%20system%20work%3F\"><h3>How does the ban system work?<\/h3><\/dt>\n<dd><p>Administrators can ban users by IP address or user account from the Management panel. Bans can be temporary (with expiration date) or permanent. Banned users see a clear message explaining their restriction.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20message%20frequency%3F\"><h3>Can I limit message frequency?<\/h3><\/dt>\n<dd><p>Yes, use the Rate Limiting setting to control how many messages users can send per minute (1-100 messages). This helps prevent spam and abuse.<\/p><\/dd>\n<dt id=\"is%20it%20translation-ready%3F\"><h3>Is it translation-ready?<\/h3><\/dt>\n<dd><p>Yes, the plugin is fully translation-ready with Vietnamese translation included. All text strings use proper WordPress internationalization functions.<\/p><\/dd>\n<dt id=\"how%20do%20i%20backup%20chat%20data%3F\"><h3>How do I backup chat data?<\/h3><\/dt>\n<dd><p>Chat messages are stored in your WordPress database in the <code>wp_init_chatbox_msgs<\/code> table. Use any WordPress backup plugin or database backup tool.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.6 \u2013 August 1, 2026<\/h4>\n\n<ul>\n<li>Enhancement: relative timestamps (\"x minutes...\") now also cover weeks, months, and years for older messages \u2014 previously capped at \"x days\"<\/li>\n<li>Change: dropped the \"ago\" suffix from relative timestamps to keep the UI compact (e.g. \"2 hours\" instead of \"2 hours ago\"), matching the convention used by most modern social apps. Translators: the <code>minutes_ago<\/code> \/ <code>hours_ago<\/code> \/ <code>days_ago<\/code> JS i18n strings were renamed to <code>unit_minutes<\/code> \/ <code>unit_hours<\/code> \/ <code>unit_days<\/code> \/ <code>unit_weeks<\/code> \/ <code>unit_months<\/code> \/ <code>unit_years<\/code> \u2014 please update custom translations accordingly<\/li>\n<li>Performance: polling now also accounts for whether the chatbox is actually scrolled into view (via <code>IntersectionObserver<\/code>), not just whether the browser tab itself is focused\/visible. If the chatbox is off-screen elsewhere on a long page, polling backs off further (up to 20s) and resumes instantly once it's back in view<\/li>\n<li>No changes to database schema or REST API response shape<\/li>\n<\/ul>\n\n<h4>1.3.5 \u2013 August 1, 2026<\/h4>\n\n<ul>\n<li>Fix: timestamps (\"x minutes ago\") could get stuck on \"now\" indefinitely (or show hours-old immediately after posting) on any site whose timezone setting differs from UTC. Caused by <code>created_at_iso<\/code> being computed from a local-time string without converting to true GMT first \u2014 now uses <code>get_gmt_from_date()<\/code> for a correct absolute timestamp. Only affects the new client-side timestamp feature below; does not affect message content, delivery, or ordering<\/li>\n<li>Performance: removed a redundant DB query that ran on every single poll request to refresh message timestamps (previously fetched + recomputed 50 rows every 3.5\u201310s per connected client)<\/li>\n<li>Performance: relative timestamps (\"x minutes ago\") are now computed client-side and refreshed locally every 60s, no extra network round-trip<\/li>\n<li>Performance: throttled the <code>last_activity<\/code> stat write so it's persisted at most once per minute instead of on every poll request, reducing DB write load on busy sites<\/li>\n<li>Performance: polling now pauses entirely (instead of just backing off) after 10 minutes of inactivity on a hidden\/unfocused tab, and resumes instantly on focus<\/li>\n<li>Performance: replaced the single-column <code>idx_is_deleted<\/code> index with a composite <code>(is_deleted, id)<\/code> index on the messages table \u2014 the composite index already covers every query the old one did, so keeping both only added write overhead. Existing sites are migrated automatically (old index dropped, new one added); new installs get the new index directly<\/li>\n<li>Performance: added object caching (<code>wp_cache_*<\/code>) to <code>GET \/messages<\/code> \u2014 polling requests with no new messages now skip the database entirely, and initial page loads share a single cached query across all visitors instead of querying per visitor. Effectiveness depends on your host providing a persistent object cache (see FAQ)<\/li>\n<li>Fix: <code>TRUNCATE<\/code>-based \"delete all messages\" and the automatic daily cleanup cron did not invalidate any cache before this release, so admin-side stats\/message list and (now) the frontend cache could show stale data after those actions. Both now invalidate all related caches<\/li>\n<li>Fix: the REST <code>\/admin\/moderate<\/code> delete action did not invalidate any cache before this release<\/li>\n<li>Tuned adaptive polling range to 3.5\u201310s (previously 2\u201312s) to match documented behavior and reduce request volume<\/li>\n<li>No changes to REST API response shape used by third-party integrations, except the internal <code>updated_messages<\/code> field (undocumented, poll-only) has been removed<\/li>\n<\/ul>\n\n<h4>1.3.4 \u2013 April 7, 2026<\/h4>\n\n<ul>\n<li>Fixed bulk delete and single message delete not working due to stale object cache<\/li>\n<li>Added <code>init_plugin_suite_chat_engine_clear_message_cache()<\/code> to properly invalidate message list, total count, and stats cache after every delete action<\/li>\n<li>Fixed nonce variable conflict between single action handler and cleanup handler that could cause cleanup verification to fail silently<\/li>\n<li>Added Screen Options support for configurable messages per page (default: 20, range: 5\u2013200)<\/li>\n<li>Per-page preference is saved per user via user meta \u2014 does not affect other admins<\/li>\n<li>Replaced WordPress screen option API with direct POST handler for reliable save behavior<\/li>\n<li>No changes to database schema, REST API, or existing chat flow<\/li>\n<\/ul>\n\n<h4>1.3.3 \u2013 March 30, 2026<\/h4>\n\n<ul>\n<li>Added expand\/collapse support for pinned message content in banner<\/li>\n<li>Allows viewing full pinned message without jumping to original message<\/li>\n<li>Stores full message content via <code>dataset<\/code> to avoid additional queries or requests<\/li>\n<li>Updated pinned banner to use absolute positioning to eliminate layout shift (CLS)<\/li>\n<li>Ensures stable layout when banner appears or updates<\/li>\n<li>Refined animation and interaction for smoother realtime UX<\/li>\n<li>No changes to API, database, or existing chat flow<\/li>\n<\/ul>\n\n<h4>1.3.2 \u2013 March 30, 2026<\/h4>\n\n<ul>\n<li>Introduced Pin Message feature for chat moderation (admin only)<\/li>\n<li>Allows pinning a single message to the top of the chat box (auto-replaces previous pin)<\/li>\n<li>Added hover-based Pin\/Unpin button on messages for admins with dynamic state handling<\/li>\n<li>Implemented pinned message banner with jump-to-message and highlight animation<\/li>\n<li>Added REST endpoints: POST \/pin and DELETE \/pin (nonce-verified, admin only)<\/li>\n<li><code>GET \/messages<\/code> now includes <code>pinned_message<\/code> for real-time sync across clients<\/li>\n<li>Pin state cached (5 minutes) with immediate invalidation on update<\/li>\n<li>Uses existing database (<code>init_chatbox_stats<\/code>) \u2014 no schema changes required<\/li>\n<li>Fully translation-ready via <code>InitChatEngineData.i18n<\/code><\/li>\n<li>Fully backwards-compatible and does not affect existing chat flow<\/li>\n<\/ul>\n\n<h4>1.3.1 \u2013 March 26, 2026<\/h4>\n\n<ul>\n<li>Performance optimization: added object caching for frequently called checks<\/li>\n<li><code>init_plugin_suite_chat_engine_has_messages()<\/code> now cached (24 hours) to reduce redundant DB queries during render<\/li>\n<li><code>init_plugin_suite_chat_engine_check_user_banned()<\/code> now uses 10-minute cache with multi-key strategy (user ID + IP)<\/li>\n<li>Implemented proper cache invalidation on ban\/unban actions to ensure real-time accuracy<\/li>\n<li>Added negative caching to eliminate repeated queries for non-banned users<\/li>\n<li>Internal optimization only \u2014 no UI or database changes<\/li>\n<li>Improves scalability and reduces database load under high traffic chat environments<\/li>\n<\/ul>\n\n<h4>1.3.0 \u2013 March 2, 2026<\/h4>\n\n<ul>\n<li>Introduced new <strong>Minimum Account Age Requirement<\/strong> (Security setting)<\/li>\n<li>Administrators can now require users to have an account older than <strong>X days<\/strong> before participating in chat<\/li>\n<li>Rule only applies when <strong>guest chatting is disabled<\/strong> (login required mode)<\/li>\n<li>Fully integrated across backend and frontend:\n\n<ul>\n<li>REST <code>\/send<\/code> endpoint now enforces account age validation via centralized security check<\/li>\n<li>Shared reusable function <code>init_plugin_suite_chat_engine_check_account_age_requirement()<\/code> ensures single source of truth<\/li>\n<\/ul><\/li>\n<li>Frontend UI enhancement:\n\n<ul>\n<li>Chat input is automatically disabled (<code>pointer-events: none; opacity: 0.6<\/code>) when account is too new<\/li>\n<li>Context-aware warning message displayed directly under the input area<\/li>\n<\/ul><\/li>\n<li>No impact on guest mode \u2014 public chats remain unaffected when guests are allowed<\/li>\n<li>Backwards-compatible with existing settings and database schema<\/li>\n<li>Security-focused enhancement to mitigate spam, clone accounts, and coordinated war activity<\/li>\n<\/ul>\n\n<h4>1.2.9 \u2013 February 13, 2026<\/h4>\n\n<ul>\n<li>Overhauled <strong>User Ban System<\/strong> with timezone-aware logic and optimized detection flow<\/li>\n<li>Fixed <strong>timezone inconsistency<\/strong> across ban creation, validation, and display layers\n\n<ul>\n<li><code>init_plugin_suite_chat_engine_ban_user()<\/code>: now uses <code>DateTime<\/code> with WordPress timezone for precise <code>expires_at<\/code> calculation<\/li>\n<li><code>init_plugin_suite_chat_engine_check_user_banned()<\/code>: replaced <code>NOW()<\/code> (GMT) with <code>current_time('mysql')<\/code> for accurate expiration checks<\/li>\n<li><code>init_plugin_suite_chat_engine_render_banned_message()<\/code>: switched to <code>date_i18n()<\/code> to prevent double timezone conversion<\/li>\n<\/ul><\/li>\n<li>Improved <strong>ban detection priority<\/strong> \u2014 user accounts are now checked first, IP fallback only when user is not banned\n\n<ul>\n<li>Prevents trivial IP-based bypass when logged-in users are banned<\/li>\n<li>Guest users (no <code>user_id<\/code>) continue to rely on IP-only detection<\/li>\n<\/ul><\/li>\n<li>Eliminated redundant dual-condition SQL queries (<code>user_id OR ip_address<\/code>) in favor of sequential checks<\/li>\n<li>Ban expiration timestamps now remain consistent across creation \u2192 validation \u2192 display (e.g., 48-hour ban created at 8:57 AM expires exactly at 8:57 AM, not 3:56 PM)<\/li>\n<li>Enhanced WP_DEBUG logging with detailed timestamp comparisons for admin troubleshooting<\/li>\n<li>Fully backwards-compatible with existing ban records and database schema<\/li>\n<li>Internal security hardening only; no UI or frontend behavioral changes<\/li>\n<\/ul>\n\n<h4>1.2.8 \u2013 November 11, 2025<\/h4>\n\n<ul>\n<li>Hotfix: fixed <strong>Load More (history pagination)<\/strong> message order becoming inconsistent\n\n<ul>\n<li><strong>API (<code>before_id<\/code>)<\/strong>: changed <code>ORDER BY id<\/code> from <strong>ASC \u2192 DESC<\/strong><\/li>\n<li><strong>Frontend (Load More)<\/strong>: removed <code>.reverse()<\/code>, now directly <code>prepend()<\/code> using API DESC order<\/li>\n<li><strong>Frontend (Initial load)<\/strong>: unchanged \u2014 reverse initial batch then <code>append()<\/code> (old \u2192 new)<\/li>\n<li><strong>Frontend (Realtime \/ after_id)<\/strong>: unchanged \u2014 API returns ASC, frontend <code>append()<\/code><\/li>\n<\/ul><\/li>\n<li>Result: timeline in the DOM remains strictly <strong>old \u2192 new<\/strong><\/li>\n<li>Minimal change \u2014 <strong>no DB schema changes, no UI changes<\/strong><\/li>\n<\/ul>\n\n<h4>1.2.7 \u2013 November 10, 2025<\/h4>\n\n<ul>\n<li>Fixed <strong>Load More \/ Pagination<\/strong> logic returning messages in reversed order<\/li>\n<li>API now consistently outputs messages in <strong>chronological ASC<\/strong> order across:\n\n<ul>\n<li>Initial load<\/li>\n<li>History pagination (<code>before_id<\/code>)<\/li>\n<li>Realtime polling (<code>after_id<\/code>)<\/li>\n<\/ul><\/li>\n<li>No frontend sorting required \u2014 FE only append\/prepend based on mode<\/li>\n<li>Ensures smooth timeline continuity when fetching older batches<\/li>\n<li>Internal change only; does <strong>not affect DB schema or UI behavior<\/strong><\/li>\n<\/ul>\n\n<h4>1.2.6 \u2013 October 20, 2025<\/h4>\n\n<ul>\n<li>Overhauled <strong>Word Filter Engine<\/strong> with hardened validation lifecycle<\/li>\n<li>Default strategy is now <strong>aggressive substring detection<\/strong> (catches <code>https:\/\/<\/code>, domains, encoded text, spam links, etc.)<\/li>\n<li>Fully respects existing Security settings:\n\n<ul>\n<li><code>Enable Word Filtering<\/code> toggle<\/li>\n<li><code>Blocked Words<\/code> textarea (one per line, supports Unicode)<\/li>\n<li><code>Word Filter Exceptions<\/code> (role-based whitelist: Administrators always bypass)<\/li>\n<\/ul><\/li>\n<li>Introduced new developer extension hooks (no new UI options):\n\n<ul>\n<li><code>init_plugin_suite_chat_engine_word_filter_strategy<\/code> \u2014 switch filter logic (<code>substring<\/code>, <code>word<\/code>, <code>regex<\/code>)<\/li>\n<li><code>init_plugin_suite_chat_engine_blocked_words<\/code> \u2014 modify blocked word list programmatically<\/li>\n<li><code>init_plugin_suite_chat_engine_bypass_filter<\/code> \u2014 bypass filtering based on custom logic (VIP, IP ranges, etc.)<\/li>\n<li><code>init_plugin_suite_chat_engine_word_block_hit<\/code> \u2014 event fired when a blocked word triggers<\/li>\n<\/ul><\/li>\n<li>Improved unicode normalization and internal cleanup of blocked-word lists (removes empty lines and <code>#comments<\/code>)<\/li>\n<li>Fully backwards-compatible \u2014 no disruption to existing settings or workflows<\/li>\n<li>Strengthened message security layer; prevents all major spam patterns (URL, Discord invite, Telegram link, obfuscated characters)<\/li>\n<\/ul>\n\n<h4>1.2.5 \u2013 October 18, 2025<\/h4>\n\n<ul>\n<li>Added new <strong>\u201cDelete All Messages\u201d<\/strong> button under <strong>Quick Actions<\/strong> in the management panel  <\/li>\n<li>Feature permanently removes all chat messages from the database with a single click  <\/li>\n<li>Protected by full security stack: admin-only capability, nonce verification, and SQL transaction safety  <\/li>\n<li>Resets all chat statistics (<code>total_messages<\/code>, <code>messages_today<\/code>, <code>active_users_today<\/code>, etc.) post-deletion  <\/li>\n<li>Includes detailed WP_DEBUG logging for admin audit trail (<code>who<\/code>, <code>when<\/code>)  <\/li>\n<li>UX-consistent with existing \u201cRun Cleanup Now\u201d button \u2014 executes instantly without JS dependency  <\/li>\n<li>Designed as a \u201cnuclear cleanup\u201d option for administrators managing public chat environments  <\/li>\n<li>No other functional or visual changes; this update focuses solely on administrative maintenance tools  <\/li>\n<\/ul>\n\n<h4>1.2.4 \u2013 October 18, 2025<\/h4>\n\n<ul>\n<li>Rebuilt <strong>FX Keyword Engine<\/strong> for per-message precision and zero-DOM overhead  <\/li>\n<li>Replaced global <code>TreeWalker<\/code> scanning with on-demand inline FX application during message render  <\/li>\n<li>Introduced new internal helpers: <code>getCompiledFXRules()<\/code> and <code>applyFXInMessageContainer()<\/code>  <\/li>\n<li>Rules are now compiled once and reused, ensuring stable performance even with large message histories  <\/li>\n<li>Removed redundant functions <code>initChatboxReplaceFXKeywords()<\/code>, <code>safeReplaceFXKeywordsInDOM()<\/code>, and <code>runFXIfHasMessages()<\/code>  <\/li>\n<li>Eliminated repeated DOM traversals after message batch rendering (initial load, polling, or history fetch)  <\/li>\n<li>Maintained full compatibility with external <code>runEffect()<\/code> logic and <code>FX_KEYWORDS<\/code> data structure  <\/li>\n<li>Improved keyword detection accuracy using unified regex alternation with named groups  <\/li>\n<li>Achieved significant runtime gains \u2014 messages now apply FX instantly upon creation  <\/li>\n<li>Internal optimization only; no visual or behavioral changes for end users  <\/li>\n<\/ul>\n\n<h4>1.2.3 \u2013 October 14, 2025<\/h4>\n\n<ul>\n<li>Added safe integration hook for cross-plugin Init FX Engine keyword replacement  <\/li>\n<li>Chat engine now auto-invokes external DOM keyword highlighter (<code>replaceFXKeywordsInDOM<\/code>) <strong>only when new messages are loaded<\/strong>  <\/li>\n<li>Added conditional wrapper with <code>typeof<\/code> check to prevent errors if the external plugin is not active  <\/li>\n<li>Introduced new internal helper: <code>safeRunFX()<\/code> for async idle execution (avoids blocking UI on message bursts)  <\/li>\n<li>Implemented new scoped function <code>initChatboxReplaceFXKeywords()<\/code> \u2014 optimized DOM scanning limited to <code>.init-chatbox-text<\/code> only  <\/li>\n<li>Rewrote FX keyword parser with <code>TreeWalker<\/code> for deep text traversal and regex stability  <\/li>\n<li>Eliminated duplicate link generation and ensured idempotent behavior (no double replacements)  <\/li>\n<li>Performance improved significantly when many messages are rendered or refreshed in batch  <\/li>\n<li>Internal enhancement only \u2014 no UI changes; improves plugin compatibility and runtime stability<\/li>\n<\/ul>\n\n<h4>1.2.2 \u2013 October 7, 2025<\/h4>\n\n<ul>\n<li><strong>Hotfix Release:<\/strong> removed redundant ban check inside <code>[init_chatbox]<\/code> shortcode  <\/li>\n<li>Eliminated secondary <code>init_plugin_suite_chat_engine_check_user_banned()<\/code> call (already handled by shortcode controller)  <\/li>\n<li>Prevented duplicate banned-message rendering and minor timezone mismatches  <\/li>\n<li>Simplified shortcode logic for better maintainability and consistency with ban middleware  <\/li>\n<li>No user-facing behavior change \u2014 internal backend cleanup only  <\/li>\n<\/ul>\n\n<h4>1.2.1 \u2013 October 7, 2025<\/h4>\n\n<ul>\n<li>Added role-based word filter exceptions in Security settings  <\/li>\n<li>New UI option: <strong>\u201cWord Filter Exceptions\u201d<\/strong> allows selecting user roles that can bypass blocked-word restrictions  <\/li>\n<li>Default exempt role: <strong>Administrator<\/strong> (others can be toggled via checkboxes)  <\/li>\n<li>Enhanced backend sanitization with strict role validation against existing WordPress roles  <\/li>\n<li>Updated message validation logic: users in exempt roles can send blocked words without triggering filter  <\/li>\n<li>Preserves security for guests and non-exempt roles (still subject to normal word filtering)  <\/li>\n<li>Improved localization: added Vietnamese translations for all new settings strings  <\/li>\n<\/ul>\n\n<h4>1.2.0 \u2013 October 2, 2025<\/h4>\n\n<ul>\n<li>Introduced new filter <code>init_plugin_suite_chat_engine_enrich_message_row<\/code> for extending message rows with custom user metadata  <\/li>\n<li>Enables themes\/plugins to attach extra flags (roles, VIP status, moderation rights, etc.) without touching core logic  <\/li>\n<li>Improves flexibility and forward-compatibility of the chat engine API, allowing richer integrations and UI features downstream  <\/li>\n<\/ul>\n\n<h4>1.1.9 \u2013 October 1, 2025<\/h4>\n\n<ul>\n<li>Added optional support for user profile links in chat messages<\/li>\n<li>Introduced <code>profile_url<\/code> field in API responses for registered users<\/li>\n<li>Provided frontend hook (<code>initChatEngineMessageElementHook<\/code>) to linkify display names if desired<\/li>\n<li>Feature is opt-in only; by default, names remain plain text for backward compatibility<\/li>\n<\/ul>\n\n<h4>1.1.8 \u2013 September 13, 2025<\/h4>\n\n<ul>\n<li>Hardened <code>\/send<\/code> security for logged-in users: strictly validate <code>X-WP-Nonce<\/code> and block cross-site POST attempts<\/li>\n<li>Sanitized inputs on the server before storage: apply <code>wp_strip_all_tags()<\/code> to both <code>message<\/code> and <code>display_name<\/code> (logged-in and guest paths)<\/li>\n<li>Rejected empty or non-visible messages: now fails fast on whitespace-\/zero-width-\/control-character\u2013only content<\/li>\n<li>Enforced length limits server-side (pre-insert) to prevent oversized payloads; behavior matches UI constraints<\/li>\n<li>Kept output defense-in-depth: responses continue to use <code>wp_kses_post()<\/code> for message rendering<\/li>\n<li>Tightened server-side anti-abuse: permission callback rate-limit check remains authoritative (in addition to any client throttling)<\/li>\n<\/ul>\n\n<h4>1.1.7 \u2013 September 13, 2025<\/h4>\n\n<ul>\n<li>Updated URL auto-linking logic to only apply when the link matches the current site domain<\/li>\n<li>Prevented external or mismatched-domain links from being auto-converted into <code>&lt;a&gt;<\/code> tags<\/li>\n<li>Reduced risk of spammy or malicious links being injected into formatted content<\/li>\n<li>Maintained full support for existing markdown-style text formatting features<\/li>\n<li>Improved overall content safety and formatting reliability<\/li>\n<\/ul>\n\n<h4>1.1.6 \u2013 September 1, 2025<\/h4>\n\n<ul>\n<li>Updated codebase to fully comply with WordPress Coding Standards (WPCS)<\/li>\n<li>Refactored inline documentation and formatting for better readability and maintainability<\/li>\n<li>Improved code consistency to align with official WordPress best practices<\/li>\n<li>Minor internal cleanups to enhance long-term stability<\/li>\n<\/ul>\n\n<h4>1.1.5 \u2013 August 4, 2025<\/h4>\n\n<ul>\n<li>Enhanced text formatting logic with smarter boundary detection for markdown-style syntax<\/li>\n<li>Improved formatting rules to require whitespace boundaries OR string start\/end positions<\/li>\n<li>Fixed formatting conflicts in code identifiers (e.g., <code>init_live_search<\/code> no longer formats \"live\")<\/li>\n<li>Resolved mathematical expression formatting issues (e.g., <code>1*2*3 = 6<\/code> no longer bolds \"2\")<\/li>\n<li>Updated regex patterns to use OR logic: format when either start OR end has whitespace boundary<\/li>\n<li>Enhanced support for edge cases like <code>*start* and *end*<\/code> now properly formats both words<\/li>\n<li>Maintained strict content validation: no spaces immediately after opening or before closing markers<\/li>\n<li>Added comprehensive capture group handling for multiple regex patterns<\/li>\n<li>Improved formatting accuracy while preserving backward compatibility<\/li>\n<li>Enhanced user experience with more intuitive and predictable text formatting behavior<\/li>\n<\/ul>\n\n<h4>1.1.4 \u2013 August 3, 2025<\/h4>\n\n<ul>\n<li>Added extensible hook system for enhanced message formatting and customization<\/li>\n<li>Introduced <code>window.initChatEngineFormatHook<\/code> for custom text formatting (supports sticker display and theme extensions)<\/li>\n<li>Added <code>window.initChatEngineMessageElementHook<\/code> for post-processing message elements after creation<\/li>\n<li>Enhanced message rendering pipeline to support external plugins and theme customizations<\/li>\n<li>Improved integration capabilities with Init Manga sticker system and other theme features<\/li>\n<li>Maintained backward compatibility while providing flexible extension points for developers<\/li>\n<li>Optimized hook execution with proper error handling to prevent chat interruptions<\/li>\n<\/ul>\n\n<h4>1.1.3 \u2013 August 01, 2025<\/h4>\n\n<ul>\n<li>Advanced request management system with AbortController to prevent duplicate API calls<\/li>\n<li>Real-time timestamp updates: message timestamps now refresh automatically (e.g., \"5 minutes\" \u2192 \"6 minutes\")<\/li>\n<li>Enhanced network error handling with exponential backoff and smart retry mechanism<\/li>\n<li>Improved connection stability for slow\/unstable networks with intelligent polling intervals<\/li>\n<li>Request deduplication system prevents message loading conflicts and UI inconsistencies<\/li>\n<li>Network status monitoring with automatic reconnection when connection is restored<\/li>\n<li>Better error recovery with consecutive error tracking and adaptive polling frequency<\/li>\n<li>Performance optimizations: reduced unnecessary API calls and improved memory management<\/li>\n<li>Enhanced user experience with clearer loading states and connection status indicators<\/li>\n<li>Robust offline\/online detection with proper fallback handling for network interruptions<\/li>\n<\/ul>\n\n<h4>1.1.2 \u2013 July 30, 2025<\/h4>\n\n<ul>\n<li>Complete dark mode system overhaul with comprehensive theme support<\/li>\n<li>Enhanced CSS variables system with dedicated light\/dark theme variable sets<\/li>\n<li>Full component coverage: dark mode now applies to all elements (messages, inputs, buttons, scrollbars, modals)<\/li>\n<li>Smart theme detection: auto-detect system dark mode preference with <code>@media (prefers-color-scheme: dark)<\/code><\/li>\n<li>Improved color contrast and accessibility with proper contrast ratios for dark theme<\/li>\n<li>Smooth theme transitions with 0.3s transition animations when switching between themes<\/li>\n<\/ul>\n\n<h4>1.1.1 \u2013 July 29, 2025<\/h4>\n\n<ul>\n<li>Resolved infinite scroll loop bug causing chat interface crashes<\/li>\n<li>Fixed load more button toggle conflicts in middle scroll positions (50-200px from top)<\/li>\n<li>Implemented debounced scroll handling with 100ms stabilization timer<\/li>\n<li>Added scroll direction tracking to prevent unnecessary auto-load triggers<\/li>\n<li>Improved scroll zone boundaries: auto-load (&lt;30px), manual button (30-200px), hide (&gt;300px)<\/li>\n<li>Enhanced state management to prevent redundant UI updates and layout thrashing<\/li>\n<li>Added proper timer cleanup on page unload to prevent memory leaks<\/li>\n<li>Optimized scroll performance with passive event listeners and reduced DOM queries<\/li>\n<li>Fixed scroll button visibility logic to prevent flickering during rapid scrolling<\/li>\n<li>Strengthened error handling for edge cases in scroll position calculations<\/li>\n<li>Added support for utility classes (uk-hidden, hidden, .ice-hidden)<\/li>\n<li>Automatic CSS framework detection and appropriate hide\/show class usage<\/li>\n<li>Fixed character counter not working for guest users due to duplicate ID names<\/li>\n<li>Improved \"Load more\" button display logic to be more generous but still safe (expanded zone to 400px)<\/li>\n<li>Faster UI response time: reduced debounce to 80ms, auto-load delay to 150ms<\/li>\n<\/ul>\n\n<h4>1.1.0 \u2013 July 29, 2025<\/h4>\n\n<ul>\n<li>Major admin panel upgrade with tabbed interface (Basic, Security, Advanced)<\/li>\n<li>Added full message management system with search and pagination<\/li>\n<li>Introduced user ban\/unban system with support for IP and user restrictions<\/li>\n<li>Built statistics dashboard with activity charts and engagement metrics<\/li>\n<li>Implemented rate limiting control (messages per minute) to prevent spam<\/li>\n<li>Added word filter system with custom blocked word list<\/li>\n<li>Included auto\/manual cleanup tools for old messages<\/li>\n<li>Redesigned admin UI with professional styling and responsive support<\/li>\n<li>Added connection status indicators and improved error handling<\/li>\n<li>Introduced REST API endpoints for admin moderation actions<\/li>\n<li>Implemented caching and nonce verification for all admin operations<\/li>\n<li>Added full settings validation and sanitization<\/li>\n<li>Full i18n support with .pot file and Vietnamese translation included<\/li>\n<\/ul>\n\n<h4>1.0.3 \u2013 July 20, 2025<\/h4>\n\n<ul>\n<li>Added support for inline message formatting: <code>*bold*<\/code>, <code>_highlight_<\/code>, <code>~strike~<\/code>, <code>^mark^<\/code>, and <code>italic<\/code><\/li>\n<li>Reused highlight style <code>.init-fx-highlight-text<\/code> from Init FX Engine (no duplicated CSS)<\/li>\n<li>Improved message rendering with safe HTML output<\/li>\n<li>Removed redundant <code>escapeHTML()<\/code> call to enable formatting<\/li>\n<li>Minor refactor of formatting logic<\/li>\n<\/ul>\n\n<h4>1.0.2 \u2013 July 19, 2025<\/h4>\n\n<ul>\n<li>Added user avatar rendering with fallback support<\/li>\n<li>Introduced blinking document title when new messages arrive<\/li>\n<li>Added anti-spam cooldown and click-lock on send button<\/li>\n<li>Refined guest name workflow and improved avatar integration<\/li>\n<li>Enhanced message HTML structure and cleaned up code<\/li>\n<\/ul>\n\n<h4>1.0.1 \u2013 July 19, 2025<\/h4>\n\n<ul>\n<li>Implemented smart polling system with adaptive intervals<\/li>\n<li>Added browser notification API support for new messages<\/li>\n<li>Improved scroll behavior and scroll-to-bottom logic<\/li>\n<li>Enhanced typing state detection and guest name handling<\/li>\n<li>Fixed message prepending offset issue and made UI tweaks<\/li>\n<\/ul>\n\n<h4>1.0.0 \u2013 July 18, 2025<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Core chat functionality using REST API (no WebSocket)<\/li>\n<li>Guest messaging support with basic identity system<\/li>\n<li>Admin settings for message limits and guest permissions<\/li>\n<li>Shortcode support with template override<\/li>\n<li>Scrollable history with smooth auto-scroll<\/li>\n<li>Optimistic message sending with fallback retry<\/li>\n<\/ul>","raw_excerpt":"A lightweight, real-time community chat system built with REST API and Vanilla JS. No jQuery, no reload. Full admin panel with moderation tools.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/248668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=248668"}],"author":[{"embeddable":true,"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/brokensmile2103-1"}],"wp:attachment":[{"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=248668"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=248668"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=248668"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=248668"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=248668"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=248668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}