{"id":284258,"date":"2026-03-23T17:02:16","date_gmt":"2026-03-23T17:02:16","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sparkplus\/"},"modified":"2026-07-13T19:31:39","modified_gmt":"2026-07-13T19:31:39","slug":"sparkplus","status":"publish","type":"plugin","link":"https:\/\/scn.wordpress.org\/plugins\/sparkplus\/","author":23454974,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.7","stable_tag":"1.1.7","tested":"7.0.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"SparkPlus","header_author":"olympagency","header_description":"Creates and populates custom post types with AI-generated content based on user keywords.","assets_banners_color":"1a212f","last_updated":"2026-07-13 19:31:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/olympagency.com\/","rating":0,"author_block_rating":0,"active_installs":60,"downloads":993,"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":"olympagency","date":"2026-03-23 17:07:19"},"1.0.1":{"tag":"1.0.1","author":"olympagency","date":"2026-03-23 17:09:56"},"1.0.2":{"tag":"1.0.2","author":"olympagency","date":"2026-03-29 14:56:15"},"1.0.3":{"tag":"1.0.3","author":"olympagency","date":"2026-04-15 09:14:52"},"1.0.4":{"tag":"1.0.4","author":"olympagency","date":"2026-04-21 14:15:18"},"1.0.5":{"tag":"1.0.5","author":"olympagency","date":"2026-04-22 14:40:56"},"1.0.6":{"tag":"1.0.6","author":"olympagency","date":"2026-04-22 14:42:57"},"1.0.7":{"tag":"1.0.7","author":"olympagency","date":"2026-04-29 12:41:02"},"1.0.8":{"tag":"1.0.8","author":"olympagency","date":"2026-05-04 11:52:20"},"1.0.9":{"tag":"1.0.9","author":"olympagency","date":"2026-05-07 16:00:50"},"1.1.0":{"tag":"1.1.0","author":"olympagency","date":"2026-05-07 16:41:14"},"1.1.1":{"tag":"1.1.1","author":"olympagency","date":"2026-05-11 13:43:29"},"1.1.2":{"tag":"1.1.2","author":"olympagency","date":"2026-05-11 15:10:57"},"1.1.3":{"tag":"1.1.3","author":"olympagency","date":"2026-05-11 17:25:50"},"1.1.4":{"tag":"1.1.4","author":"olympagency","date":"2026-05-12 18:49:37"},"1.1.5":{"tag":"1.1.5","author":"olympagency","date":"2026-06-10 10:09:57"},"1.1.6":{"tag":"1.1.6","author":"olympagency","date":"2026-07-13 17:22:27"},"1.1.7":{"tag":"1.1.7","author":"olympagency","date":"2026-07-13 19:31:39"}},"upgrade_notice":{"1.1.7":"<p>Fixes the Visitor Location database not downloading on hosts where WP-Cron \/ loopback requests are blocked. No configuration required.<\/p>","1.1.6":"<p>Adds the Visitor Location Olymp Tool (local, GDPR-friendly geolocation shortcodes) and lets image fields be generated to match a linked text field. No configuration required.<\/p>","1.1.5":"<p>Introduces the bundled Olymp Tools menu with the new Google Reviews shortcodes and reorganises the plugin into separate SparkPlus and Olymp Tools modules. Your existing SparkPlus settings and content are preserved.<\/p>","1.1.3":"<p>Fixes generation not starting on hosting environments (including SiteGround) that block server-to-itself HTTP requests. No configuration required.<\/p>","1.1.1 = into WP-Cron background jobs to resolve server timeout errors on slow API calls. No configuration required.":"","1.0.9":"<p>Generation requests are now asynchronous. The browser receives a job ID immediately and polls for the result. No configuration required, but custom integrations that rely on synchronous AJAX responses will need to be updated.<\/p>","1.0.7":"<p>Major update: multi-provider AI support added (Google Gemini, Anthropic Claude). The API Settings tab has been redesigned. Your existing OpenAI key is preserved. New API keys for Gemini or Anthropic can be added optionally.<\/p>","1.0.4":"<p>New SEO tab added to settings with optional RankMath integration for AI-generated meta titles and descriptions.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3502418,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3502418,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3502418,"resolution":"1544x500","location":"assets","locale":"","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3502418,"resolution":"772x250","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.1.5","1.1.6","1.1.7"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Load Keywords \u2014 Bulk-create posts from a list of keywords.","2":"Generation \u2014 Queue and generate AI content with real-time progress.","3":"Settings: CPT \u2014 Configure fields, word counts, and image settings per post type.","4":"Settings: General Context \u2014 Define your brand identity and content guidelines.","5":"Settings: API \u2014 Configure your OpenAI API key and model preferences."}},"plugin_section":[],"plugin_tags":[195933,8494,1487,194533,186],"plugin_category":[55],"plugin_contributors":[258454],"plugin_business_model":[],"class_list":["post-284258","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-content","plugin_tags-content-generation","plugin_tags-custom-post-types","plugin_tags-openai","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-olympagency","plugin_committers-olympagency"],"banners":{"banner":"https:\/\/ps.w.org\/sparkplus\/assets\/banner-772x250.png?rev=3502418","banner_2x":"https:\/\/ps.w.org\/sparkplus\/assets\/banner-1544x500.png?rev=3502418","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sparkplus\/assets\/icon-128x128.png?rev=3502418","icon_2x":"https:\/\/ps.w.org\/sparkplus\/assets\/icon-256x256.png?rev=3502418","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>SparkPlus lets you generate AI-powered content for any WordPress post type \u2014 including custom post types and Advanced Custom Fields (ACF). Simply provide keywords and context, and SparkPlus creates professionally written, SEO-optimized content with matching images in seconds. Pick your preferred AI engine per model \u2014 OpenAI or Google Gemini.<\/p>\n\n<p>The plugin also bundles <strong>Olymp Tools<\/strong>: a small collection of standalone marketing side-features (currently Google Reviews and Visitor Location) that live under their own admin menu and work completely independently of the AI content generator. Use as much or as little as you need.<\/p>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<ul>\n<li><strong>Bulk keyword loading<\/strong> \u2014 Enter one keyword per line to batch-create posts instantly. Duplicate detection prevents accidental duplicates.<\/li>\n<li><strong>AI text generation<\/strong> \u2014 Generate post titles, content, excerpts, and any ACF text\/textarea\/WYSIWYG field using the latest OpenAI and Google Gemini models.<\/li>\n<li><strong>AI image generation<\/strong> \u2014 Automatically generate featured images and ACF image fields. Images are converted to WebP for optimal performance.<\/li>\n<li><strong>Multi-provider support<\/strong> \u2014 Choose a different provider and model for text and for images. All AI calls are made directly from your browser to the provider, so no long-running server requests can time out.<\/li>\n<li><strong>Custom post type support<\/strong> \u2014 Works with all public post types including built-in posts, pages, and any registered CPTs.<\/li>\n<li><strong>ACF integration<\/strong> \u2014 Automatically discovers ACF field groups and generates content for text and image fields.<\/li>\n<li><strong>Internal linking pool<\/strong> \u2014 Populate ACF <code>post_object<\/code> (relationship) fields automatically from a pool of existing posts, so generated content links to related content on your site.<\/li>\n<li><strong>SEO integration<\/strong> \u2014 Optional RankMath support generates SEO meta titles and descriptions, plus a keyword-rich URL slug applied as the post permalink.<\/li>\n<li><strong>Reference &amp; related images<\/strong> \u2014 Attach a reference image to an image field (used as visual context by Gemini), or link an image field to a text field so the generated image correlates with that text.<\/li>\n<li><strong>Three-tier context system<\/strong> \u2014 Provide site-wide brand context, per-post-type instructions, and per-post specific context for highly targeted content.<\/li>\n<li><strong>Configurable formatting<\/strong> \u2014 Control which HTML elements (headings, lists, bold, italic, links) the AI may use in rich text fields.<\/li>\n<li><strong>Queue-based generation<\/strong> \u2014 Queue individual posts or batch-queue all posts, then generate sequentially with real-time progress.<\/li>\n<li><strong>Debug mode<\/strong> \u2014 Inspect the exact prompts sent to your AI provider and the raw API responses for full transparency.<\/li>\n<li><strong>Auto-publish<\/strong> \u2014 Optionally publish posts immediately upon keyword loading instead of saving as drafts.<\/li>\n<li><strong>Post editor integration<\/strong> \u2014 Edit keywords and additional context directly from the WordPress post editor via a sidebar meta box.<\/li>\n<li><strong>Multi-language support<\/strong> \u2014 Content is generated in your site's WordPress locale language. 50+ languages supported.<\/li>\n<\/ul>\n\n<p><strong>Settings &amp; Configuration:<\/strong><\/p>\n\n<ul>\n<li><strong>API Settings<\/strong> \u2014 Enter an API key per provider (OpenAI, Google Gemini) and choose your text and image models.<\/li>\n<li><strong>General Context<\/strong> \u2014 Define your company name, industry, target audience, USP, product advantages, and buying reasons to shape all generated content.<\/li>\n<li><strong>CPT Configuration<\/strong> \u2014 Per-post-type field mapping with individual enable\/disable toggles, custom descriptions\/prompts, word counts, image size\/quality settings, reference images, and image-to-text relations.<\/li>\n<li><strong>SEO<\/strong> \u2014 Enable RankMath meta title\/description generation and keyword-rich URL slugs.<\/li>\n<li><strong>Internal Linking<\/strong> \u2014 Enable and configure the linking pool used to fill relationship fields.<\/li>\n<li><strong>Reset<\/strong> \u2014 Easily reset all plugin settings or clear post meta data when needed.<\/li>\n<\/ul>\n\n<p><strong>Supported AI Models:<\/strong><\/p>\n\n<ul>\n<li>OpenAI (text): gpt-5.5, gpt-5.5-pro, gpt-5.4, gpt-5.2, gpt-5.1, gpt-5-mini, gpt-5-nano<\/li>\n<li>Google Gemini (text): Gemini 3.1 Pro, Gemini 3 Flash, Gemini 3.1 Flash Lite, Gemini 2.5 Pro \/ Flash \/ Flash Lite<\/li>\n<li>OpenAI (image): gpt-image-2, gpt-image-1.5, gpt-image-1, gpt-image-1-mini<\/li>\n<li>Google Gemini (image): Gemini 3.1 Flash Image, Gemini 3 Pro Image, Gemini 2.5 Flash Image<\/li>\n<\/ul>\n\n<h4>Bundled: Olymp Tools<\/h4>\n\n<p>Olymp Tools is a lightweight container for standalone features that are independent of the AI generator. Each tool has its own submenu under the <strong>Olymp Tools<\/strong> admin menu.<\/p>\n\n<p><strong>Google Reviews<\/strong> \u2014 Display your Google rating and review count anywhere via shortcodes:<\/p>\n\n<ul>\n<li><code>[olymp_google_reviews_average]<\/code> \u2192 average rating, e.g. \"4.6\"<\/li>\n<li><code>[olymp_google_reviews_count]<\/code> \u2192 total review count, e.g. \"128\"<\/li>\n<\/ul>\n\n<p>The values are fetched server-side from the Google Places API and cached; your API key never reaches the browser and the shortcodes keep serving the last known-good numbers if a refresh fails.<\/p>\n\n<p><strong>Visitor Location<\/strong> \u2014 Insert the current visitor's location into your copy for location-personalised marketing (e.g. \"Best offers near [olymp_visitor_city]\"):<\/p>\n\n<ul>\n<li><code>[olymp_visitor_city default=\"...\"]<\/code>, <code>[olymp_visitor_region ...]<\/code>, <code>[olymp_visitor_country ...]<\/code>, <code>[olymp_visitor_country_code ...]<\/code><\/li>\n<li><code>[olymp_visitor_location field=\"city,country\" separator=\", \" default=\"...\"]<\/code><\/li>\n<\/ul>\n\n<p>Lookups are 100% local against a DB-IP Lite City database stored on your server \u2014 the visitor's IP never leaves your site. Rendering is client-side, so it works correctly behind full-page caching.<\/p>\n\n<h4>Third-Party Services<\/h4>\n\n<p>SparkPlus and its bundled Olymp Tools connect to the following external services. Each connection only happens for the feature that uses it, and only once you have configured and used that feature.<\/p>\n\n<p><strong>AI content generation (SparkPlus)<\/strong><\/p>\n\n<p>When you trigger content generation, your request \u2014 including keywords, configured context (company name, industry, target audience, etc.), and field descriptions \u2014 is sent directly from your browser to the AI provider you selected for that model. You choose the provider per model and supply your own API key; usage is billed by that provider. Only the provider(s) you configure are ever contacted.<\/p>\n\n<ul>\n<li><strong>OpenAI, L.L.C.<\/strong> \u2014 Endpoint: <a href=\"https:\/\/api.openai.com\">https:\/\/api.openai.com<\/a> \u00b7 Terms: <a href=\"https:\/\/openai.com\/policies\/terms-of-use\">https:\/\/openai.com\/policies\/terms-of-use<\/a> \u00b7 Privacy: <a href=\"https:\/\/openai.com\/policies\/privacy-policy\">https:\/\/openai.com\/policies\/privacy-policy<\/a> \u00b7 Keys: <a href=\"https:\/\/platform.openai.com\/api-keys\">https:\/\/platform.openai.com\/api-keys<\/a><\/li>\n<li><strong>Google Gemini<\/strong> \u2014 Endpoint: <a href=\"https:\/\/generativelanguage.googleapis.com\">https:\/\/generativelanguage.googleapis.com<\/a> \u00b7 Terms: <a href=\"https:\/\/ai.google.dev\/gemini-api\/terms\">https:\/\/ai.google.dev\/gemini-api\/terms<\/a> \u00b7 Privacy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a> \u00b7 Keys: <a href=\"https:\/\/aistudio.google.com\/app\/apikey\">https:\/\/aistudio.google.com\/app\/apikey<\/a><\/li>\n<\/ul>\n\n<p><strong>Google Reviews tool (Olymp Tools)<\/strong><\/p>\n\n<p>If you configure the Google Reviews tool, your server (never the browser) requests your business's <code>rating<\/code> and <code>userRatingCount<\/code> from the Google Places API for the Place ID you enter. Your API key is stored on your server and used only for this request.<\/p>\n\n<ul>\n<li><strong>Service provider:<\/strong> Google LLC \u2014 Places API (New)<\/li>\n<li><strong>API endpoint:<\/strong> <a href=\"https:\/\/places.googleapis.com\/v1\/places\/\">https:\/\/places.googleapis.com\/v1\/places\/<\/a><\/li>\n<li><strong>Terms of use:<\/strong> <a href=\"https:\/\/cloud.google.com\/maps-platform\/terms\">https:\/\/cloud.google.com\/maps-platform\/terms<\/a><\/li>\n<li><strong>Privacy policy:<\/strong> <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<\/ul>\n\n<p><strong>Visitor Location tool (Olymp Tools)<\/strong><\/p>\n\n<p>If you enable the Visitor Location tool, your server downloads the free DB-IP Lite City database (a data file) and stores it locally. All IP-to-location lookups then happen entirely on your server \u2014 no visitor data or IP address is ever sent to DB-IP or any other third party.<\/p>\n\n<ul>\n<li><strong>Service provider:<\/strong> DB-IP \u2014 \"IP Geolocation by DB-IP\", licensed CC-BY 4.0<\/li>\n<li><strong>Download endpoint:<\/strong> <a href=\"https:\/\/download.db-ip.com\/free\/\">https:\/\/download.db-ip.com\/free\/<\/a><\/li>\n<li><strong>Website \/ terms:<\/strong> <a href=\"https:\/\/db-ip.com\/\">https:\/\/db-ip.com\/<\/a><\/li>\n<\/ul>\n\n<p>No data is sent to any of these services except as described above, and only when you configure and use the corresponding feature.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>sparkplus<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install directly through the WordPress plugin screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Navigate to <strong>SparkPlus &gt; Settings &gt; API Settings<\/strong> and enter an API key for at least one supported provider (OpenAI or Google Gemini).<\/li>\n<li>Configure your brand context under <strong>SparkPlus &gt; Settings &gt; General Context<\/strong>.<\/li>\n<li>Select your desired post type and configure fields under <strong>SparkPlus &gt; Settings &gt; CPT<\/strong>.<\/li>\n<li>Go to <strong>SparkPlus &gt; Load Keywords<\/strong> to create posts from keywords, then use <strong>SparkPlus &gt; Generation<\/strong> to generate AI content.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20api%20key%3F\"><h3>Do I need an API key?<\/h3><\/dt>\n<dd><p>Yes. SparkPlus needs your own API key for at least one supported AI provider \u2014 OpenAI or Google Gemini \u2014 to generate content. For OpenAI you can get one at <a href=\"https:\/\/platform.openai.com\/api-keys\">https:\/\/platform.openai.com\/api-keys<\/a>. Each provider bills API usage based on the model and volume, and you only pay the provider(s) you actually use.<\/p><\/dd>\n<dt id=\"which%20post%20types%20are%20supported%3F\"><h3>Which post types are supported?<\/h3><\/dt>\n<dd><p>All public post types are supported, including the built-in \"Post\" and \"Page\" types as well as any custom post types registered by your theme or other plugins.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20advanced%20custom%20fields%20%28acf%29%3F\"><h3>Does it work with Advanced Custom Fields (ACF)?<\/h3><\/dt>\n<dd><p>Yes. SparkPlus automatically detects ACF field groups assigned to your selected post type and lets you enable AI generation for individual text, textarea, WYSIWYG, and image fields.<\/p><\/dd>\n<dt id=\"what%20image%20format%20is%20used%20for%20generated%20images%3F\"><h3>What image format is used for generated images?<\/h3><\/dt>\n<dd><p>All AI-generated images are automatically converted to WebP format (quality 90) for optimal file size and performance, then added to your WordPress Media Library.<\/p><\/dd>\n<dt id=\"can%20i%20control%20the%20writing%20style%20and%20tone%3F\"><h3>Can I control the writing style and tone?<\/h3><\/dt>\n<dd><p>Yes. You can configure formal or informal addressing, provide brand context (company name, USP, target audience, etc.), add per-post-type instructions, and even provide per-post specific context. The AI uses all of this to tailor the content.<\/p><\/dd>\n<dt id=\"what%20languages%20are%20supported%3F\"><h3>What languages are supported?<\/h3><\/dt>\n<dd><p>Content is generated in the language matching your WordPress site locale. Over 50 languages are supported, including English, German, Spanish, French, and many more.<\/p><\/dd>\n<dt id=\"can%20i%20review%20what%20the%20ai%20generates%20before%20publishing%3F\"><h3>Can I review what the AI generates before publishing?<\/h3><\/dt>\n<dd><p>Yes. Posts created via keyword loading are saved as drafts by default. You can review and edit them before publishing. There is also an auto-publish option if you prefer immediate publishing.<\/p><\/dd>\n<dt id=\"how%20do%20i%20reset%20the%20plugin%3F\"><h3>How do I reset the plugin?<\/h3><\/dt>\n<dd><p>Go to <strong>SparkPlus &gt; Settings &gt; Reset<\/strong>. You can reset all plugin settings (API key, context, CPT configurations) or reset post meta data (keywords, context, generation timestamps) independently.<\/p><\/dd>\n<dt id=\"can%20i%20use%20a%20provider%20other%20than%20openai%3F\"><h3>Can I use a provider other than OpenAI?<\/h3><\/dt>\n<dd><p>Yes. SparkPlus supports OpenAI and Google Gemini. Add the API key for the provider you want to use under <strong>SparkPlus &gt; Settings &gt; API Settings<\/strong>, then pick the text and image model you prefer. You only need a key for the provider(s) you actually use.<\/p><\/dd>\n<dt id=\"what%20are%20olymp%20tools%3F\"><h3>What are Olymp Tools?<\/h3><\/dt>\n<dd><p>Olymp Tools is a small set of standalone marketing features bundled with the plugin, under their own <strong>Olymp Tools<\/strong> admin menu. They are completely independent of the AI content generator \u2014 currently they include Google Reviews and Visitor Location. You can ignore them entirely if you only want AI content generation.<\/p><\/dd>\n<dt id=\"how%20do%20the%20google%20reviews%20shortcodes%20work%3F\"><h3>How do the Google Reviews shortcodes work?<\/h3><\/dt>\n<dd><p>Enter a Google Places API key and your business's Place ID under <strong>Olymp Tools &gt; Google Reviews<\/strong>. Then place <code>[olymp_google_reviews_average]<\/code> or <code>[olymp_google_reviews_count]<\/code> anywhere in your content. The values are fetched server-side and cached, so your API key is never exposed and the numbers keep showing even if a refresh temporarily fails.<\/p><\/dd>\n<dt id=\"is%20the%20visitor%20location%20tool%20gdpr-friendly%3F\"><h3>Is the Visitor Location tool GDPR-friendly?<\/h3><\/dt>\n<dd><p>Yes. Visitor Location resolves the visitor's city\/region\/country entirely on your own server using a locally-stored DB-IP Lite City database. The visitor's IP address never leaves your site, and no third-party geolocation API is called at request time. Use shortcodes like <code>[olymp_visitor_city default=\"your area\"]<\/code> for location-personalised copy.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.7<\/h4>\n\n<ul>\n<li><strong>Visitor Location: reliable database download without WP-Cron.<\/strong> The DB-IP database no longer relies on a WP-Cron background job \u2014 which silently never ran on hosts that block loopback \/ server-to-self requests, so the database never downloaded there. The first-visitor lookup now downloads the database in the background of its own AJAX request (via <code>fastcgi_finish_request()<\/code>, so the visitor never waits), and the \"Refresh database now\" button downloads synchronously and reports success or the exact error immediately. Both paths share a single download routine.<\/li>\n<li>Fixed the download getting permanently stuck: once a background job had been queued but never fired, the manual refresh could no longer recover it.<\/li>\n<\/ul>\n\n<h4>1.1.6<\/h4>\n\n<ul>\n<li><strong>New Olymp Tool: Visitor Location.<\/strong> Show the current visitor's location in your content via shortcodes \u2014 <code>[olymp_visitor_city]<\/code>, <code>[olymp_visitor_region]<\/code>, <code>[olymp_visitor_country]<\/code>, <code>[olymp_visitor_country_code]<\/code>, and the combined <code>[olymp_visitor_location field=\"city,country\" separator=\", \"]<\/code> \u2014 for location-personalised marketing copy. Each shortcode takes a <code>default<\/code> fallback.<\/li>\n<li>IP-to-location lookups run 100% locally against a DB-IP Lite City database that the plugin downloads and stores on your server (via a background WP-Cron job, with an atomic swap and stale-while-revalidate refresh). The visitor's IP never leaves your site \u2014 no third-party geolocation API is called at request time.<\/li>\n<li>Rendering is client-side, so the shortcodes work correctly behind full-page caching: every visitor gets their own location instead of the first visitor's cached value.<\/li>\n<li><strong>SparkPlus: relate an image field to a text field.<\/strong> In CPT settings, an image field can now be linked to one of the post's text fields (title, excerpt, content, an ACF field, an ACF group sub-field, a RankMath meta field, or the URL slug) so the generated image is created to correlate with that text. The reference-image picker and the new relation selector now sit together in the field's prompt column.<\/li>\n<li>Fixed the <code>SPARKPLUS_VERSION<\/code> constant lagging one version behind the plugin header.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li><strong>Restructured into two independent modules under one plugin<\/strong>, loaded by a thin bootstrap: the SparkPlus AI content generator (in <code>sparkplus\/<\/code>) and the new Olymp Tools framework (in <code>olymp-tools\/<\/code>). Each module is self-contained and unaware of the other.<\/li>\n<li><strong>New Olymp Tools framework<\/strong> \u2014 a pluggable container for standalone side-features that are unrelated to AI generation, each exposed as its own submenu under a dedicated top-level <strong>Olymp Tools<\/strong> admin menu.<\/li>\n<li><strong>New Olymp Tool: Google Reviews.<\/strong> Two shortcodes output your Google rating and review count as bare numbers: <code>[olymp_google_reviews_average]<\/code> (e.g. \"4.6\") and <code>[olymp_google_reviews_count]<\/code> (e.g. \"128\"). Data is fetched server-side from the Google Places API and cached; a failed refresh keeps serving the last known-good values, and the API key never reaches the browser.<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li><strong>Architecture: full client-side AI orchestration.<\/strong> All AI API calls (text and image, for all providers) are now made directly from the browser. PHP no longer proxies any AI request. The server is a pure data layer: it supplies settings, field configs, existing content, and the linking pool on demand, then receives and saves the results the browser sends back.<\/li>\n<li>Removed the server-side generation pipeline entirely: <code>SparkPlus_Generation_Runner<\/code> (formerly <code>Generation_Cron<\/code>), <code>SparkPlus_Prompt_Builder<\/code>, <code>SparkPlus_OpenAI_API_Caller<\/code>, <code>SparkPlus_API_Manager<\/code>, and all three provider classes (<code>SparkPlusOpenAIProvider<\/code>, <code>SparkPlusAnthropicProvider<\/code>, <code>SparkPlusGeminiProvider<\/code>) have been deleted from PHP. None of the flush-early, transient polling, cron, or loopback-request infrastructure they relied on exists any longer.<\/li>\n<li>The <code>flush_early<\/code> \/ <code>fastcgi_finish_request()<\/code> approach introduced in 1.1.3 and the WP-Cron background dispatch introduced in 1.1.1 are gone. There is nothing left to time out on the server side.<\/li>\n<li><code>content-generator.php<\/code> \/ <code>SparkPlus_Content_Generator<\/code> split into three focused files: <code>generation-helpers-trait.php<\/code> (shared field-map and settings helpers), <code>generation-meta.php<\/code> \/ <code>SparkPlus_Generation_Meta<\/code> (data provider: supplies all generation inputs to the client), and <code>generation-saver.php<\/code> \/ <code>SparkPlus_Generation_Saver<\/code> (result saver: persists AI output to the database).<\/li>\n<li>New JS module <code>sparkplus-providers.js<\/code>: browser-side provider classes (<code>SparkPlusOpenAIProvider<\/code>, <code>SparkPlusAnthropicProvider<\/code>, <code>SparkPlusGeminiProvider<\/code>) and <code>SparkPlusProviderFactory<\/code> mirror the deleted PHP provider layer.<\/li>\n<li>New JS module <code>sparkplus-prompt-builder.js<\/code>: browser-side <code>SparkPlusPromptBuilder<\/code> mirrors the deleted PHP prompt builder, constructing text and image prompts entirely in the browser.<\/li>\n<li>OpenAI model quirks handled client-side: <code>gpt-5.5<\/code> omits the <code>temperature<\/code> parameter (API only accepts the default); <code>gpt-5.5-pro<\/code> routes to the <code>\/v1\/responses<\/code> endpoint with the correct <code>input<\/code> \/ <code>text.format<\/code> shape and its response is parsed from <code>output[].content[].text<\/code>.<\/li>\n<li>Debug panel tabs (Last Text Prompt, Last Image Prompt, Last Text API Response, Last Image API Response) now populate correctly: <code>generation.js<\/code> emits <code>build_text_prompt<\/code>, <code>build_image_prompt<\/code>, and <code>full_api_response<\/code> entries at the right points in the client-side flow.<\/li>\n<li>Last Image API Response tab displays the saved WordPress media URL as a visual image preview above the raw JSON, using <code>wp_get_attachment_url()<\/code> returned by the save endpoint.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Replaced WP-Cron background dispatch with a direct <code>flush_early<\/code> approach: the AJAX handler sends the job ID to the browser immediately via <code>fastcgi_finish_request()<\/code>, then runs the API call inline. This eliminates the server-to-itself loopback HTTP request that WP-Cron required, which was blocked on some hosting environments (including SiteGround).<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Added changelog entries for all previous versions.<\/li>\n<li>Fixed js\/css caching problem by increasing the SPARKPLUS_VERSION constant.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Moved AI generation work into WP-Cron background jobs to eliminate server-side timeout errors on long API calls.<\/li>\n<li>Generation cron callbacks are now registered on every request type (including wp-cron.php) via a dedicated <code>generation-cron.php<\/code> class.<\/li>\n<li>AJAX handlers for text and image generation now return a job ID immediately and trigger cron asynchronously.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Debug log entries are now streamed to the client continuously during generation rather than delivered all at once at the end.<\/li>\n<li>The server writes each debug entry to the transient in real time; the polling client reads and displays new entries incrementally on every poll.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Generation requests (<code>generate_text<\/code>, <code>generate_image<\/code>) now return a job ID immediately and close the HTTP connection early.<\/li>\n<li>The actual API work runs after the response is flushed, with the result stored in a WordPress transient.<\/li>\n<li>The JavaScript client polls a new <code>check_job_status<\/code> endpoint every 2 seconds until the job completes.<\/li>\n<li>This eliminates 504 gateway timeout errors caused by long-running API calls holding open HTTP connections.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Added URL slug generation: a new \"URL Slug\" field can be enabled in the SEO settings tab and will appear in the CPT field list.<\/li>\n<li>The AI generates a keyword-rich URL slug and applies it as the post permalink (<code>post_name<\/code>).<\/li>\n<li>Added reference image support for image fields: a media picker allows attaching a reference image per image field (used by Gemini as inline image data in the prompt).<\/li>\n<li>Image settings layout in CPT tab reorganised into two rows (Aspect Ratio + WebP % on row 1; Generation Quality + Resolution on row 2).<\/li>\n<li>Resolution dropdown labels simplified (Low \/ Medium \/ High).<\/li>\n<li>Tooltip icons added to all four image settings.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Added multi-AI-provider support: Google Gemini and Anthropic Claude can now be used alongside OpenAI.<\/li>\n<li>New abstract provider base class with concrete implementations for OpenAI, Gemini, and Anthropic.<\/li>\n<li>API Settings tab redesigned to show separate API key fields per provider, grouped by provider section.<\/li>\n<li>Deprecated model detection: a warning is shown in settings if a previously saved model is no longer supported.<\/li>\n<li>Added <code>util.php<\/code> with shared helper functions including <code>sparkplus_get_supported_models()<\/code> and <code>sparkplus_get_model_provider()<\/code>.<\/li>\n<li>Content generator refactored to route all API calls through the new <code>SparkPlus_API_Manager<\/code> factory.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Version bump \/ compatibility update (no functional changes).<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Added optional parent post selection to the keyword loader: when a published post of the selected post type exists, a dropdown allows setting all newly created posts as children of a selected parent.<\/li>\n<li>Draft parents are shown in the parent post dropdown.<\/li>\n<li>Prompt builder updated with minor SEO title instruction improvements.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Added SEO tab in settings with RankMath integration: enables AI generation for RankMath title and description meta fields.<\/li>\n<li>Added Taxonomies tab in settings (foundation for taxonomy term generation).<\/li>\n<li>Added <code>post_object<\/code> ACF field type support in the CPT field list, with a \"Nr. of Posts\" option instead of word count.<\/li>\n<li>Warning shown in CPT settings when a <code>post_object<\/code> field is enabled but the linking pool is not active.<\/li>\n<li><code>true_false<\/code> ACF fields now correctly hide the options column in the CPT field table.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Added <code>post_object<\/code> ACF field type detection inside group sub-fields in the CPT settings UI.<\/li>\n<li><code>true_false<\/code> sub-fields inside groups now correctly hide the options column.<\/li>\n<li>Linking pool enabled state is checked and shown as a warning for <code>post_object<\/code> sub-fields when the pool is disabled.<\/li>\n<li>Prompt builder improvements for field instruction generation.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Improved debug panel: added <code>source<\/code> parameter (<code>client<\/code> \/ <code>server<\/code>) to all debug entries and debug UI.<\/li>\n<li>Centralised error handling: all generation errors now show a WordPress admin notice with the post keyword\/ID in addition to logging to the debug panel.<\/li>\n<li>Error notices from previous runs are cleared when a new generation starts.<\/li>\n<li>Debug panel CSS improvements.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Internal test release \/ version bump (no functional changes).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Bulk keyword loading with duplicate detection.<\/li>\n<li>AI text generation for post titles, content, excerpts, and ACF fields.<\/li>\n<li>AI image generation with automatic WebP conversion.<\/li>\n<li>Support for all public post types and ACF field groups.<\/li>\n<li>Three-tier context system (site-wide, per-CPT, per-post).<\/li>\n<li>Configurable WYSIWYG formatting rules.<\/li>\n<li>Queue-based generation with debug mode.<\/li>\n<li>Post editor meta box for keyword and context editing.<\/li>\n<li>Full settings management with reset capability.<\/li>\n<\/ul>","raw_excerpt":"AI content generation for any WordPress post type \u2014 text and images via OpenAI or Google Gemini, plus a bundled set of Olymp marketing tools.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/284258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=284258"}],"author":[{"embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/olympagency"}],"wp:attachment":[{"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=284258"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=284258"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=284258"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=284258"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=284258"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/scn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=284258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}