{"id":21,"date":"2026-09-17T21:24:52","date_gmt":"2026-09-17T21:24:52","guid":{"rendered":"https:\/\/wpcontentwriter.com\/kb\/ai-content-generation-inside-wordpress\/"},"modified":"2026-09-17T21:24:52","modified_gmt":"2026-09-17T21:24:52","slug":"ai-content-generation-inside-wordpress","status":"publish","type":"post","link":"https:\/\/wpcontentwriter.com\/kb\/ai-content-generation-inside-wordpress\/","title":{"rendered":"AI Content Generation Inside WordPress"},"content":{"rendered":"<p>There are two ways to use AI for a WordPress site. You can write somewhere else and paste the result in, or the generation can happen inside WordPress and produce a post directly. This article is about the second, what changes when you do it that way, and where it goes wrong.<\/p>\n<div class=\"kb-takeaway\">\n<span class=\"kb-takeaway__label\">The real argument for doing it in WordPress<\/span><\/p>\n<p>Not convenience. Context. A tool running inside your site can read your categories, your existing posts, your internal links and your own past writing. A chat window in another tab knows none of that, which is why its output always needs the most editing.<\/p>\n<\/div>\n<h2>What &#8220;inside WordPress&#8221; actually buys you<\/h2>\n<h3>It knows what you have already published<\/h3>\n<p>The most useful thing a generator can do is not write new prose. It is notice that you covered this in March, and either link to it or decline to write the same article twice. That requires querying your posts, which requires being in your database.<\/p>\n<h3>The output is a post, not an export<\/h3>\n<p>It lands in <code>wp_posts<\/code> with a status, an author, categories and a featured image. Your editor works on it. Your SEO plugin sees it. Your revision history covers it. Nothing has to be migrated later because it was never anywhere else.<\/p>\n<h3>Internal links can be real<\/h3>\n<p>A model asked to add internal links from outside your site will invent plausible URLs. Inside, the candidates come from an actual query against published posts, so a link either exists or is not offered. This is the difference between an internal linking feature and a broken-link generator.<\/p>\n<h2>What a generation run actually involves<\/h2>\n<p>&#8220;Generate an article&#8221; sounds like one API call. Done properly it is several, each doing a different job, and knowing the shape helps you understand both the cost and where quality comes from.<\/p>\n<figure class=\"kb-figure\">\n<svg viewBox=\"0 0 640 210\" role=\"img\" aria-label=\"The stages of a generation run, from research to humanised draft\">\n  <text class=\"fig-title\" x=\"10\" y=\"20\" font-size=\"14\">One article, five stages<\/text><\/p>\n<line x1=\"46\" y1=\"86\" x2=\"606\" y2=\"86\" stroke=\"#E2E8F0\" stroke-width=\"2\"\/>\n<p>  <circle cx=\"60\" cy=\"86\" r=\"15\" fill=\"#FFFFFF\" stroke=\"#7C3AED\" stroke-width=\"2\"\/>\n  <text x=\"55\" y=\"91\" font-size=\"11\" font-weight=\"600\">1<\/text>\n  <text x=\"36\" y=\"122\" font-size=\"11\">research<\/text><\/p>\n<p>  <circle cx=\"196\" cy=\"86\" r=\"15\" fill=\"#FFFFFF\" stroke=\"#7C3AED\" stroke-width=\"2\"\/>\n  <text x=\"191\" y=\"91\" font-size=\"11\" font-weight=\"600\">2<\/text>\n  <text x=\"174\" y=\"122\" font-size=\"11\">outline<\/text><\/p>\n<p>  <circle cx=\"332\" cy=\"86\" r=\"15\" fill=\"#FFFFFF\" stroke=\"#7C3AED\" stroke-width=\"2\"\/>\n  <text x=\"327\" y=\"91\" font-size=\"11\" font-weight=\"600\">3<\/text>\n  <text x=\"315\" y=\"122\" font-size=\"11\">draft<\/text><\/p>\n<p>  <circle cx=\"468\" cy=\"86\" r=\"15\" fill=\"#FFFFFF\" stroke=\"#7C3AED\" stroke-width=\"2\"\/>\n  <text x=\"463\" y=\"91\" font-size=\"11\" font-weight=\"600\">4<\/text>\n  <text x=\"452\" y=\"122\" font-size=\"11\">meta<\/text><\/p>\n<p>  <circle cx=\"604\" cy=\"86\" r=\"15\" fill=\"#FFFFFF\" stroke=\"#7C3AED\" stroke-width=\"2\"\/>\n  <text x=\"599\" y=\"91\" font-size=\"11\" font-weight=\"600\">5<\/text>\n  <text x=\"572\" y=\"122\" font-size=\"11\">humanise<\/text><\/p>\n<p>  <text class=\"fig-muted\" x=\"10\" y=\"160\" font-size=\"11\">Each stage is its own call, so each can use a different model. Drafting on something<\/text>\n  <text class=\"fig-muted\" x=\"10\" y=\"177\" font-size=\"11\">capable and writing meta descriptions on something cheap is where the savings are.<\/text>\n  <text class=\"fig-muted\" x=\"10\" y=\"196\" font-size=\"11\">A fact-check pass and a plagiarism check sit alongside, not in the line.<\/text>\n<\/svg><figcaption>Our pipeline runs these stages in order. Most of the cost is in stage 3, and most of the quality is decided in stages 1 and 2.<\/figcaption><\/figure>\n<p>The practical consequence: if drafts come out generic, the fix is almost never a better model. It is a better brief at the research and outline stages, because everything downstream inherits their shape.<\/p>\n<h2>What it costs<\/h2>\n<p>With a bring-your-own-key plugin, you pay the provider per token and nothing to anyone else. A single mid-length article on a mid-tier model is cents rather than dollars, which surprises people who have been quoted per-word rates.<\/p>\n<p>Two things move that number far more than people expect:<\/p>\n<ul>\n<li><strong>Model choice.<\/strong> The spread within one provider&#8217;s family is large. Running every stage on the most capable model available is the usual reason a bill looks wrong.<\/li>\n<li><strong>Retries.<\/strong> A failed call that produced tokens before erroring still costs money. Check that your tool&#8217;s usage log counts those, because a log that silently omits them will not match your provider&#8217;s invoice.<\/li>\n<\/ul>\n<p>Our <a href=\"https:\/\/wpcontentwriter.com\/ai-content-cost-calculator\">cost calculator<\/a> uses the same rate table the plugin bills its own usage log against, so the two agree by construction.<\/p>\n<h2>Where this goes wrong<\/h2>\n<h3>Publishing straight to live<\/h3>\n<p>Technically easy, and the single most common way sites get themselves into trouble. Our default is <code>draft<\/code> deliberately. Direct publishing exists as a setting, and the reason it is not the default is that the failure mode \u2014 a factually wrong article live on your site with your name on it \u2014 is much worse than the inconvenience of a review queue.<\/p>\n<h3>Volume without a reason<\/h3>\n<p>Generating a hundred thin articles because you can is the behaviour search engines specifically act against. The useful version of this is covering things you would have written anyway and had not got to.<\/p>\n<h3>Assuming fluent means correct<\/h3>\n<p>Models produce confident prose about things they have no knowledge of, and your product&#8217;s specifics are exactly the category they have no knowledge of. Specifications, prices, compatibility, version numbers \u2014 check every one. Our fact-check pass flags claims rather than silently rewriting them, because a flagged claim you can check beats a smoothed-over one you cannot.<\/p>\n<h3>No editing at all<\/h3>\n<p>The workflow that works: generate a draft, read it as an editor, cut what is padding, add what only you know, verify the claims, publish. Usually fifteen minutes. That fifteen minutes is the whole difference between useful content and the stuff everyone complains about.<\/p>\n<h2>A sane setup<\/h2>\n<ol>\n<li>Default status <code>draft<\/code>. Leave it there.<\/li>\n<li>Set a spend limit at the provider, not only in the plugin.<\/li>\n<li>Fill in whatever business or audience context the tool accepts. This is the highest-value ten minutes available to you.<\/li>\n<li>Pick a cheaper model for metadata and a capable one for drafting.<\/li>\n<li>Generate three articles, edit them properly, and see how much editing they needed before you scale anything.<\/li>\n<\/ol>\n<div class=\"kb-faq\">\n<h2>Common questions<\/h2>\n<details>\n<summary>Will Google penalise AI-generated posts?<\/summary>\n<p>Google&#8217;s stated position is that it rewards helpful content however it was made, and acts against low-value content produced at scale to game rankings. Edited, verified, genuinely useful articles are fine. Unreviewed bulk output is the thing that gets hit, and that is a decision about your process rather than your tooling.<\/p>\n<\/details>\n<details>\n<summary>Does the content belong to me?<\/summary>\n<p>Under the major providers&#8217; current terms, output from their APIs is yours to use commercially. Read your provider&#8217;s terms yourself rather than a plugin&#8217;s summary of them, and re-read after any pricing change, since that is when terms tend to move.<\/p>\n<\/details>\n<details>\n<summary>Can it write in my brand voice?<\/summary>\n<p>Closer than people expect, if you give it something to work from \u2014 sample paragraphs, a style note, a list of words you never use. From a title alone you get house-average prose, because that is all the information in a title.<\/p>\n<\/details>\n<details>\n<summary>What happens to my posts if I uninstall the plugin?<\/summary>\n<p>With a generator that writes to <code>wp_posts<\/code>, nothing. They are ordinary posts. This is worth verifying rather than assuming \u2014 generate one on staging, deactivate, and look at the front end.<\/p>\n<\/details>\n<details>\n<summary>How many posts a month is reasonable?<\/summary>\n<p>As many as you can genuinely edit, which is a much lower number than the tool can produce. If drafts are queuing up unreviewed, you are generating too many, and the queue is telling you so.<\/p>\n<\/details>\n<\/div>\n<h2>Where to go next<\/h2>\n<p><a href=\"\/kb\/how-to-optimize-wordpress-content-for-chatgpt\/\">How to optimise WordPress content for ChatGPT<\/a> covers what to do with the posts once they exist. <a href=\"\/kb\/best-claude-plugins-for-wordpress\/\">Best Claude plugins for WordPress<\/a> narrows it to one provider.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>There are two ways to use AI for a WordPress site. You can write somewhere else and paste the result in, or the generation can happen inside WordPress and produce a post&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-high-intent"],"_links":{"self":[{"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":0,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"wp:attachment":[{"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}