{"id":167615,"date":"2022-12-14T22:07:04","date_gmt":"2022-12-14T22:07:04","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/martincv-openai-blog-post\/"},"modified":"2026-07-30T19:22:57","modified_gmt":"2026-07-30T19:22:57","slug":"martincv-openai-blog-post","status":"publish","type":"plugin","link":"https:\/\/hu.wordpress.org\/plugins\/martincv-openai-blog-post\/","author":15062275,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"2.0.0","tested":"7.1","requires":"5.9","requires_php":"7.4","requires_plugins":null,"header_name":"MartinCV AI Blog Post","header_author":"MartinCV","header_description":"Creates blog posts using the OpenAI API","assets_banners_color":"5a4aad","last_updated":"2026-07-30 19:22:57","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.martincv.com\/whp-donate","header_plugin_uri":"","header_author_uri":"https:\/\/www.martincv.com","rating":5,"author_block_rating":0,"active_installs":10,"downloads":2447,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"martin7ba","date":"2024-07-17 11:10:21"},"1.1":{"tag":"1.1","author":"martin7ba","date":"2024-12-11 12:04:05"},"2.0.0":{"tag":"2.0.0","author":"martin7ba","date":"2026-07-30 19:22:57"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":2834084,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":2834084,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":2834084,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":2834084,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0","1.1","2.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":2834084,"resolution":"1","location":"assets","locale":"","width":990,"height":608},"screenshot-2.png":{"filename":"screenshot-2.png","revision":2834084,"resolution":"2","location":"assets","locale":"","width":253,"height":360},"screenshot-3.png":{"filename":"screenshot-3.png","revision":2834084,"resolution":"3","location":"assets","locale":"","width":1530,"height":968}},"screenshots":{"1":"<p>The Settings screen for the plugin.<\/p>","2":"<p>The AI options in the Add \/ Edit post screen.<\/p>","3":"<p>Generated Post<\/p>"}},"plugin_section":[],"plugin_tags":[2353,229563,224606,194533,171576],"plugin_category":[],"plugin_contributors":[147632],"plugin_business_model":[],"class_list":["post-167615","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-claude","plugin_tags-gemini","plugin_tags-openai","plugin_tags-post-generator","plugin_contributors-martin7ba","plugin_committers-martin7ba"],"banners":{"banner":"https:\/\/ps.w.org\/martincv-openai-blog-post\/assets\/banner-772x250.png?rev=2834084","banner_2x":"https:\/\/ps.w.org\/martincv-openai-blog-post\/assets\/banner-1544x500.png?rev=2834084","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/martincv-openai-blog-post\/assets\/icon-128x128.png?rev=2834084","icon_2x":"https:\/\/ps.w.org\/martincv-openai-blog-post\/assets\/icon-256x256.png?rev=2834084","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/martincv-openai-blog-post\/assets\/screenshot-1.png?rev=2834084","caption":"<p>The Settings screen for the plugin.<\/p>"},{"src":"https:\/\/ps.w.org\/martincv-openai-blog-post\/assets\/screenshot-2.png?rev=2834084","caption":"<p>The AI options in the Add \/ Edit post screen.<\/p>"},{"src":"https:\/\/ps.w.org\/martincv-openai-blog-post\/assets\/screenshot-3.png?rev=2834084","caption":"<p>Generated Post<\/p>"}],"raw_content":"<!--section=description-->\n<p>Type a post title, click <strong>Generate Post<\/strong>, and get a complete, well-structured blog post inserted straight into your editor \u2014 with AI-generated images saved to your Media Library. Version 2.0 turns this plugin from an OpenAI-only tool into a <strong>full multi-provider AI writing assistant<\/strong>:<\/p>\n\n<ul>\n<li><strong>OpenAI<\/strong> \u2014 the GPT-5.6 family (Sol, Terra, Luna) plus still-supported classics like GPT-4.1, GPT-4o, and GPT-3.5 Turbo, with GPT Image 2 and DALL-E 3 for images.<\/li>\n<li><strong>Anthropic Claude<\/strong> \u2014 Claude Opus 5, Sonnet 5, and Haiku 4.5, plus legacy Claude 4.x models.<\/li>\n<li><strong>Perplexity<\/strong> \u2014 the Sonar family, with an optional <strong>\"Sources\" section<\/strong> built from real web citations.<\/li>\n<li><strong>Google Gemini<\/strong> \u2014 Gemini 3.6\/3.5 Flash for text, and the <strong>Nano Banana<\/strong> image family (Nano Banana 2, Nano Banana Pro) for stunning illustrations.<\/li>\n<\/ul>\n\n<p>Works with the Block Editor (Gutenberg) and the Classic editor, on posts and pages.<\/p>\n\n<h4>\u270d\ufe0f Writing, your way<\/h4>\n\n<ul>\n<li>Set the number of section headings, and choose whether to include an introduction and a conclusion \u2014 the post follows your structure exactly.<\/li>\n<li>Pick a <strong>default provider and model<\/strong> once in Settings \u2192 AI Blog Post, then override either per post right from the editor sidebar.<\/li>\n<li>If a post ever hits your token limit, you get a clear notice instead of a silently cut-off article.<\/li>\n<\/ul>\n\n<h4>\ud83d\uddbc\ufe0f Images that behave<\/h4>\n\n<ul>\n<li>Generate up to 4 images per post with Google Nano Banana or OpenAI.<\/li>\n<li>Images are <strong>saved to your Media Library<\/strong> with proper alt text \u2014 no expiring external URLs, no broken posts a day later.<\/li>\n<li><strong>Choose where images go:<\/strong> spread between sections, at the beginning, after the first paragraph, <strong>after each heading<\/strong>, at the end \u2014 or <strong>pick the exact paragraph for each image<\/strong> with the custom placement mode.<\/li>\n<li>One click sets the first image as the <strong>featured image<\/strong>, correctly synced with the editor.<\/li>\n<\/ul>\n\n<h4>\ud83d\ude80 Future-proof models<\/h4>\n\n<p>Model dropdowns are curated (latest + still-supported legacy models), and every provider also has a <strong>Custom Model ID<\/strong> field \u2014 when a provider ships a brand-new model tomorrow, paste its ID and use it immediately. No plugin update required.<\/p>\n\n<h4>\ud83d\udee0\ufe0f Built for developers<\/h4>\n\n<p>Clean provider abstraction with filters for everything: <code>martincv_openai_post_providers<\/code> (register your own provider), <code>martincv_openai_post_models<\/code>, <code>martincv_openai_post_system_prompt<\/code>, <code>martincv_openai_post_user_prompt<\/code>, <code>martincv_openai_post_image_prompt<\/code>, <code>martincv_openai_post_request_timeout<\/code>, and <code>martincv_openai_post_post_types<\/code>.<\/p>\n\n<!--section=installation-->\n<h4>Installing:<\/h4>\n\n<ol>\n<li>Download the package.<\/li>\n<li>Extract it to the \"plugins\" folder of your WordPress directory.<\/li>\n<li>In the Admin Panel, go to \"Plugins\" and activate it.<\/li>\n<li>Go to Settings \u2192 AI Blog Post, add the API key(s) for the provider(s) you want, and pick your defaults.<\/li>\n<\/ol>\n\n<h4>Upgrading from 1.x:<\/h4>\n\n<p>Your existing OpenAI API key and settings are migrated automatically the first time you visit the admin after updating.<\/p>\n\n<h4>Uninstalling:<\/h4>\n\n<ol>\n<li>In the Admin Panel, go to \"Plugins\", deactivate the plugin and click \"Delete\". All plugin settings are removed on delete.<\/li>\n<\/ol>\n\n<h4>Usage:<\/h4>\n\n<p>Create a Post or Page and enter a title \u2014 the title is the topic. In the sidebar \"AI Blog Post\" box pick a provider and model (or keep your defaults), set the structure and image options, and click <strong>Generate Post<\/strong>. The content is inserted into the editor as regular blocks (or classic-editor content), and generated images land in your Media Library.<\/p>\n\n<p>If you need any additional help feel free to contact me at <a href=\"mailto:martin@martincv.com\">martin@martincv.com<\/a>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20api%20keys%20do%20i%20need%3F\"><h3>Which API keys do I need?<\/h3><\/dt>\n<dd><p>Only the key(s) for the provider(s) you want to use. Each key field in Settings \u2192 AI Blog Post links directly to that provider's key page.<\/p><\/dd>\n<dt id=\"i%20want%20to%20use%20a%20model%20that%20is%20not%20in%20the%20dropdown.\"><h3>I want to use a model that is not in the dropdown.<\/h3><\/dt>\n<dd><p>Enter its exact model ID in the \"Custom Model ID\" field \u2014 it overrides the dropdown. This keeps the plugin working with models released after this version.<\/p><\/dd>\n<dt id=\"can%20i%20control%20where%20the%20generated%20images%20are%20placed%3F\"><h3>Can I control where the generated images are placed?<\/h3><\/dt>\n<dd><p>Yes. Choose a placement in the editor sidebar: spread between sections, at the beginning, after the first paragraph, after each heading, at the end \u2014 or \"Custom\", which lets you type the exact paragraph number for each image.<\/p><\/dd>\n<dt id=\"the%20generation%20request%20times%20out.%20why%3F\"><h3>The generation request times out. Why?<\/h3><\/dt>\n<dd><p>A full post is a single AI request that can take a minute or two depending on the provider, model, and length. If your host enforces a short PHP\/proxy timeout, lower Max Tokens or use the <code>martincv_openai_post_request_timeout<\/code> filter.<\/p><\/dd>\n<dt id=\"the%20text%20gets%20cut%20off%20before%20finishing.\"><h3>The text gets cut off before finishing.<\/h3><\/dt>\n<dd><p>The plugin will tell you when that happens \u2014 increase Max Tokens in Settings \u2192 AI Blog Post (default 2048).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<p><em>Release Date - 30 July 2026<\/em><\/p>\n\n<p><strong>Major update: one plugin, four AI providers<\/strong><\/p>\n\n<ul>\n<li>New providers: <strong>Anthropic Claude<\/strong>, <strong>Perplexity<\/strong>, and <strong>Google Gemini<\/strong> join OpenAI.<\/li>\n<li>Pick a default provider and model in Settings; override both per post in the editor sidebar.<\/li>\n<li>Curated model lists with the latest models (GPT-5.6, Claude Opus 5, Gemini 3.6, Sonar) plus still-supported legacy favorites (GPT-4o, GPT-4.1, GPT-3.5 Turbo, Claude 4.x), and a <strong>Custom Model ID<\/strong> field for anything newer.<\/li>\n<li><strong>Image generation via Google Nano Banana<\/strong> (Gemini image models) or OpenAI GPT Image 2 \u2014 images are saved to the Media Library with alt text instead of hotlinking expiring URLs.<\/li>\n<li><strong>Image placement control<\/strong>: spread between sections, at the beginning, after the first paragraph, after each heading, at the end, or a custom per-image paragraph position.<\/li>\n<li>Option to set the first generated image as the <strong>featured image<\/strong>, properly synced with both editors.<\/li>\n<li><strong>Perplexity citations<\/strong>: optionally append a \"Sources\" section with real links.<\/li>\n<li><strong>Truncation detection<\/strong>: a clear notice when a post hits the Max Tokens limit; migrated 1.x limits are raised to a safe minimum.<\/li>\n<li>Faster and more reliable: one AI request per post (previously three), cleaner content via native block conversion.<\/li>\n<li>Fixed from 1.1: generated text was always empty (response parsed with the legacy completions shape); the Max Length setting was never applied; zero values (e.g. temperature 0) reset to defaults.<\/li>\n<li>Security hardening: capability checks on generation, strict input sanitization, <code>manage_options<\/code> for the settings page, real HTTP status codes on errors.<\/li>\n<li>Developer filters for providers, models, prompts, timeouts, and post types; settings are cleaned up on uninstall.<\/li>\n<\/ul>\n\n<h4>1.1<\/h4>\n\n<ul>\n<li>Switched to gpt-3.5-turbo via Chat Completions.<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<p><em>Release Date - 14 December 2022<\/em><\/p>\n\n<ul>\n<li>Public release of 'MartinCV OpenAi Post'<\/li>\n<\/ul>","raw_excerpt":"Write complete blog posts \u2014 and matching images \u2014 from just a post title, using OpenAI, Anthropic Claude, Perplexity, or Google Gemini.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/167615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=167615"}],"author":[{"embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/martin7ba"}],"wp:attachment":[{"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=167615"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=167615"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=167615"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=167615"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=167615"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=167615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}