{"id":361626,"date":"2026-09-18T15:04:47","date_gmt":"2026-09-18T15:04:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-publisher-lite\/"},"modified":"2026-09-18T15:53:52","modified_gmt":"2026-09-18T15:53:52","slug":"ai-soft-auto-post-publisher-lite","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/ai-soft-auto-post-publisher-lite\/","author":17121342,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.27.0","stable_tag":"1.27.0","tested":"7.1.1","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"AI Soft - AI Auto Post Publisher Lite","header_author":"Tauhidul Hossain","header_description":"Generate WordPress drafts for blogs, news, business pages, reviews, tutorials, and guides from a source URL, pasted text, or a topic to discover, using your own Gemini, OpenAI, OpenRouter, Groq, or Claude API key. Includes categories, SEO fields, and local images.","assets_banners_color":"69529b","last_updated":"2026-09-18 15:53:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":32,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.26.0":{"tag":"1.26.0","author":"tauhidulhossain","date":"2026-09-18 15:04:26","revision":3702189},"1.27.0":{"tag":"1.27.0","author":"tauhidulhossain","date":"2026-09-18 15:53:52","revision":3702291}},"upgrade_notice":{"1.27.0":"<p>OpenAI and Claude no longer need a licence. Every provider now works with your own API key, and the licence system has been removed entirely.<\/p>","1.26.0":"<p>Topic discovery no longer needs a paid web search, so a provider running out of quota no longer stops the Auto Publisher. Adds an optional free-only publishing cycle, a working Minimum Source Quality filter, and a fix for queued runs stalling on hosts that block WP-Cron&#039;s loopback request.<\/p>","1.25.0":"<p>Fixes &quot;Request Timeout&quot; on Topic Discovery and the Auto Publisher: runs now happen in background batches instead of inside the page request. Adds a schedule panel, a Run Now button, cron self-heal, and keyword expansion.<\/p>","1.0.0":"<p>Initial public release.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3702309,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3702309,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3702309,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.26.0","1.27.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3702326,"resolution":"1","location":"assets","locale":"","width":1247,"height":962},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3702326,"resolution":"2","location":"assets","locale":"","width":1224,"height":958},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3702326,"resolution":"3","location":"assets","locale":"","width":1219,"height":957}},"screenshots":{"1":"The Generate Content screen: create a draft from a source URL, pasted text, or a topic to discover.","2":"The Categories screen: one-click category presets, region\/source focus, and trending-topic discovery.","3":"The Settings screen: choose your AI provider and describe your website."}},"plugin_section":[],"plugin_tags":[217063,181641,194533,171576,186],"plugin_category":[55],"plugin_contributors":[281465],"plugin_business_model":[],"class_list":["post-361626","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-content-generator","plugin_tags-content-automation","plugin_tags-openai","plugin_tags-post-generator","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-tauhidulhossain","plugin_committers-tauhidulhossain"],"banners":{"banner":"https:\/\/ps.w.org\/ai-soft-auto-post-publisher-lite\/assets\/banner-772x250.png?rev=3702309","banner_2x":"https:\/\/ps.w.org\/ai-soft-auto-post-publisher-lite\/assets\/banner-1544x500.png?rev=3702309","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ai-soft-auto-post-publisher-lite\/assets\/icon-256x256.png?rev=3702309","icon_2x":"https:\/\/ps.w.org\/ai-soft-auto-post-publisher-lite\/assets\/icon-256x256.png?rev=3702309","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ai-soft-auto-post-publisher-lite\/assets\/screenshot-1.png?rev=3702326","caption":"The Generate Content screen: create a draft from a source URL, pasted text, or a topic to discover."},{"src":"https:\/\/ps.w.org\/ai-soft-auto-post-publisher-lite\/assets\/screenshot-2.png?rev=3702326","caption":"The Categories screen: one-click category presets, region\/source focus, and trending-topic discovery."},{"src":"https:\/\/ps.w.org\/ai-soft-auto-post-publisher-lite\/assets\/screenshot-3.png?rev=3702326","caption":"The Settings screen: choose your AI provider and describe your website."}],"raw_content":"<!--section=description-->\n<p>AI Soft - AI Auto Post Publisher Lite helps you turn a source URL, pasted text, or a topic into a structured WordPress draft, using your own API key from Gemini, OpenAI, OpenRouter, Groq, or Claude.<\/p>\n\n<p>It is built to work with any WordPress site and any public post type, not just one kind of content. A job posting, a news update, a blog article, a business page, a product review, or a how-to guide are all detected and structured appropriately.<\/p>\n\n<p><strong>Main features<\/strong><\/p>\n\n<ul>\n<li>Bring your own AI provider key: Gemini, OpenAI, OpenRouter, Groq, or Claude. Gemini, OpenRouter, and Groq all offer a free tier to get started.<\/li>\n<li>Generate a draft from a source URL, pasted text, or by discovering trending topics.<\/li>\n<li>Works with any public post type on your site, not only the built-in Post type.<\/li>\n<li>One-click category presets for common website types (news\/magazine, job board, blog, business, education, and more), fully editable, with an option to override which taxonomy a post type uses.<\/li>\n<li>Automatic trending-topic discovery per category, with optional region and trusted-source focus, plus a daily auto-publish schedule.<\/li>\n<li>Local featured images generated automatically, with the option to use a source image instead.<\/li>\n<li>SEO fields (title, meta description, focus keyword) and automatic category\/tag assignment.<\/li>\n<li>A Default Author setting so scheduled and discovered posts are always assigned a real author.<\/li>\n<li>A short interactive guided tour on every settings screen.<\/li>\n<li>A Content Optimizer to analyze and improve the SEO\/content quality of existing posts and pages.<\/li>\n<\/ul>\n\n<p><strong>Bring your own key<\/strong><\/p>\n\n<p>This plugin does not include any AI service of its own and does not phone home anywhere for content generation. You provide your own API key for whichever provider you choose, and requests go directly from your WordPress site to that provider. See \"External services\" below for exactly what is sent and where.<\/p>\n\n<p><strong>Everything is included<\/strong><\/p>\n\n<p>Every feature \u2014 draft generation, topic discovery, the daily auto publisher, images, SEO fields, category presets and the Content Optimizer \u2014 works with any supported provider. Nothing is locked, nothing is time-limited, and there is no upgrade to buy.<\/p>\n\n<p>Gemini, OpenRouter, and Groq have free tiers, so you can run the plugin at no cost. OpenAI and Claude are billed by usage by those companies; the plugin treats all five the same and uses whichever keys you have saved.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to third-party services in order to generate content. It does not send any data to these services unless you actively use the corresponding feature.<\/p>\n\n<p><strong>AI provider (required to generate content)<\/strong><\/p>\n\n<p>You choose one AI provider in Settings and enter your own API key for it. When you generate a draft, the plugin sends your source text\/URL content and your site's brief description (from the Universal Website Profile) to that provider's API, and receives back the generated draft. No data is sent unless you click Generate, run Topic Discovery, run the daily Auto Publisher, or use the Content Optimizer.<\/p>\n\n<ul>\n<li>Google Gemini \u2014 https:\/\/ai.google.dev\/gemini-api\/terms \u2014 Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<li>OpenAI \u2014 https:\/\/openai.com\/api\/policies\/service-terms\/ \u2014 Privacy policy: https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<li>OpenRouter \u2014 https:\/\/openrouter.ai\/terms \u2014 Privacy policy: https:\/\/openrouter.ai\/privacy<\/li>\n<li>Groq \u2014 https:\/\/groq.com\/terms-of-use \u2014 Privacy policy: https:\/\/groq.com\/privacy-policy<\/li>\n<li>Anthropic Claude \u2014 https:\/\/www.anthropic.com\/legal\/commercial-terms \u2014 Privacy policy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<\/ul>\n\n<p><strong>Live model list sync (automatic when a key is saved)<\/strong><\/p>\n\n<p>To keep each provider's model dropdown current, the plugin periodically calls that provider's own model-listing endpoint (no content, just your API key) once you have saved a key for it: Google's <code>v1beta\/models<\/code>, OpenAI's <code>v1\/models<\/code>, Groq's <code>v1\/models<\/code>, and Anthropic's <code>v1\/models<\/code>. OpenRouter's <code>v1\/models<\/code> is also queried and does not require a key. This happens the first time you view Settings after saving a key, once daily in the background, and when you click \"Refresh Models Now.\" See the provider links above for terms\/privacy.<\/p>\n\n<p><strong>Search phrase suggestions (optional, on by default)<\/strong><\/p>\n\n<p>While \"Google Keyword Expansion\" is enabled in Settings, the plugin sends a category's seed topic to Google's public autocomplete endpoint before a Topic Discovery or Auto Publisher run, so discovery can search the phrasings people actually type. Only the seed topic text and your configured content language and target country are sent; no API key, no post content, and no site or visitor data. Results are cached for a day. Turning the setting off stops these requests entirely.<\/p>\n\n<ul>\n<li>Google autocomplete (https:\/\/suggestqueries.google.com) \u2014 Terms: https:\/\/policies.google.com\/terms \u2014 Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>Source page discovery via public search feeds (on by default)<\/strong><\/p>\n\n<p>Unless \"Discovery Source\" is set to \"AI providers only\", the plugin finds candidate source pages by reading Bing's public search RSS feeds \u2014 <code>https:\/\/www.bing.com\/search?...&amp;format=rss<\/code> and <code>https:\/\/www.bing.com\/news\/search?...&amp;format=rss<\/code> \u2014 before, or instead of, asking an AI provider to search the web. This needs no API key and no account. Only the search phrase is sent, built from the category's topic plus your configured content language and target country; no API key, no post content, and no site or visitor data. Results are cached for three hours. Setting \"Discovery Source\" to \"AI providers only\" stops these requests entirely.<\/p>\n\n<ul>\n<li>Bing search (https:\/\/www.bing.com) \u2014 Terms: https:\/\/www.microsoft.com\/en-us\/servicesagreement\/ \u2014 Privacy policy: https:\/\/privacy.microsoft.com\/en-us\/privacystatement<\/li>\n<\/ul>\n\n<p><strong>Source URL fetching (optional)<\/strong><\/p>\n\n<p>If you paste a source URL when generating a draft, the plugin fetches that page's public content directly from your WordPress server so it can be used as source material. This only happens for URLs you provide.<\/p>\n\n<p><strong>Image lookups (optional)<\/strong><\/p>\n\n<p>If a source image or reference image URL is provided, or an image search is used to find a relevant supporting image, the plugin may fetch images from the site hosting them, or from Wikimedia Commons (https:\/\/commons.wikimedia.org, no account\/key required), to download into your Media Library. This only happens when the corresponding image feature is enabled and in use.<\/p>\n\n<ul>\n<li>Wikimedia Commons \u2014 Terms of use: https:\/\/foundation.wikimedia.org\/wiki\/Policy:Terms_of_Use \u2014 Privacy policy: https:\/\/foundation.wikimedia.org\/wiki\/Policy:Privacy_policy<\/li>\n<\/ul>\n\n<p>If you enter an Unsplash or Pexels API key in Settings, the plugin searches that service for a relevant real photograph before falling back to Wikimedia Commons. This only happens when a key is configured.<\/p>\n\n<ul>\n<li>Unsplash \u2014 API guidelines: https:\/\/help.unsplash.com\/en\/articles\/2511245-unsplash-api-guidelines \u2014 Licence terms: https:\/\/help.unsplash.com\/en\/collections\/1463188-unsplash-license \u2014 Privacy policy (Unsplash is a Getty Images company): https:\/\/www.gettyimages.com\/company\/privacy-policy<\/li>\n<li>Pexels \u2014 https:\/\/www.pexels.com\/api\/documentation\/#api-terms-of-use \u2014 Privacy policy: https:\/\/www.pexels.com\/privacy-policy\/<\/li>\n<\/ul>\n\n<p>If you enter a Google API key and Programmable Search Engine ID in Settings, the plugin sends the post's image search terms to Google's Custom Search JSON API to find a relevant photograph, and downloads the selected image into your Media Library. This only happens when both values are configured.<\/p>\n\n<ul>\n<li>Google Programmable Search \u2014 https:\/\/developers.google.com\/custom-search\/v1\/site_restricted_api \u2014 Terms: https:\/\/policies.google.com\/terms \u2014 Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p><strong>AI-generated images (optional)<\/strong><\/p>\n\n<p>If you enable \"AI image fallback\" in Settings and no real photo can be found, the plugin sends a short text prompt describing the post's topic to OpenAI's image generation API (using the OpenAI key entered above) and downloads the resulting image into your Media Library. This only happens when this setting is enabled and no real photo was found. See the OpenAI terms\/privacy policy links above.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin zip from <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>, or install it directly from the WordPress.org plugin directory.<\/li>\n<li>Activate AI Soft - AI Auto Post Publisher Lite.<\/li>\n<li>Go to <strong>AI Soft - AI Auto Post Publisher Lite &gt; Settings<\/strong> and add your API key for Gemini, OpenAI, OpenRouter, Groq, or Claude.<\/li>\n<li>Go to <strong>AI Soft - AI Auto Post Publisher Lite &gt; Categories<\/strong> to set up your site's categories (optional but recommended).<\/li>\n<li>Go to <strong>AI Soft - AI Auto Post Publisher Lite &gt; Generate Content<\/strong> to create your first draft.<\/li>\n<\/ol>\n\n<p>A guided tour runs automatically the first time you visit each screen, and can be replayed any time from the \"Take the Tour\" button.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20to%20pay%20for%20anything%3F\"><h3>Do I need to pay for anything?<\/h3><\/dt>\n<dd><p>The plugin itself is free. Most AI providers (Gemini, OpenRouter, Groq) offer a free usage tier that is enough to get started; OpenAI and Claude are billed by the provider based on usage.<\/p><\/dd>\n<dt id=\"where%20is%20my%20api%20key%20stored%3F\"><h3>Where is my API key stored?<\/h3><\/dt>\n<dd><p>Only in your own WordPress site's database. It is never sent anywhere other than the AI provider you selected.<\/p><\/dd>\n<dt id=\"does%20this%20guarantee%20search%20ranking%20or%20ad-network%20approval%3F\"><h3>Does this guarantee search ranking or ad-network approval?<\/h3><\/dt>\n<dd><p>No. The plugin helps produce a structured, useful draft, but every post should be reviewed before publishing, the same as any other content workflow.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20for%20something%20other%20than%20a%20blog%3F\"><h3>Can I use this for something other than a blog?<\/h3><\/dt>\n<dd><p>Yes. It works with any public post type on your site, and the Categories page includes starting presets for several common website types (news\/magazine, job board, blog, business, and more), which you can edit freely.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.27.0 (Every provider works, with no licence)<\/h4>\n\n<ul>\n<li>Removed the licence requirement from the OpenAI and Claude provider fields. Both were present in the plugin but disabled unless a licence was active, which restricted functionality that shipped with the plugin. All five providers \u2014 Gemini, OpenAI, OpenRouter, Groq and Claude \u2014 now work with your own API key, with no upgrade to buy and nothing to activate.<\/li>\n<li>Removed the Premium Providers settings section, the licence key form, and every call to the AI Soft licence server. The plugin no longer contacts that server at all, and the corresponding entry has been removed from the External Services section.<\/li>\n<li>The provider dropdown no longer disables OpenAI and Claude or labels them \"(premium)\", saved keys for those providers are no longer discarded when the settings form is submitted, and both now join the automatic fallback chain like any other configured provider.<\/li>\n<li>Sanitised the request method and admin page checks reported by Plugin Check.<\/li>\n<\/ul>\n\n<h4>1.26.0 (Publishing that does not stop when a provider quota does)<\/h4>\n\n<ul>\n<li>Topic discovery no longer needs a paid web search. Every AI provider charges for searching the web - Gemini's grounding needs a live quota, Anthropic bills per search, and OpenRouter bills its web plugin per query even when the model itself is free - so the moment a key ran out of quota, discovery stopped and the Auto Publisher created nothing. The plugin now reads public search feeds instead, which need no key and no account. A new \"Discovery Source\" setting chooses between free feeds first (the default), free feeds only, and the previous provider-only behaviour.<\/li>\n<li>Added a Free Publishing Cycle: an optional second daily run that uses only free search feeds and free-tier models, with its own schedule, its own queue and its own status panel. It is switched off until you turn it on, and it does not change how your main Auto Publisher chooses providers.<\/li>\n<li>Added \"Use free providers only\", which keeps the plugin on tiers that refuse rather than bill. With it on, OpenAI and Claude are skipped even if a key is saved, and OpenRouter is restricted to models OpenRouter itself prices at zero.<\/li>\n<li>Fixed a queued run parking forever on hosts that block the loopback request WP-Cron depends on. The run was written and then nothing advanced it - the settings screen showed \"Topic 0 of N, no next slice is scheduled\" indefinitely. The screen now steps the queue along while it is open, and any admin page load re-arms a queue that has stopped moving.<\/li>\n<li>Minimum Source Quality now actually filters sources. It was only ever used to decide a finished post's status, so an admin told on screen to lower it in order to accept more sources could lower it and see no change at all. It is now the real threshold, and its minimum was lowered from 50 to 40 so the useful settings are reachable.<\/li>\n<li>Added a \"Source Strictness\" setting. On the previous behaviour, a site configured as a job board rejected any source that was not a government or education domain, an employer career page, or one of a few named boards - which rejected almost every genuine result. The new default scores an unknown page instead of refusing it, and the old behaviour is still available as \"strict\".<\/li>\n<li>A run is no longer thrown away by de-duplication working correctly. A batch cut off after creating a post left its topic unfinished; the retry was rightly refused as a duplicate of the post just created; three of those in a row counted as three failures and discarded every remaining topic. Duplicate results are now reported as duplicates, and the three-strike limit counts repeats of the same error rather than any three failures in a row.<\/li>\n<li>A topic is no longer started with too little time left in a batch to try a single provider, which previously looked exactly like a total provider outage and could abandon a long run after two topics.<\/li>\n<li>Groq's request timeout is now limited to the time the batch actually has. It was sending a fixed 90 seconds inside a 45-second batch, so Groq alone could use twice the budget and leave nothing for the providers after it.<\/li>\n<li>A scheduled run that cannot start because the previous one is still working now records that, instead of doing nothing and leaving the status panel showing an older run.<\/li>\n<li>Documented the Bing search feeds in the External services section.<\/li>\n<\/ul>\n\n<h4>1.25.0 (Long runs no longer time out; the Auto Publisher reports itself)<\/h4>\n\n<p>This entry covers 1.22.0 through 1.25.0, which were developed together and released as one update.<\/p>\n\n<ul>\n<li>Fixed \"Request Timeout - increase Connection Timeout\" on Topic Discovery and the Auto Publisher. Every topic used to be worked through inside the admin request that started the run, so on a site with a hundred-plus topics that request ran for many minutes - and what killed it was not PHP but the web server or proxy in front of it, which is why raising max_execution_time never helped. The button now validates, queues the work and returns immediately, and the topics are processed in short background batches.<\/li>\n<li>Added a Background Batch Length setting (15-120 seconds, default 45). The default sits under the 60-second connection timeout common on shared and IIS hosting; lower it if a run still times out, raise it only if your host allows longer requests.<\/li>\n<li>A run in progress now shows live progress on the Settings screen - topic N of M, percent complete, and posts created so far - instead of giving no sign of whether anything is happening.<\/li>\n<li>Added \"Process next batch now\" for hosts that block the loopback request WP-Cron depends on, so a queue can be stepped forward by hand, and \"Cancel run\" to clear a queue without touching the posts it already created.<\/li>\n<li>Added an Auto Publisher Schedule panel showing the next run time in your site's timezone, how many posts each run creates and what status they are saved as, with a warning when a run is more than two hours overdue and when DISABLE_WP_CRON is set - previously a schedule that had quietly stopped gave you nothing on screen to explain it.<\/li>\n<li>Added a \"Run Auto Publisher Now\" button that calls the real scheduled handler and records the same status, so a manual run reports exactly as a nightly one does.<\/li>\n<li>The daily schedule now repairs itself. It was only ever written when the settings form was saved, so an event lost to a host cron flush, a backup restore or a domain migration stayed lost until someone re-saved Settings.<\/li>\n<li>Added Google Keyword Expansion (on by default): each seed topic is widened into the longer phrasings Google autocomplete reports, which are the ones with real search traffic behind them. Suggestions that have lost the specific subject are discarded. No API key and no quota, results cached for a day, and an unreachable endpoint simply means seed topics are used exactly as before.<\/li>\n<li>Provider order is now vision-aware. When a source page has images, the providers that can actually read them are tried first; Groq has no vision path and its default model is text-only, so it drops to the back of the chain rather than producing a thin article about a document it could not see. Non-vision providers are reordered, never removed.<\/li>\n<li>Fixed posts having no images even though the source page clearly had one. An image URL had to end in a file extension to be accepted, which silently discarded most images on modern sites, where CDN and resizer paths carry none at all (\/media\/9f2c1a, \/cdn-cgi\/image\/width=1200\/photo). A URL the page itself declares as an image is now accepted and the downloaded bytes are content-type checked instead. GIF, AVIF, BMP and TIFF are recognised alongside JPG\/PNG\/WebP; data URIs, SVG, icons and page assets are still rejected.<\/li>\n<li>A generation run is now bounded. It previously ran every queued job unconditionally with no time limit and no failure counting, so one broken API key was reported a hundred times over. A run now stops after three consecutive failures, and a topic that fails is consumed by the batch that attempted it rather than being retried forever.<\/li>\n<li>Fixed three faults in the new queue found on review: a nightly scheduled run could overwrite - and silently discard - a long manual run still in progress; a queue stranded by a blocked loopback would have blocked every future run permanently, so a queue idle for 15 minutes is now treated as abandoned, reported as stalled and replaceable; and two overlapping batches could create every post twice, which a lock now prevents.<\/li>\n<li>Documented the Google autocomplete endpoint in the External services section.<\/li>\n<\/ul>\n\n<h4>1.21.0 (No picture is ever published twice, anywhere on the site)<\/h4>\n\n<ul>\n<li>A configured Pexels or Unsplash key was still repeating the same photos across unrelated posts. Every search asked only for page one of its results, and page one of a given query is identical for every article - so once the search term was the generic fallback, which is the same on every post, every article drew from the same handful of pictures. Searches now walk further into the results until they find photographs this site has never published, and stop as soon as they have enough, so the extra pages cost nothing when page one is sufficient.<\/li>\n<li>De-duplication is now permanent and site-wide rather than limited to a rolling window. Every picture the plugin attaches is stamped with its fingerprint in the media library, so \"already published\" stays true for the life of the site. The fast in-memory index still handles the common case; once a site passes 5,000 images, lookups that miss it fall through to the library rather than silently forgetting.<\/li>\n<li>Pictures published before de-duplication existed are now counted too. A one-time background pass, run in batches across admin page loads, registers the images already in your media library - so a photo used ten times before will not be used an eleventh.<\/li>\n<li>Search results are screened for duplicates before they are downloaded rather than after, so a repeat no longer costs the article one of its images. Posts now reach their configured image count instead of falling short whenever a duplicate turned up.<\/li>\n<\/ul>\n\n<h4>1.20.0 (Every post gets its own pictures; category details fill themselves in)<\/h4>\n\n<ul>\n<li>Fixed unrelated articles being illustrated with the identical set of pictures. The Wikimedia Commons relevance check switched itself off whenever the search term was made only of generic words - which is exactly what the guaranteed fallback term (\"business professionals\" plus your target country) is. Commons answered that generic query with the same top-ranked results every time, so a flooding report and a shareholder-governance piece both ran the same 19th-century factory engraving, studio portrait and trade advertisement. The relevance check now applies to the fallback term too, and archival material - advertisements, catalogues, lithographs, engraved portraits, plates - is rejected outright.<\/li>\n<li>Added a site-wide record of pictures already published, so the same file can no longer be attached to two different posts. Duplicate detection previously worked only within a single article. Pictures are matched both by source URL (checked before the download, so nothing is fetched twice) and by actual file content, which catches the same image served from two addresses. A post can still re-use its own pictures, so Regenerate Images keeps working.<\/li>\n<li>The post editor's Image Report now says when a post found no pictures because no Unsplash, Pexels or Google image key is configured and only Wikimedia Commons was available to search.<\/li>\n<li>Category discovery details now fill themselves in. Region, seed topics and trusted domains used to stay empty unless typed in by hand, so any category created by the preset list, by the WordPress Categories screen, or invented by the generator during discovery went into every trending run with nothing to focus it. Those fields are now populated automatically the moment a category is created - seed topics and trusted domains learned from what the site has already published in that category, falling back to a built-in subject library and your target country. Everything stays editable, and the automatic fill only ever writes into empty fields.<\/li>\n<li>Added \"Fill In Missing Details\" and \"Recompute All Details\" buttons to the Categories screen for categories that already existed.<\/li>\n<\/ul>\n\n<h4>1.19.0 (No scraped adverts, no unrelated stock images, clean captions)<\/h4>\n\n<ul>\n<li>Publisher adverts are no longer pulled in from source pages. Filtering them by filename never worked because their URLs are opaque CDN hashes, so on news, magazine, blog and business sites the plugin now takes only the source page's main image (its og:image) and ignores the rest of the page furniture - app-download panels, newsletter sign-up boxes and promo rails. Job boards still read every image on the page, where the notice itself is often not the main image.<\/li>\n<li>Wikimedia Commons results must now actually match the search. Commons matches loosely, and an article about streaming-content regulation was illustrated with a prehistoric trade-route diagram because both mentioned \"trade\". A result is now used only when its own file title shares a real word with the search term, and diagrams, charts, posters, scans and engravings are rejected outright. Where nothing matches, the article runs with fewer images rather than an unrelated one.<\/li>\n<li>Photo captions no longer print raw archive metadata. Credits containing a bare URL, a licence code, a date, multiple sentences or truncated scan notes - for example \"Photo: Archive.org ... Teacher's Guide. 1998. Blurred text improved b...\" - are discarded, and the picture runs with no caption instead. Only a short, clean, human credit line is published.<\/li>\n<\/ul>\n\n<h4>1.18.0 (Image Report panel on every generated post)<\/h4>\n\n<ul>\n<li>Added an \"AI Publisher: Image Report\" panel to the post editor sidebar, showing exactly what happened to that post's images: which were used, and which were rejected and why (download refused by the source site, below the minimum size, duplicate of one already used, or no search result). The plugin has always recorded this per post, but nothing displayed it, so a post with no featured image gave you nothing to act on.<\/li>\n<li>Every generated post now records a closing result line - whether a featured image was set and how many body images were added - so the panel confirms success as well as failure instead of being blank when things worked.<\/li>\n<\/ul>\n\n<h4>1.17.0 (Articles stop following the same template)<\/h4>\n\n<ul>\n<li>Every generated article was ending the same way - a \"What Happens Next\" section, then a Frequently Asked Questions block of about nine pairs, then an editorial note - which is what made a run of posts read as machine-produced. All three came from the generator's own instructions and have been changed.<\/li>\n<li>The Q&amp;A section is now optional. It is added only where readers would genuinely have unanswered questions (a process, eligibility, pricing, dates, technical detail) and is skipped for straightforward news such as an appointment or a results announcement. When included it carries only the 3 to 6 questions that need answering instead of being padded to a fixed count.<\/li>\n<li>\"What Happens Next\", \"About [Company]\" boilerplate, and closing editorial notes are now restricted to articles where they are actually warranted, rather than appended by habit.<\/li>\n<li>The news\/magazine structure rule no longer names its coverage points in a way the AI copied straight into headings. Sections must be named after the specific thing they discuss, so two articles can be told apart by their headings alone.<\/li>\n<\/ul>\n\n<h4>1.16.1 (Captions and alt text that read as human, and no scraped adverts)<\/h4>\n\n<ul>\n<li>Removed the generated caption boilerplate. Captions used to repeat the same phrase under every picture in an article and append \"(additional photo)\" to each one after the first - unmistakably machine-written. A picture now carries a caption only when there is a real credit to give (for example \"Photo: Unsplash\"), and otherwise carries none, which is how an ordinary article is laid out.<\/li>\n<li>Alt text no longer repeats the article title on every image or ends in \"(image 2)\". Each picture now uses its own description from the image source when one exists, so the alt text says what is actually in the photo. That is better for accessibility and for image search.<\/li>\n<li>Publisher house adverts scraped from a source page - \"download our app\" banners, sponsor and newsletter promos, ad-slot images - are no longer downloaded and published as if they illustrated the article.<\/li>\n<\/ul>\n\n<h4>1.16.0 (Image downloads that news sites accept, and real on-page SEO)<\/h4>\n\n<ul>\n<li>Fixed the most common reason an auto-created post had no featured image: image and source-page requests identified themselves as the plugin and sent no Referer, which news sites behind Cloudflare and image CDNs answer with 403. Requests now present a normal browser User-Agent and the article page as the Referer, exactly as a reader's browser would, so a source article's own photo can actually be downloaded. When the source page fetch itself was being blocked, the article's images were never even discovered - that is fixed by the same change. The Wikimedia Commons request deliberately keeps its identifying agent, as their User-Agent policy requires.<\/li>\n<li>On-page SEO: the generator was told to produce a focus keyword but never told to place it where Rank Math, Yoast, AIOSEO and SEOPress actually score it. It must now appear in the post title, SEO title, meta description, slug, opening sentences, at least one section heading, and the image alt text, at a natural density rather than repeated mechanically. Articles are also asked for a heading roughly every 200-300 words, paragraphs of at most four sentences, and lists where the content genuinely is a list.<\/li>\n<li>Generated articles now carry internal links. The AI is given a list of the site's recent published posts with their permalinks and asked to link 2-3 genuinely relevant ones inline, with descriptive anchor text - previously it had no way of knowing what else existed on the site, so every article published with none.<\/li>\n<\/ul>\n\n<h4>1.15.0 (More body images, and a featured image on every post)<\/h4>\n\n<ul>\n<li>Body images raised from up to 3 to up to 5 per post, spread through the article, so a generated post reads like a real magazine piece rather than a wall of text with one picture.<\/li>\n<li>A post should now always end up with a featured image. If no candidate met the full featured-image size bar, the plugin makes one final pass accepting a genuine photo that met the smaller body-image bar, instead of publishing with no featured image at all. Previously a source that only offered mid-size pictures produced body images but an empty featured slot.<\/li>\n<\/ul>\n\n<h4>1.14.2 (Optimizer \"not valid JSON\" fix)<\/h4>\n\n<ul>\n<li>Fixed \"Optimizer AI response was not valid JSON\" on normal-length posts. The optimizer asks the AI to return the whole rewritten article as JSON but capped its answer at 4,500 output tokens - less than a 1,200-2,000 word article needs - so the JSON was cut off mid-string and no amount of repairing could parse it. The limit is now 8,192 tokens for every provider.<\/li>\n<li>When a response is cut off at the limit, the plugin now says so instead of reporting invalid JSON. The old message suggested trying a stronger model, which never helped because the model was not the problem; the new message points at the actual fixes (SEO\/meta-only mode for long posts, a shorter post, or a model with a larger output limit).<\/li>\n<\/ul>\n\n<h4>1.14.1 (Content Optimizer no longer removes body images)<\/h4>\n\n<ul>\n<li>Fixed the Content Optimizer deleting every picture from inside an article. The cleaner used to strip all  tags unconditionally - correct while generating a new draft, where images are attached afterwards, but destructive when optimizing an existing post whose body already contains this plugin's images. Pictures hosted on your own site are now kept; only hotlinked external images are removed, and a figure whose image was removed no longer leaves an orphaned caption behind.<\/li>\n<li>Any image figure that the rewrite dropped is now restored into the optimized body, spaced through the article. The optimizer only ever shows the AI a text placeholder in place of each image, so a rewrite frequently came back without them. Figures already present are matched by image URL and left alone, so nothing is duplicated.<\/li>\n<li>The \"[local image]\" placeholder can no longer be published as literal text when the AI echoes it back instead of the image.<\/li>\n<\/ul>\n\n<h4>1.14.0 (Optimizer queue retries transient failures)<\/h4>\n\n<ul>\n<li>A Content Optimizer item is no longer abandoned the first time an AI provider has a bad moment. Previously each post was removed from the queue before processing and, on any error, only a failure counter was incremented - so a single \"experiencing high demand\", empty response, or request timeout permanently skipped that post.<\/li>\n<li>A failed post is now returned to the back of the queue and retried up to 3 times, which also spaces the retry out behind the remaining items. Errors no retry can fix - such as invalid credentials - still fail immediately rather than being attempted three times.<\/li>\n<li>The queue notice now reports how many retries have happened, so a retry is not mistaken for a stalled queue.<\/li>\n<\/ul>\n\n<h4>1.13.2 (Claude compatibility fix)<\/h4>\n\n<ul>\n<li>Fixed every Claude request failing with \"<code>temperature<\/code> is deprecated for this model.\" Anthropic removed the sampling parameters on Claude 4.7 and newer, so the plugin no longer sends <code>temperature<\/code> to Claude at all. Older Claude models only ever allowed it, so nothing is lost and newer models keep working as you select them. This affected Generate Content, the Claude key test, and the Content Optimizer.<\/li>\n<li>The Content Optimizer's Claude request now passes the model through the same sanitizer as every other Claude call, so a retired saved model self-heals to the current default instead of failing.<\/li>\n<\/ul>\n\n<h4>1.13.1<\/h4>\n\n<ul>\n<li>Added the AI Soft terms and conditions link to the External Services section.<\/li>\n<\/ul>\n\n<h4>1.13.0 (Unique prefix and working reference URLs)<\/h4>\n\n<ul>\n<li>Replaced the short \"aipl\" prefix with the distinctive \"aisoftapp\" prefix across all options, post meta, transients, cron hooks, admin page slugs, script handles, CSS class names, and the localised JavaScript object, so the plugin cannot collide with other plugins or themes.<\/li>\n<li>Replaced the Unsplash terms and privacy links, which were not publicly reachable, with the Unsplash API guidelines and licence pages plus the governing Getty Images privacy policy.<\/li>\n<li>Corrected the Groq terms and privacy URLs, which redirected, and removed a licence-server terms URL that did not resolve.<\/li>\n<li>Note for anyone who installed an earlier build: settings are stored under the new prefix, so re-enter your API keys and options once after updating.<\/li>\n<\/ul>\n\n<h4>1.12.0 (Premium providers)<\/h4>\n\n<ul>\n<li>Added an optional premium licence that unlocks the OpenAI and Claude provider fields. Without a licence those two fields are shown but disabled, with a short prompt explaining how to unlock them.<\/li>\n<li>The free version is unchanged and complete: draft generation, topic discovery, the daily auto publisher, images, SEO fields, category presets and the Content Optimizer all work with a Gemini, OpenRouter, or Groq key. Nothing is time-limited and no feature stops working.<\/li>\n<li>Deactivating or letting a licence lapse returns the site to the free providers instead of breaking publishing.<\/li>\n<li>Documented the AI Soft licence server and the Google Programmable Search image lookup in the External Services section.<\/li>\n<\/ul>\n\n<h4>1.11.0 (Plugin renamed; image reliability and alt text)<\/h4>\n\n<ul>\n<li>Renamed to \"AI Soft - AI Auto Post Publisher Lite\" (slug ai-soft-auto-post-publisher-lite) to give the plugin a distinctive name, per WordPress.org review feedback. Plugin headers, text domain, readme, main file, and folder name were all updated.<\/li>\n<li>Fixed featured images going missing on automatically created posts. Only the first photo candidate was ever attempted, so one dead link, hotlinking block, or a picture below the minimum size left the post with no featured image. Up to six candidates are now tried in turn.<\/li>\n<li>Fixed posts ending up with a single body image. The plugin requested exactly as many candidates as it needed, so every rejected picture reduced the count one-for-one. It now requests a surplus and keeps going until the configured number of images is actually attached.<\/li>\n<li>Image alt text is now always present and describes the article's subject. Alt text could previously be left empty (shown as an unset \"optional\" field in the Media Library) and every image on a post shared identical text, which hurt both accessibility and SEO. Each image now gets distinct, topic-related alt text.<\/li>\n<li>Media Library titles no longer append \"source image\" to every filename.<\/li>\n<\/ul>\n\n<h4>1.10.1 (Image size, placement, and no repeats)<\/h4>\n\n<ul>\n<li>Fixed icon-sized featured images. The featured-image path had no size check at all, so a source page's small header logo could become the post's featured image and render as a thumbnail. Featured images now require at least 600x315, and body images at least 400x250.<\/li>\n<li>Video-player placeholder graphics, logos, avatars, sprites, badges and spacer images are no longer downloaded as article photos, and extreme banner or skyscraper shapes are rejected.<\/li>\n<li>Photos are now spread through the article at even intervals instead of being stacked together right after the opening paragraph.<\/li>\n<li>The featured image is explicitly excluded from the post body, in addition to the existing duplicate-image check, so the same picture cannot appear twice.<\/li>\n<\/ul>\n\n<h4>1.10.0 (Images, captions, and admin wording)<\/h4>\n\n<ul>\n<li>Fixed the same photo appearing several times in one post. The featured image, the source image and the \"related\" image all resolved to a page's single hero\/og:image, and each was attached separately. Images are now compared by content, so a picture is only ever used once per post.<\/li>\n<li>The featured image is no longer repeated at the top of the article body on news, magazine, blog and business sites - the theme already displays it. Job boards still show the original notice inline, where readers need it.<\/li>\n<li>Removed the grey \"Visual Summary\" block. It re-processed a picture the post was already showing and published a washed-out duplicate of it.<\/li>\n<li>Photo captions now describe the article's subject instead of reading \"Original source notice or reference image\" or \"Additional source or reference image\". The \"Source \/ Reference Images\" and \"Related Image\" headings are gone; pictures sit inline as they would in any article.<\/li>\n<li>Added optional Google image search (Programmable Search). When a Google API key and Search Engine ID are saved, images are matched to the specific company, product or person in the article, which stock libraries cannot do. Unsplash, Pexels and Wikimedia Commons remain available as fallbacks.<\/li>\n<li>Article structure now has to follow the story: section headings must name what the section actually covers, and generic scaffolding headings (\"Background\", \"Overview\", \"Key Details\", \"Conclusion\") are rejected in the prompt. Articles are also asked to match the conventions of the site's own category and niche.<\/li>\n<li>Rewrote the settings screen wording. Field descriptions are now short, professional instructions rather than long implementation notes.<\/li>\n<\/ul>\n\n<h4>1.9.0 (Makes the plugin actually work on non-job sites)<\/h4>\n\n<p>This release fixes a set of leftovers from when the plugin only published job circulars. On a news, magazine, blog, or business site they combined to produce \"0 posts created\" with no clear reason.<\/p>\n\n<ul>\n<li>Topic Discovery no longer asks every AI provider to find \"recent public job circulars, LinkedIn job pages and bdjobs.com listings\" regardless of your Website Type. Asking for job listings on a general news topic made the model reply in prose instead of JSON, which surfaced as \"Discovery response did not include a valid items list.\" Discovery now searches for what your Website Type actually publishes, and all providers share one prompt builder.<\/li>\n<li>Fixed Claude discovery returning no results: Anthropic pauses long web-search turns with a \"pause_turn\" status, and the plugin treated that partial response as the final answer, so Claude's actual findings never arrived. It now continues the search to completion.<\/li>\n<li>Discovery JSON parsing accepts markdown-fenced and prose-wrapped responses, and reports \"found no recent sources\" separately from a malformed reply.<\/li>\n<li>Images: source-page photos are no longer rejected. Image scoring only recognised job-circular vocabulary, so ordinary article photos (including a page's own og:image) scored zero and were discarded, leaving posts with no featured image. Stock and Commons image searches also no longer append \"Bangladesh\" to every query - they use the article's own subject and your configured Target Country.<\/li>\n<li>Article body: internal links are kept. Every link was previously stripped from any post without an Apply URL, which is every news\/blog\/business post. Outbound links are still unwrapped.<\/li>\n<li>Fixed a text-cleaning rule that could delete the article's opening paragraphs. One \"Source:\" or \"Reference:\" anywhere in the body removed everything from the first paragraph up to it. Headings like \"Sources of growth\" are no longer deleted either.<\/li>\n<li>Publishing is no longer blocked by an unreachable quality bar: outside job boards every accepted source scores a flat 85, so a Minimum Source Quality above 85 forced every post to Pending Review. The bar is now capped to what a real source can score.<\/li>\n<li>SEO fields no longer contain \"Not applicable\": job placeholder values were treated as real data, producing focus keywords like \"Not applicable Not applicable circular\" in Rank Math\/Yoast. Job meta is stored empty on non-job posts, so the \"Job Posting Details\" box no longer appears on ordinary articles.<\/li>\n<li>Duplicate detection is stricter and only compares against posts this plugin generated - formulaic headlines were being rejected as duplicates of each other.<\/li>\n<li>Auto Publisher rotates through your categories instead of restarting at  &hellip;<\/li>\n<\/ul>","raw_excerpt":"Generate WordPress drafts from a source URL, pasted text, or a topic to discover, using your own AI provider key. Categories, SEO fields, images.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/361626","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=361626"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tauhidulhossain"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=361626"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=361626"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=361626"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=361626"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=361626"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=361626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}