# AI Blog Writer with Sources > A WordPress plugin that turns your brief and the sources you choose into an editable draft with citations, warnings and provenance. Bring your own OpenAI, Claude, Gemini or Grok API key. Never publishes automatically. AI Blog Writer with Sources (shown in WordPress as "AI Blog Writer") is a free, GPLv2 WordPress plugin by Luis Rita. Website: https://sourcedwriter.com. WordPress.org slug: `luis-rita-ai-blog-writer` (in WordPress.org review). Key facts: - Version 1.0.0. Requires WordPress 6.0+ and PHP 7.4+. Tested up to WordPress 7.1. - Bring-your-own-key: OpenAI (GPT), Anthropic (Claude), Google (Gemini), xAI (Grok). No account, subscription or upsell in the plugin. - Writes from up to eight source URLs the user supplies. It does not search the web itself. - Output is a WordPress draft in core blocks, with inline citations, warnings, SEO suggestions and provenance. It never publishes automatically. - Guided mode pauses for source and outline review. Delegated mode runs straight through. - Writer profiles are linked to WordPress author accounts. Single-section rewrite and optional Rank Math metadata integration. - Keys are encrypted with Sodium or defined in wp-config.php, and are never exposed to the browser. There is no analytics or phone-home code. ## Frequently asked questions ### What is AI Blog Writer with Sources? A free WordPress plugin that turns a brief and up to eight source URLs you choose into an editable WordPress draft. The draft includes inline citations, warnings about claims to check, SEO suggestions and a provenance record. It uses your own OpenAI, Anthropic, Google or xAI API key. ### Does it publish automatically? No. Every successful generation creates a WordPress draft. A person must review it and press Publish. ### Does it search the web automatically? No. The plugin fetches only the URLs you supply in the brief, from your own server. ### Which AI models does it support? GPT models from OpenAI, Claude models from Anthropic, Gemini models from Google and Grok models from xAI. The model list comes from your own provider account. ### Do I need an account or subscription with the plugin author? No. The plugin is bring-your-own-key. You pay your AI provider directly, and the plugin stores no billing data and sends nothing to the plugin author. ### How much does it cost to generate an article? The plugin is free. Each article uses provider tokens billed by your AI provider at their current rates, and the cost depends on the model, the article length and the amount of source material. The plugin records usage per job and can enforce monthly cost ceilings per site and per user. ### Is my API key safe? Keys are used only in server-side requests, are never sent to the browser or returned by the REST API, and are stored encrypted with Sodium. They can also be defined in wp-config.php so they never touch the database. ### What happens to my posts if I deactivate or uninstall the plugin? Generated posts are normal WordPress block content and are always kept. Plugin data is removed on uninstall only if you define AIBCG_REMOVE_DATA_ON_UNINSTALL as true. ### Does it work with Rank Math? Yes. When Rank Math is active, the editor sidebar can apply the suggested meta title, meta description and focus keyword. Values you already set in Rank Math are kept unless you choose to replace them. ### Does it support multisite and other languages? Yes to both. It can be activated per site or network-wide, and each site keeps its own keys and settings. Drafts can be generated in about 30 languages, including English, Spanish, Portuguese, French, German, Japanese and Arabic. ### Does it work on low-traffic sites or with WP-Cron disabled? Yes. Generation runs as resumable WP-Cron stages. The job screen keeps stages moving while it is open, and with DISABLE_WP_CRON you schedule wp-cron.php every minute or run a stage with wp aibcg job run . ### Is AI-generated content accurate enough to publish as is? No AI output should be published unreviewed. Generated content can contain errors, unsupported claims or bias. The plugin makes review faster by tying claims to sources and listing warnings, but a person must check the draft. No ranking, traffic, accuracy or legal-safety guarantee is made. # Documentation ## Getting started > Install the plugin, connect an AI provider with your own API key, and create your first source-backed WordPress draft in about ten minutes. Source: https://sourcedwriter.com/docs/getting-started/ AI Blog Writer with Sources turns a brief and a short list of sources into a normal WordPress draft. The draft includes citations, warnings and a record of how it was made. It is never published automatically. ### Requirements - WordPress 6.0 or later (tested up to 7.1), single site or multisite - PHP 7.4 or later with the Sodium extension, which is needed to encrypt saved API keys - An API key from OpenAI, Anthropic, Google (Gemini) or xAI (Grok) - WP-Cron running, or a server scheduler that calls `wp-cron.php` (see [Background jobs and WP-Cron](https://sourcedwriter.com/docs/background-jobs-and-wp-cron/)) ### 1. Install and activate Once the plugin is live on WordPress.org, search for "AI Blog Writer with Sources" under **Plugins → Add New**. Until then, copy the plugin folder into `/wp-content/plugins/` and activate it. A new **AI Blog Writer** menu appears with these screens: Dashboard, New article, Writer profiles, Usage and cost, Settings and Diagnostics. ### 2. Connect your AI provider 1. Open **AI Blog Writer → Settings**. 2. Choose the **AI provider** and click **Save Changes**. Keys are stored per provider, so save after switching. 3. Paste the provider's API key and save again. The key is encrypted before storage and never displayed again. 4. Pick a **Default model** and click **Test connection**. For stronger isolation you can define the key in `wp-config.php` instead. See [AI providers and API keys](https://sourcedwriter.com/docs/ai-providers-and-api-keys/). ### 3. Set your defaults On the same screen, set the default language, approximate length and other content defaults. Under **Cost, privacy, and advanced controls** you can set a monthly cost ceiling and a retention period for prompts, sources and logs. ### 4. Create your first draft 1. Open **AI Blog Writer → New article**. 2. Enter a topic or working title. Add talking points, audience, search intent, a primary phrase and supporting terms if you have them. 3. Paste up to eight **source URLs**, one per line. Only these pages are fetched. 4. Choose a workflow. **Guided** pauses so you can check the sources and the outline. **Delegated** runs straight through to the draft. Start with Guided. 5. Optionally pick a [writer profile](https://sourcedwriter.com/docs/writer-profiles/). 6. Tick the review acknowledgement and click **Create WordPress draft**. The job screen shows each stage as it runs. When it finishes you get a link to the draft, the sources used, SEO suggestions and the provider usage for the job. ### 5. Review before you publish Open the draft in the block editor. The **AI Blog Writer** sidebar shows provenance, warnings, sources and SEO suggestions, and it lets you rewrite a single section. Check every claim against its source before publishing. The guide [How to review an AI-generated article before publishing](https://sourcedwriter.com/blog/review-ai-generated-article-before-publishing/) has a checklist. ## AI providers and API keys > Connect OpenAI, Anthropic Claude, Google Gemini or xAI Grok with your own API key, store it encrypted or in wp-config.php, and test the connection. Source: https://sourcedwriter.com/docs/ai-providers-and-api-keys/ The plugin is bring-your-own-key. You pay your AI provider directly, and the plugin author never sees your key, your content or your billing. ### Supported providers | Provider | Models | Endpoints used | | --- | --- | --- | | OpenAI | GPT models | `api.openai.com/v1/models`, `/v1/responses` | | Anthropic | Claude models | `api.anthropic.com/v1/models`, `/v1/messages` | | Google | Gemini models | `generativelanguage.googleapis.com/v1beta/models` | | xAI | Grok models | `api.x.ai/v1/models`, `/v1/chat/completions` | The model list comes from your provider account, so you only see models your key can use. Whether a model is available still depends on that account. ### Option A: save the key in Settings 1. Open **AI Blog Writer → Settings**. 2. Choose the provider and click **Save Changes**. 3. Paste the key into **New … API key** and save. Saved keys are encrypted with Sodium. The encryption key is `AIBCG_ENCRYPTION_KEY` if you define it, otherwise WordPress's `AUTH_KEY`. Define a stable `AIBCG_ENCRYPTION_KEY` in `wp-config.php` so that rotating `AUTH_KEY` does not make saved keys unreadable. ```php define( 'AIBCG_ENCRYPTION_KEY', 'a-long-random-string-that-never-changes' ); ``` ### Option B: define the key in wp-config.php This keeps the key out of the database entirely: ```php define( 'AIBCG_OPENAI_API_KEY', 'your-key' ); define( 'AIBCG_ANTHROPIC_API_KEY', 'your-key' ); define( 'AIBCG_GOOGLE_API_KEY', 'your-key' ); define( 'AIBCG_XAI_API_KEY', 'your-key' ); ``` Keys defined this way appear in Settings as "Defined by … in wp-config.php" and cannot be edited there. ### How keys are protected - Keys are used only in server-side requests. - They are never sent to the browser and never returned by the REST API. - They are never sent to the plugin author. - The Diagnostics report leaves out keys, prompts, article text and source notes. ### Test the connection Click **Test connection** after saving. This sends only the key and a request for the model list, with no content. The same check runs once when an administrator submits a new brief. ### Common errors - `provider_http_401`: the provider rejected the key. Create a new key and save it again. - `provider_http_429`: you hit a rate limit or ran out of quota. Check billing with your provider. - `provider_unreachable`: your server cannot reach the provider over HTTPS. Ask your host whether outbound requests are blocked. - "Selected model is unavailable": choose another model and test again. ## Delegated and Guided workflows > How each job moves from research to outline to draft, and when to use Guided mode to review sources and the outline before the plugin writes. Source: https://sourcedwriter.com/docs/delegated-and-guided-workflows/ Every job runs in three stages: **research**, **outline** and **draft**. The workflow you choose decides whether the job stops for your approval between stages. ### The three stages 1. **Research.** Your server fetches each source URL you supplied, removes duplicates and extracts notes with the page title and retrieval date. Sources that fail are listed as warnings. If none are usable, the draft is told to leave out or flag precise claims it cannot support. 2. **Outline.** The provider receives your brief, the writer profile and the extracted notes, and returns a section-by-section outline. 3. **Draft.** The provider writes the article from the approved outline. The plugin saves it as a WordPress draft in normal blocks, with sources, warnings, SEO suggestions and provenance attached. ### Guided: pause for source and outline approval Guided stops twice: - **After research**, so you can read each source's extracted notes and retrieval date and deselect sources that are out of date or off topic. - **After the outline**, so you can edit sections, reorder them or remove them before any article text is written. Use Guided for new topics, for YMYL subjects (health, money, legal, safety) and whenever the sources vary in quality. It costs the same in provider usage, and the article is only as good as the sources and outline you approve. ### Delegated: run through to the draft Delegated goes from research to outline to draft without stopping. The first time you use it, you must confirm that generated content needs human review. Use it when you trust your sources and have used the brief format before. You still review the finished draft. ### What never happens - The plugin never searches the web by itself. Only the URLs you supply are fetched. - It never publishes. Every successful job ends as a draft. - It never edits existing posts. Each job creates a new draft. ### Cancelling and retrying You can cancel a job while it runs. If a stage fails, for example because the provider hit a rate limit, fix the cause and click **Retry stage** on the job screen. Finished stages are kept, so a retry does not pay for them again. ## Sources and citations > What makes a good source URL, how the plugin fetches and extracts it, how citations appear in the draft, and what the warnings mean. Source: https://sourcedwriter.com/docs/sources-and-citations/ Sources are the point of this plugin. The draft is written from notes extracted from pages you chose, and each claim links back to its source so you can check it. ### Supplying sources Paste up to **eight URLs** in the brief, one per line. For best results: - Use primary sources: the official timetable, the regulation, the vendor's documentation, the original study. - Use public HTML or plain-text pages. PDFs, login-only pages and pages that load their content with JavaScript may not extract. - Mix sources rather than sending several pages from one site. - Put facts the article must include in **Facts, products, competitors, or claims to include or avoid**, and give each one a source. ### How pages are fetched Your own server fetches each URL with a plain HTTP request identified as `Luis-Rita-AI-Blog-Writer/; `. Nothing from your brief, your key or your users goes with it. For safety: - Private and local network addresses are rejected. - At most three redirects are followed. - Responses are capped at 1 MB. ### Citations in the draft Claims taken from a source are followed by a link to it, with the source title as link text, for example *(Operator name — Timetable and fares)*. The **Sources** panel in the editor sidebar lists every source with its retrieval date. ### Warnings The **Warnings** panel collects anything you should check before publishing, such as: - a source that could not be fetched, or one you deselected during review - time-sensitive facts like prices, schedules or rules, with the date they were retrieved - claims the brief asked for that no source supported, which were left out or flagged Treat warnings as a checklist. A draft with no warnings still needs a human read. ### Without sources You can run a job with no URLs. The plugin then adds a warning, and the model is told to leave out or flag precise claims such as numbers, dates, prices and quotes. Expect a more general article. ## Writer profiles > Create reusable writer profiles with voice, tone, expertise and words to avoid, linked to a real WordPress author, or have AI propose one from a sample. Source: https://sourcedwriter.com/docs/writer-profiles/ A writer profile describes a voice so that drafts sound consistent across articles. Every profile is linked to a WordPress author account, and drafts made with it are assigned to that author. ### Profile fields - **Profile name**: how the profile appears in the brief's dropdown. - **Author name** and **Job title** (required): used for the linked WordPress user. - **Description**, **Audience**, **Personality**, **Tone** - **Expertise areas**: topics this writer covers with authority. - **Point of view**: for example, first person for lived detail and second person for instructions. - **Preferred vocabulary** and **Structural preferences** - **Words, claims, or styles to avoid**: banned phrases, clichés and claim types that need a source. - **Writing sample**: a short passage that shows the voice. ### The linked WordPress author Saving a profile creates or updates a WordPress user with the **Author** role. Creating that user requires permission to create and promote users, so an administrator may need to save the first version. Deleting a profile keeps the WordPress author and the ownership of existing posts. ### AI-assisted proposals On the right of the Writer profiles screen, describe the voice you want, paste a sample, or both, then click **Propose editable profile**. The proposal fills the form for you to edit and save. It includes a fictional author name and job title. If you ask for the style of a named living author, you get high-level style traits, not an imitation. ### Tips - Fill in **Words, claims, or styles to avoid**. It makes the most noticeable difference. - Keep one profile per real voice or publication rather than one per article. - If a real person will sign the article, make sure the profile matches how they actually write, and have them review the draft. ## Editor sidebar and Rank Math > Use the AI Blog Writer panel in the block editor to check provenance, warnings and sources, rewrite one section, and apply SEO metadata to Rank Math. Source: https://sourcedwriter.com/docs/editor-sidebar-and-rank-math/ Generated drafts are ordinary WordPress posts made of core blocks. They keep working if you deactivate the plugin. While it is active, the block editor shows an **AI Blog Writer Details** sidebar. ### Sidebar panels - **Provenance**: job ID, provider, model and generation time. - **Warnings**: everything to check before publishing (see [Sources and citations](https://sourcedwriter.com/docs/sources-and-citations/)). - **Sources**: every source used, with retrieval dates. - **SEO suggestions**: meta title, meta description and focus keyword. - **Rewrite one section**: see below. A reminder at the bottom of the sidebar says that generated content can contain errors or unsupported claims. ### Rewrite one section Select a section, write an instruction such as "shorter, and lead with the price", and send it. Only that section's content, your instruction and the source notes attached to that section go to the provider. The rest of the post stays as it is. ### Rank Math integration When Rank Math is active, the SEO suggestions panel can apply the suggested **meta title**, **meta description** and **focus keyword** to Rank Math. Values you already set in Rank Math are kept unless you choose to replace them. Without Rank Math, copy the suggestions into your SEO plugin by hand. ## Usage and cost ceilings > Track provider token usage and estimated cost per job, and set site-wide or per-user monthly cost ceilings so spending on your own API key stays predictable. Source: https://sourcedwriter.com/docs/usage-and-cost-ceilings/ Because you use your own key, you pay your AI provider directly. The plugin records usage for each request so you can see where the money goes. ### Usage and cost screen **AI Blog Writer → Usage and cost** shows the provider connection state, the funding source (your own key) and the estimated site cost for the current month. Each finished job also shows its own usage. ### How cost is estimated In Settings, **Input cost / 1M units (USD)** and **Output cost / 1M units (USD)** hold your model's per-million-token prices. The plugin multiplies them by the usage the provider reports. Set them from your provider's current price list. The result is an estimate, and your provider's invoice is the final figure. ### Cost ceilings Under **Cost, privacy, and advanced controls**: - **Monthly cost ceiling (USD)**: a limit for the whole site. - **Per-user monthly ceiling (USD)**: a limit for each user's jobs. A value of `0` means no ceiling. Before each paid stage, the plugin checks whether that stage would push the month over a ceiling. If it would, the job stops with `cost_limit_reached`: "Monthly cost ceiling would be exceeded. Raise the limit or wait until next month." Ceilings are a guardrail inside WordPress. Also set a spending limit in your provider's dashboard. ## Background jobs and WP-Cron > How generation runs as resumable WP-Cron stages, what to do on low-traffic sites or with DISABLE_WP_CRON, and how to run a stage with WP-CLI. Source: https://sourcedwriter.com/docs/background-jobs-and-wp-cron/ Generating an article takes longer than a normal web request should, so each stage runs in the background as a resumable WP-Cron event. A slow provider or a timeout does not lose finished work. ### Normal sites WP-Cron runs when your site receives requests. The job screen checks the status every few seconds, so stages keep moving while it is open. If you close it, the job continues with the next request to your site. ### Low-traffic sites It works, but a job left alone may wait for the next visitor. Keep the job screen open until the draft is ready, or set up a real scheduler as below. ### Sites with DISABLE_WP_CRON If `wp-config.php` contains `define( 'DISABLE_WP_CRON', true );`, stages only advance when a server scheduler calls `wp-cron.php`. Run it every minute: ```bash * * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 ``` or with WP-CLI: ```bash * * * * * cd /path/to/wordpress && wp cron event run --due-now >/dev/null 2>&1 ``` ### Run one stage with WP-CLI Administrators can advance a job by one stage: ```bash wp aibcg job run ``` ### Jobs stuck in "queued" This means WP-Cron is not running. Open **AI Blog Writer → Diagnostics** to check, schedule `wp-cron.php` as shown above, then click **Retry stage** on the job. ## Privacy and external services > Exactly what the plugin sends to your AI provider and source URLs, what it stores in your database, retention, personal-data export and erasure, and uninstall. Source: https://sourcedwriter.com/docs/privacy-and-external-services/ The plugin sends data to only two kinds of destination: the AI provider you configure, and the source URLs you supply. Nothing is sent while you install or activate it, or while it sits idle. Nothing is ever sent to the plugin author, and the plugin contains no analytics, tracking or phone-home code. ### 1. Your AI provider | Action | What is sent | | --- | --- | | Test connection, and once when an administrator submits a new brief | The API key and a request for the model list. No content. | | Outline stage | Key, model, brief fields (topic, talking points, audience, search intent, keyword phrases, tone, length, language, market, call to action, include/avoid notes), the writer profile, and the extracted notes, titles and URLs of the selected sources | | Draft stage | The same as the outline stage, plus the approved outline | | Propose writer profile | Key, your prompt text and any writing sample you paste | | Rewrite section | Key, the section content, your instruction and that section's source notes | **Never sent:** WordPress credentials, other database contents, visitor data or payment data. API keys stay on the server. Your provider's terms and data policies apply to what it receives: [OpenAI](https://openai.com/policies/privacy-policy/), [Anthropic](https://www.anthropic.com/legal/privacy), [Google](https://ai.google.dev/gemini-api/terms), [xAI](https://x.ai/legal/privacy-policy). ### 2. Source URLs you supply Your server fetches each URL with a plain HTTP request identified as `Luis-Rita-AI-Blog-Writer/; `. No brief content, key or user data is sent. Private addresses are rejected, redirects are limited to three, and responses are capped at 1 MB. ### What is stored, and where Everything is stored in your own WordPress database: - jobs, meaning the brief, status, settings snapshot, owner and linked post - sources and extracted notes - versions of the outline and draft - usage and estimated cost per request - writer profiles - post meta on generated drafts: job ID, provenance, SEO suggestions and warnings - the review acknowledgement, in user meta - settings and encrypted API keys, in options ### Retention A daily WP-Cron event applies the **Prompt/source/log retention days** setting, which defaults to 90. For finished jobs older than that, it deletes sources and artifacts and clears the stored brief. Older usage rows are also deleted. Generated posts are always kept. ### Personal data export and erasure - **Tools → Export Personal Data** includes a user's jobs and writer profiles. - **Tools → Erase Personal Data** removes their profiles, sources, artifacts, generated-content post meta and acknowledgement, and unlinks their jobs and usage. Posts are kept. ### Uninstall Uninstalling always removes the plugin's capabilities. To also delete plugin tables, options, encrypted keys, transients and metadata on every site, first define: ```php define( 'AIBCG_REMOVE_DATA_ON_UNINSTALL', true ); ``` Generated posts and linked author accounts are always kept. ### Multisite The plugin can be activated per site or network-wide. With network activation, every site is set up, including sites created later. Each site keeps its own API keys, settings, jobs and writer profiles. ## Troubleshooting > Fix missing API keys, provider errors, jobs stuck in the queue and source URLs that fail to extract, and send a safe diagnostics report. Source: https://sourcedwriter.com/docs/troubleshooting/ ### Missing or invalid API key Keys are stored per provider. After changing the provider, click **Save Changes**, then save that provider's key. Keys defined in `wp-config.php` cannot be edited in Settings. Saving keys requires the PHP Sodium extension, so ask your host to enable it if saving fails. ### Provider errors | Code | Meaning | Fix | | --- | --- | --- | | `provider_http_401` | Key rejected | Create a new key and save it again | | `provider_http_429` | Rate limit or quota | Check billing and limits with your provider, then retry the stage | | `provider_unreachable` | Server cannot reach the provider over HTTPS | Ask your host about blocked outbound requests | | Selected model is unavailable | Your account cannot use that model | Choose another model and test the connection | | `cost_limit_reached` | A cost ceiling would be exceeded | Raise the ceiling or wait until next month | ### Jobs stay queued WP-Cron is not running. Check **AI Blog Writer → Diagnostics**, schedule `wp-cron.php` from a server scheduler, then click **Retry stage**. See [Background jobs and WP-Cron](https://sourcedwriter.com/docs/background-jobs-and-wp-cron/). ### Source URLs fail Sources must be public HTML or plain-text pages. Login-only pages, pages that need JavaScript, private network addresses and responses over 1 MB are rejected. Replace the URL and start a new job. ### Reporting a problem Download the JSON report from **AI Blog Writer → Diagnostics** and email it to [info@sourcedwriter.com](mailto:info@sourcedwriter.com). The report leaves out API keys, prompts, article text and source notes. # Guides ## How to review an AI-generated article before publishing > A repeatable editorial checklist for AI-assisted blog posts: facts, sources, structure, voice, SEO metadata, links and disclosure, before you press Publish. Source: https://sourcedwriter.com/blog/review-ai-generated-article-before-publishing/ An AI draft is a first draft. Reviewing it well is quicker than writing from scratch, but only if you review in a fixed order, so the checks that can sink the article come first and cosmetic edits come last. This checklist takes about 15 to 30 minutes for a 1,200-word post. ### Pass 1: Warnings and provenance (2 minutes) Before you read the article, read what your tooling already flagged. In AI Blog Writer with Sources that is the **Warnings** panel in the editor sidebar: sources that failed or were deselected, time-sensitive facts with retrieval dates, and claims the brief asked for that no source supported. Note which model wrote the draft and when. If the sources were fetched weeks ago, prices and schedules may have changed. ### Pass 2: Facts against sources (10 to 15 minutes) This is the pass that matters most. For each sentence containing a **number, date, price, name, quote, rule or comparison**: 1. Does it have a citation? 2. Open the source. Does it say this, in this context? 3. Is the source current enough for this claim? Remove or rewrite any claim that fails. Don't add your own facts without a source unless you are the source. Our [claim verification guide](https://sourcedwriter.com/blog/verify-ai-written-claims-before-publishing/) covers the tricky cases. Pay particular attention to: - **Superlatives**: "the only", "the fastest", "the cheapest" - **Absolutes**: "always", "never", "guaranteed" - **Merged claims**: two true facts from different sources joined into a false one - **Health, money, legal and safety advice**, which should be conservative and properly attributed ### Pass 3: Structure and intent (5 minutes) Read only the headings. Do they answer the question the reader searched for, in the order they need the answers? Move the most useful section up. Cut sections that restate earlier ones. AI drafts often end with a generic conclusion, so replace it with a concrete next step or delete it. ### Pass 4: Voice and specificity (5 minutes) Delete the filler that marks AI text: "in today's fast-paced world", "it's important to note", "delve", "a testament to". Replace vague adjectives with specifics from your sources. If a real person signs the article, it should sound like them. A [writer profile](https://sourcedwriter.com/docs/writer-profiles/) with a list of words to avoid prevents most of this from the start. ### Pass 5: Metadata, links and media (3 minutes) - **Meta title and description**: accurate and specific, with no promises the article doesn't keep - **Focus phrase**: appears naturally in the title, the introduction and one heading - **Internal links**: two or three to related pages on your site - **Citation links**: they work and point to the exact page, not a homepage - **Images**: alt text that describes the image, not keywords ### Pass 6: Disclosure and sign-off Decide how you disclose AI assistance. Many publishers add a short line such as "Drafted with AI assistance from cited sources and reviewed by [editor]". What matters is being consistent and honest. Then have the named author or editor sign off. ### Make it a habit Copy this checklist into your editorial workflow or a reusable WordPress block pattern. The first review takes the longest. After ten articles you'll know where your drafts usually go wrong, and you can fix that upstream in the brief, the sources or the writer profile. ## How to write source-backed blog posts in WordPress with AI > A workflow for AI-assisted WordPress articles where every factual claim traces back to a source you chose, from picking sources to checking citations. Source: https://sourcedwriter.com/blog/source-backed-blog-posts-wordpress/ Most AI writing tools start from the model's memory. That's why their articles sound confident but get prices, dates and rules wrong. A source-backed workflow reverses the order: you pick the evidence first, the model writes only from it, and every claim links back so a reader or editor can check it. This guide explains that workflow in plain WordPress terms. It works with any tool, and it shows where [AI Blog Writer with Sources](https://sourcedwriter.com/) automates each step. ### Why sources matter more than the model A newer model won't fix a fact that isn't in front of it. Language models predict plausible text, and a plausible ferry timetable or plausible dosage isn't the real one. Three things decide whether an AI-assisted article is accurate: 1. **What evidence the model sees.** Pages you selected, fetched today, beat whatever the model remembers from training. 2. **Whether claims stay tied to that evidence.** Inline citations make every claim checkable. 3. **Whether a human checks before publishing.** Nothing replaces this, but sources make it fast. Search engines and AI answer engines increasingly reward pages that show where their facts come from. A cited article is also easier for Google, ChatGPT or Perplexity to quote accurately. ### Step 1: Write a brief, not a prompt A one-line prompt such as "write about getting around the Azores" leaves every decision to the model. A brief gives it the structure: - **Topic or working title** - **Talking points**: the three to six things the article must cover - **Audience** and **search intent**: who is reading and what they want to decide or do - **Primary phrase** and **supporting terms**: the phrase you want to rank for, and related terms - **Include or avoid**: facts that must appear, claims that must not ### Step 2: Choose sources deliberately Aim for three to eight sources, and prefer primary ones: | Claim type | Good source | | --- | --- | | Prices, schedules, availability | The operator's own page | | Rules, regulations, eligibility | The official government or standards body | | Product capabilities | The vendor's documentation or changelog | | Statistics | The original study or dataset, not a news story about it | Skip content farms and pages that are themselves AI summaries. If two sources disagree, keep both and let the draft flag the difference. ### Step 3: Review the evidence before any writing This step is the one most often skipped. Before the model writes, read what it will write from: the extracted notes for each source and the date each was retrieved. Drop anything out of date or off topic. In AI Blog Writer with Sources this is **Guided** mode. The job pauses after research so you can deselect sources, and again after the outline so you can edit sections before any article text exists. ### Step 4: Approve the outline An outline shows structural problems cheaply. Check that: - each section answers part of the search intent - the order follows the reader's decision, not the order of the sources - no section depends on a claim none of your sources support ### Step 5: Draft with inline citations When the draft is written, each factual sentence should carry a link to its source. A simple parenthetical link using the source title as link text works well in WordPress, stays visible to readers, and survives copying between editors. ### Step 6: Review against the sources Go through the draft claim by claim. Our [review checklist](https://sourcedwriter.com/blog/review-ai-generated-article-before-publishing/) covers the full process, and [how to verify AI-written claims](https://sourcedwriter.com/blog/verify-ai-written-claims-before-publishing/) covers the fact-checking part. ### Doing this in WordPress You can do all of this by hand with a chat window and a text editor. AI Blog Writer with Sources does it inside WordPress: - A brief form with the fields above, and up to eight source URLs - Source fetching on your own server, with extracted notes and retrieval dates - Guided review of sources and outline, or Delegated mode to run straight through - A normal block-editor draft with inline citations, a Sources panel, warnings and provenance - Your own OpenAI, Claude, Gemini or Grok key, so you pay the provider directly It never publishes automatically. Start with the [getting started guide](https://sourcedwriter.com/docs/getting-started/). ## How to use your own AI API key in WordPress safely > Get an OpenAI, Claude, Gemini or Grok API key, store it safely in WordPress, cap spending, and know what to check in any bring-your-own-key plugin. Source: https://sourcedwriter.com/blog/use-your-own-ai-api-key-in-wordpress/ Many WordPress AI plugins ask for your own API key. This approach is usually called bring-your-own-key (BYOK). You pay the AI provider directly at their rates instead of paying a markup on credits, and your content goes to a provider you chose under that provider's terms. It also makes you responsible for a secret that can spend money. Here is how to handle it properly. ### Step 1: Create a key with the provider Create an account and a key in the provider's developer console: - **OpenAI** (GPT models): platform.openai.com - **Anthropic** (Claude models): console.anthropic.com - **Google** (Gemini models): aistudio.google.com - **xAI** (Grok models): console.x.ai Good practice when creating it: - **One key per site.** If one leaks, you revoke it without breaking every other site. - **A descriptive name**, such as `example.com-wordpress`, so usage is easy to attribute. - **A spending limit or budget alert** on the provider account, if the provider offers one. This is your real safety net. ### Step 2: Decide where the key lives There are two reasonable places. #### In wp-config.php (strongest) The key never touches the database, so a database dump, backup or staging copy doesn't leak it. A well-built plugin reads a constant such as: ```php define( 'AIBCG_OPENAI_API_KEY', 'your-key' ); ``` The trade-off is that changing the key means editing a server file. #### Encrypted in the database This is more convenient, because an administrator can paste and rotate it from Settings. Check that the plugin **encrypts** the key rather than storing it in plain text. In WordPress this usually means Sodium with a key derived from `AUTH_KEY` or a dedicated constant. If the encryption key comes from `AUTH_KEY`, rotating the salts can make saved keys unreadable. A dedicated, stable constant avoids that. ### Step 3: Check what the plugin does with the key Before you paste a key into any plugin, find the answers to these questions in its readme or docs: 1. **Does the key ever reach the browser?** It shouldn't. Calls to the provider should happen on the server, and the key should never appear in page source or REST API responses. 2. **Where does it send data?** A good readme lists every external endpoint, and WordPress.org guidelines require plugins to disclose external services. 3. **Does anything go to the plugin author?** With BYOK there is usually no reason for it to. 4. **Does it redact keys from diagnostics and logs?** 5. **Does it clean up on uninstall?** ### Step 4: Control spending inside WordPress Provider limits act on the whole account. Inside WordPress, look for per-site and per-user limits so one enthusiastic editor can't use up the month's budget. The plugin should also record usage per job, so you can see which articles cost what. ### Step 5: Rotate and revoke - Rotate keys when someone with access leaves, or on a regular schedule. - Revoke at once if a key appears in a repository, a support ticket or a screenshot. - After rotating, run the plugin's connection test. ### How AI Blog Writer with Sources handles keys For reference, this is how [AI Blog Writer with Sources](https://sourcedwriter.com/) answers the checklist: - Keys can live in `wp-config.php` (`AIBCG_OPENAI_API_KEY`, `AIBCG_ANTHROPIC_API_KEY`, `AIBCG_GOOGLE_API_KEY`, `AIBCG_XAI_API_KEY`) or be saved encrypted with Sodium under a stable `AIBCG_ENCRYPTION_KEY`. - Keys are used only on the server and are never returned by REST or shown after saving. - Every endpoint it calls is listed in [Privacy and external services](https://sourcedwriter.com/docs/privacy-and-external-services/). Nothing goes to the plugin author. - Monthly cost ceilings can be set per site and per user, with usage recorded for each job ([Usage and cost ceilings](https://sourcedwriter.com/docs/usage-and-cost-ceilings/)). - The diagnostics report leaves out keys, prompts and article text. ## How to verify AI-written claims before publishing > How to fact-check AI-generated content: find checkable claims, trace each to a primary source, catch stale data and misattribution, and decide what to cut. Source: https://sourcedwriter.com/blog/verify-ai-written-claims-before-publishing/ AI models rarely invent things at random. They produce **plausible** things, and plausible errors are exactly the ones a quick read misses. Verification means turning "sounds right" into "I checked it". Here is a method that scales from one article to a content team. ### 1. Find the checkable claims Not every sentence needs checking. Mark the ones that assert something about the world: - numbers, prices, percentages and dates - names of people, organisations, products and places - quotes and paraphrases attributed to someone - rules, requirements, eligibility and legal statements - comparisons and rankings ("faster than", "the largest") - cause and effect ("X leads to Y") Opinions, advice framed as advice, and transitions don't need a source. Anything a reader might act on does. ### 2. Trace each claim to a source For each marked claim, find the source it came from. If the article has inline citations, open the linked page and search it for the specific fact. Check three things: 1. **Presence**: the source actually says this. 2. **Context**: it says it about the same thing, place, period and conditions. 3. **Authority**: the source is in a position to know, ideally a primary source. If there is no citation, find a primary source yourself or cut the claim. ### 3. Watch for the common failure patterns | Pattern | Example | How to catch it | | --- | --- | --- | | **Stale data** | Last year's fares shown as current | Check the source's date and your retrieval date | | **Scope drift** | A rule for residents applied to visitors | Reread the source's conditions and exceptions | | **Merged facts** | Two true figures combined into a false comparison | Check that both figures come from the same source or period | | **Misattribution** | A quote given to the wrong person or organisation | Search for the exact phrase in the cited source | | **Unit and currency errors** | Totals mixing dollars and euros, or kilometres and miles | Recalculate anything derived | | **Invented precision** | "Roughly 40%" becomes "41.7%" | Precision should never exceed the source's | | **Confident absolutes** | "Always", "never", "guaranteed" | Soften, or find a source that really says it | ### 4. Decide: keep, fix, qualify or cut - **Keep** it if the source supports it as written. - **Fix** it if the source supports a slightly different claim, and rewrite it to match. - **Qualify** it if it is true but time-sensitive: add "as of [month year]" or "check current prices with the operator". - **Cut** it if you can't find support quickly. An unsupported sentence adds more risk than value. ### 5. Record what you checked For teams, keep a light record, such as a comment on the post or a line in your editorial tracker: who checked it, when, and anything qualified or cut. When a reader questions a claim months later, you'll know where it came from. ### Where tooling helps Verification stays a human job, but tools can reduce the work: - **Source-first drafting** means claims start out tied to evidence you chose. [AI Blog Writer with Sources](https://sourcedwriter.com/) writes only from sources you supply and cites them inline. - **Retrieval dates** on each source make stale data visible. - **Warnings** about unsupported or deselected claims tell you where to look first. Even with good tooling, a person should make the final call on anything a reader might act on.