{"id":362007,"date":"2026-09-02T06:07:18","date_gmt":"2026-09-02T06:07:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/faq-pilot\/"},"modified":"2026-09-02T06:06:54","modified_gmt":"2026-09-02T06:06:54","slug":"maqsy-faq-ai-chat","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/maqsy-faq-ai-chat\/","author":9617651,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Maqsy: FAQ Manager and AI Chat","header_author":"Sajjad Hashemian","header_description":"Manage FAQs as a custom post type, insert them anywhere via shortcode or block, and let an AI chat widget answer visitor questions grounded in that content.","assets_banners_color":"f8fdfc","last_updated":"2026-09-02 06:06:54","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/sijad\/maqsy-faq-ai-chat","header_author_uri":"https:\/\/hashemian.me","rating":0,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":0,"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":"sijad","date":"2026-09-02 06:06:54","revision":3677252}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3677252,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3677252,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3677252,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3677252,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"maqsy\/faq":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"maqsy\/faq","title":"FAQ","category":"widgets","icon":"sos","description":"Insert a Maqsy FAQ, with an optional template override.","keywords":["faq","questions","accordion"],"textdomain":"maqsy-faq-ai-chat","attributes":{"postId":{"type":"number","default":0},"template":{"type":"string","default":""}},"supports":{"html":false},"editorScript":"file:.\/index.js","style":"maqsy-public","render":"file:.\/render.php"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3677252,"resolution":"1","location":"assets","locale":"","width":1280,"height":1280},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3677252,"resolution":"2","location":"assets","locale":"","width":852,"height":644},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3677252,"resolution":"3","location":"assets","locale":"","width":1280,"height":720},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3677252,"resolution":"4","location":"assets","locale":"","width":1280,"height":720},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3677252,"resolution":"5","location":"assets","locale":"","width":1280,"height":720},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3677252,"resolution":"6","location":"assets","locale":"","width":1280,"height":720}},"screenshots":{"1":"The AI Chat Settings screen.","2":"The chat widget, shown in dark and light mode.","3":"Editing a FAQ: drag-to-reorder question\/answer pairs, with the ready-to-paste shortcode.","4":"The FAQs admin list.","5":"The FAQ block in the editor, set to the Accordion template.","6":"The FAQ block in the editor, set to the Simple template."}},"plugin_section":[],"plugin_tags":[1741,90336,2364,1643,1121],"plugin_category":[43],"plugin_contributors":[278769],"plugin_business_model":[],"class_list":["post-362007","plugin","type-plugin","status-publish","hentry","plugin_tags-accordion","plugin_tags-ai-chat","plugin_tags-chatbot","plugin_tags-faq","plugin_tags-structured-data","plugin_category-customization","plugin_contributors-sijad","plugin_committers-sijad"],"banners":{"banner":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/banner-772x250.png?rev=3677252","banner_2x":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/banner-1544x500.png?rev=3677252","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/icon-128x128.png?rev=3677252","icon_2x":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/icon-256x256.png?rev=3677252","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/screenshot-1.png?rev=3677252","caption":"The AI Chat Settings screen."},{"src":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/screenshot-2.png?rev=3677252","caption":"The chat widget, shown in dark and light mode."},{"src":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/screenshot-3.png?rev=3677252","caption":"Editing a FAQ: drag-to-reorder question\/answer pairs, with the ready-to-paste shortcode."},{"src":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/screenshot-4.png?rev=3677252","caption":"The FAQs admin list."},{"src":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/screenshot-5.png?rev=3677252","caption":"The FAQ block in the editor, set to the Accordion template."},{"src":"https:\/\/ps.w.org\/maqsy-faq-ai-chat\/assets\/screenshot-6.png?rev=3677252","caption":"The FAQ block in the editor, set to the Simple template."}],"raw_content":"<!--section=description-->\n<p>Maqsy lets you write and organise frequently asked questions as a dedicated\npost type, then place any FAQ on a page with a shortcode or a block. Each FAQ\noutputs clean, accessible markup plus <code>FAQPage<\/code> JSON-LD structured data so search\nengines can understand it.<\/p>\n\n<p>It also ships an <strong>optional<\/strong> AI chat widget: a small floating button that, when\na visitor clicks it, lazy-loads a chat UI whose answers are grounded in your\npublished FAQs. The chat feature is off by default and does nothing until you add\nan API key.<\/p>\n\n<h4>FAQ management<\/h4>\n\n<ul>\n<li>FAQs are a private custom post type (<code>maqsy<\/code>) \u2014 not publicly browsable on their own.<\/li>\n<li>Each FAQ holds an ordered list of question\/answer pairs, edited with a drag-to-reorder UI and the standard WordPress editor for answers.<\/li>\n<li>Two display templates: <strong>Simple<\/strong> (a definition list) and <strong>Accordion<\/strong> (WAI-ARIA disclosure pattern with keyboard support).<\/li>\n<\/ul>\n\n<h4>Placing a FAQ<\/h4>\n\n<p>Shortcode:<\/p>\n\n<pre><code>[maqsy id=\"123\"]\n[maqsy id=\"123\" template=\"accordion\"]\n<\/code><\/pre>\n\n<p>Block: insert the <strong>FAQ<\/strong> block, pick a FAQ, and optionally override the template.\nBoth render through the same code path.<\/p>\n\n<h4>Structured data<\/h4>\n\n<p>On singular views, each rendered FAQ emits <code>schema.org\/FAQPage<\/code> JSON-LD built from\nits question\/answer text. Output is limited to singular views (not archives,\nfeeds or search) to follow Google's one-FAQPage-per-URL guidance.<\/p>\n\n<h4>AI chat widget (optional)<\/h4>\n\n<p>Configure a provider and API key under <strong>FAQs \u2192 AI Chat Settings<\/strong> and turn on\n\"Enable AI chat\". The always-loaded launcher script is tiny; the chat\ninterface is only downloaded when a\nvisitor actually opens the chat. Answers are grounded in your published FAQs plus\nany site\/branding instructions you enter in settings, and the public endpoint is\nrate-limited per IP.<\/p>\n\n<p>The built-in provider works with any OpenAI-compatible <code>\/chat\/completions<\/code> API\n(OpenAI, OpenRouter, or a self-hosted compatible endpoint \u2014 you choose the base\nURL). Other plugins can register additional providers via the\n    maqsy_ai_providers filter.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin's AI chat feature is <strong>optional and disabled by default<\/strong>. It does\nnot contact any external service unless a site administrator enables the AI chat\nand saves an API key.<\/p>\n\n<p>When the AI chat is enabled and a visitor sends a message, the plugin makes a\nserver-to-server request to the AI API endpoint you configure (\"API base URL\" in\nsettings). By default this is OpenRouter (<code>https:\/\/openrouter.ai\/api\/v1<\/code>); you\ncan change it to OpenAI (<code>https:\/\/api.openai.com\/v1<\/code>) or any other\nOpenAI-compatible endpoint.<\/p>\n\n<p><strong>What is sent, and when:<\/strong><\/p>\n\n<ul>\n<li>On each visitor chat message: the visitor's message text, the text of your published FAQ posts, and any \"Site &amp; branding instructions\" you entered \u2014 sent to the configured endpoint together with your API key, so the model can generate a reply.<\/li>\n<li>When an administrator clicks \"Fetch models\" on the settings page: a request to the endpoint's <code>\/models<\/code> route, authenticated with the API key entered in the form.<\/li>\n<\/ul>\n\n<p>No data is sent to the plugin's author or to WordPress.org. The plugin does not\nadd analytics, tracking, or telemetry.<\/p>\n\n<p>Because you choose the endpoint, review the terms and privacy policy of whichever\nprovider you configure. For the two presets:<\/p>\n\n<ul>\n<li>OpenRouter \u2014 Terms: https:\/\/openrouter.ai\/terms ; Privacy: https:\/\/openrouter.ai\/privacy<\/li>\n<li>OpenAI \u2014 Terms: https:\/\/openai.com\/policies\/terms-of-use\/ ; Privacy: https:\/\/openai.com\/policies\/privacy-policy\/<\/li>\n<\/ul>\n\n<h3>Source code and build process<\/h3>\n\n<p>Compiled assets in <code>build\/<\/code> are generated from the human-readable sources\nincluded in this package:<\/p>\n\n<ul>\n<li><code>src\/<\/code> \u2014 admin, front-end and block scripts\/styles, built with <code>@wordpress\/scripts<\/code> (webpack). See <code>webpack.config.js<\/code>.<\/li>\n<li><code>chat-runtime\/src\/<\/code> \u2014 the lazy-loaded chat UI (React 19 + TypeScript), bundled with esbuild, and its Tailwind stylesheet. See <code>package.json<\/code> and <code>tailwind.config.js<\/code>.<\/li>\n<\/ul>\n\n<p>To build from source:<\/p>\n\n<pre><code>npm install\nnpm --prefix chat-runtime install\nnpm run build\n<\/code><\/pre>\n\n<p>Development repository: https:\/\/github.com\/sijad\/maqsy-faq-ai-chat<\/p>\n\n<p>Bundled third-party libraries in the chat bundle (all MIT-licensed): React and\nReactDOM, scheduler, use-sync-external-store, @floating-ui, @shadcn\/react, clsx,\ntailwind-merge.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>maqsy-faq-ai-chat<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the plugin through the Plugins screen in WordPress.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open the new <strong>FAQs<\/strong> menu and add a FAQ with one or more question\/answer pairs.<\/li>\n<li>Add <code>[maqsy id=\"\u2026\"]<\/code> (the shortcode is shown on the FAQ edit screen) to a page or post, or insert the <strong>FAQ<\/strong> block.<\/li>\n<li>(Optional) To enable the AI chat, go to <strong>FAQs \u2192 AI Chat Settings<\/strong>, enter an API key for an OpenAI-compatible provider, and turn on \"Enable AI chat\".<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20api%20key%20to%20use%20the%20plugin%3F\"><h3>Do I need an API key to use the plugin?<\/h3><\/dt>\n<dd><p>No. FAQ management, the shortcode, the block, and the structured-data output all\nwork with no configuration. An API key is only required for the optional AI chat\nwidget.<\/p><\/dd>\n<dt id=\"where%20does%20the%20ai%20chat%20get%20its%20answers%3F\"><h3>Where does the AI chat get its answers?<\/h3><\/dt>\n<dd><p>From the text of your published FAQ posts plus any instructions you add in\nsettings. The system prompt instructs the model not to invent facts that aren't\nin that content. See the \"External services\" section for exactly what is sent.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20without%20javascript%3F\"><h3>Does the plugin work without JavaScript?<\/h3><\/dt>\n<dd><p>The Simple template and the structured data are pure server-side HTML. The\nAccordion template's expand\/collapse needs JavaScript. The AI chat widget needs\nJavaScript.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20when%20i%20uninstall%3F\"><h3>What happens to my data when I uninstall?<\/h3><\/dt>\n<dd><p>Deleting the plugin removes all FAQ posts it created and its settings option.\nDeactivating does not delete anything.<\/p><\/dd>\n<dt id=\"can%20i%20add%20my%20own%20ai%20provider%3F\"><h3>Can I add my own AI provider?<\/h3><\/dt>\n<dd><p>Yes. Implement <code>Maqsy_AI_Provider<\/code> and add it via the <code>maqsy_ai_providers<\/code>\nfilter. The filters <code>maqsy_ai_system_prompt<\/code>, <code>maqsy_ai_before_request<\/code>\nand <code>maqsy_ai_after_response<\/code> are also available.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Manage FAQs as a post type, drop them in with a shortcode or block, and let an optional AI chat widget answer visitors from that content.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/362007","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=362007"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sijad"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=362007"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=362007"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=362007"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=362007"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=362007"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=362007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}