All case studies

DEV3 Technologies · own product

DEV3 AI SEO Assistant: AI meta, schema and internal links written straight into Yoast and Rank Math fields

Our own WordPress plugin: it drafts SEO titles, descriptions, focus keywords, schema, internal links and FAQ blocks with the Google Gemini API, then writes each accepted field into Yoast SEO, Rank Math, SEOPress or All in One SEO, with history and undo.

Industry
Publishing & Content (WordPress)

Live project preview

Client systems are private — screenshots shown where permitted.

DEV3 Technologies · own product — screenshots
The dashboard shows which SEO plugin DEV3 writes into, the site's average score, top issues with one-click bulk runs, and the internal-link index.

The dashboard shows which SEO plugin DEV3 writes into, the site's average score, top issues with one-click bulk runs, and the internal-link index.

The challenge

Most WordPress sites already run Yoast SEO or Rank Math, and their AI features are either paid per credit, locked in a premium tier, or write into the field the moment you click. A separate AI SEO tool that keeps its own copy of the meta is worse: the SEO plugin keeps printing its own tags, and the two drift apart. We needed an assistant that writes into whichever SEO plugin the site already uses, in that plugin's own storage format, without the block editor quietly overwriting the value on the next save, and with every change reversible even after the site switches SEO plugins.

Our solution

We built DEV3 AI SEO Assistant as a PHP plugin with a React admin app and a block editor sidebar. The AI writes suggestions; a small adapter layer decides where and how they are stored.

Key design decisions

  • One adapter per SEO plugin. Yoast SEO, Rank Math, SEOPress, All in One SEO and a native fallback share one interface: six fields (SEO title, meta description, focus keyword, social title, social description, schema type). Each adapter maps them to its plugin's real storage: _yoast_wpseo_* meta, rank_math_* meta, or AIOSEO's own table through its documented model.
  • Plugin rules, not just keys. Yoast splits schema into page type and article type, so an article type clears the page type to win. Rank Math takes a comma-separated keyword list, deduplicated and capped at its free limit of 5. AIOSEO stores keyphrases as JSON, so the adapter edits only the focus entry.
  • Editor store sync. When a value is applied while the post is open, the sidebar also dispatches it into the yoast-seo/editor or rank-math data store, so the next "Update" saves the same value instead of the stale one held in the browser.
  • Drafts, conflict checks and undo. Every suggestion is a field-level draft. Apply refuses with a 409 if the live value changed since the draft was made; every apply writes a history row with the adapter it used, so undo writes back to the same plugin even after the site switches.
  • Schema merged, not duplicated. Extra JSON-LD pieces (FAQPage, HowTo, Product and more) are added to Yoast's and Rank Math's own graphs. A FAQPage piece is dropped when the post already contains the SEO plugin's native FAQ block.
  • Useful with AI off. Checks, a 0–100 score, rules-based titles and descriptions, word-match link suggestions and the site audit all work without an API key.

Architecture

The Google Gemini API (gemini-2.5-flash by default) returns structured JSON with up to 3 options per field, cached per content hash. Internal links come from a background embeddings index of published posts (gemini-embedding-001), and the AI's anchor phrase must already exist in the source paragraph, which is checked on the server. Bulk runs of up to 2,000 posts go through background jobs into a review queue with diffs, inline edit and "apply all pending of this run". The API client, settings, usage logs and job runner come from a shared core used across DEV3's plugins.

Results

The plugin is complete. It ships in the DEV3 AI Content, SEO & Site Tools Plugins Bundle on the DEV3 marketplace, alongside 6 other content and site plugins, and is being prepared for CodeCanyon. What was built and verified:

  • 69 PHPUnit tests, run in wp-env with the real Yoast SEO and Rank Math plugins loaded, covering every adapter's keys, Yoast's schema-type rules, Rank Math's keyword list, apply conflicts, undo after switching SEO plugins, batch undo and schema graph merging
  • 48 Jest tests, including the editor bridge that syncs Yoast and Rank Math stores and inserts links into the right paragraph block
  • Values written by the plugin read back through Yoast's and Rank Math's own meta APIs, and the rendered front-end title was checked in wp-env
  • The AI paths were tested with mocked API responses; a run with a live key is the next step. All in One SEO was tested against a stub of its documented model, not the real plugin
  • Build, PHP_CodeSniffer (WordPress standards) at 0 errors and 0 warnings, translation template and packaging all pass

Setup guide

No licence key or activation is needed: install the zip and every feature works.

Requirements

  • WordPress 6.0 or newer and PHP 7.4 or newer
  • Recommended: Yoast SEO or Rank Math (free or premium). SEOPress and All in One SEO are also supported; with no SEO plugin, DEV3 prints the title, meta description and Open Graph tags itself
  • The block editor for the DEV3 AI SEO sidebar. Classic-editor sites use the post screen inside the plugin's admin
  • Optional: a Google Gemini API key. Without one, checks, scores, reports and rules-based suggestions still work

1. Install the plugin

  1. Unzip the bundle download and find dev3-ai-content-seo-site-tools-plugins-bundle/dev3-ai-seo-assistant/dev3-ai-seo-assistant.zip.
  2. In WordPress, go to Plugins → Add New → Upload Plugin, choose the zip and click Install Now.
  3. Click Activate. DEV3 AI SEO Assistant for Yoast & Rank Math appears in the plugin list and its menu, DEV3 AI SEO, appears in the admin sidebar.

2. Connect Google Gemini (optional)

  1. Create a free API key in Google AI Studio (sign in with a Google account, then Create API key).
  2. Go to DEV3 AI SEO → API Config, paste the key and click Validate & save. The key is stored encrypted and never sent to the browser. You can also set a monthly budget here.
  3. Optional: pick the model (gemini-2.5-flash is the fast default; gemini-2.5-pro for the highest quality). Internal-link suggestions use gemini-embedding-001.

Prefer config files? Add define( 'DEV3SE_GEMINI_API_KEY', 'your-key' ); to wp-config.php instead.

3. Set it up

  1. If you use Rank Math, finish or skip its setup wizard first so it prints its head tags.
  2. Open DEV3 AI SEO → Dashboard. The banner shows which SEO plugin DEV3 is writing into; change it in Settings if you run more than one.
  3. In Settings, set the title and description limits, title separator and brand suffix, language, tone, post types and the number of link suggestions per post.
  4. Go to Internal links and click Update index with DEV3 AI to embed your published posts. New posts are indexed on publish.
  5. Open any post in the block editor and click the DEV3 AI SEO icon in the top bar. Generate a field, compare the draft, then Apply, Edit or Reject it.
  6. For many posts at once, use Bulk optimize (filter by issue, such as "No meta description"), then review the drafts in Review queue. Every applied change is listed in History with Undo.

Updating

Download the new bundle version, then upload the plugin zip in Plugins → Add New → Upload Plugin and choose Replace current with uploaded. Settings, drafts and history are kept.

Uninstalling

Deactivate and delete the plugin from Plugins. Drafts, history and settings are kept unless you turn on the delete-on-uninstall option in Settings first. Values already applied always stay in your SEO plugin's fields, because they belong to Yoast SEO, Rank Math or the SEO plugin you use.

How to use

Optimise one post in the editor

  1. Open a post in the block editor and click the DEV3 AI SEO icon in the top bar. The sidebar shows the SEO score and which SEO plugin it is writing into.
  2. Open Checks to see what's missing, such as the keyword not appearing in the meta description.
  3. In Snippet & meta, tick the fields to write (SEO title, meta description, focus keyword, social title, social description) and click Generate with DEV3 AI. Without a key, use Basic suggestions.
  4. Each field comes back as a draft with a length meter and up to 3 options. Pick an option, then click Apply, Edit or Reject. Applied values go straight into Yoast SEO or Rank Math, and their panels update at once.

Add internal links

  1. Make sure the index is up to date in DEV3 AI SEO → Internal links (Update index with DEV3 AI).
  2. In the editor sidebar, open Internal links and click Find links with DEV3 AI. Each suggestion shows the target post, a score and the sentence with the anchor text highlighted.
  3. Click Insert link on a suggestion. The link is added to that exact paragraph block, and you save the post as usual.
  4. To fix orphans site-wide, switch on Orphans only in the link report and click Suggest links on each post.

Close content gaps and add an FAQ

  1. In the sidebar, open Content gaps & outline and click Find content gaps with DEV3 AI.
  2. Review the coverage score, missing subtopics, questions searchers ask and terms to mention. Insert the suggested outline as headings if you want to write the missing sections.
  3. Click Answer these in an FAQ, review the questions and answers in FAQ (or start there with Write FAQ with DEV3 AI), then click Insert FAQ block. With Yoast or Rank Math they become that plugin's FAQ block, which prints FAQPage schema.

Run a bulk job and review it

  1. On the Dashboard, click Fix next to an issue such as "No meta description", or open Bulk optimize and filter by type, status or issue.
  2. Select posts (up to 2,000 per run), choose the fields, tick Only fill empty fields if you want, pick AI or basic mode and start the run. Progress shows while it works in the background, and you can cancel or resume it.
  3. Open Review queue. Edit, apply or reject each field, use Apply selected, or apply every pending draft of the run at once.

Undo a change

  1. Open History (or the History section in the editor sidebar).
  2. Click Undo on a row, or undo a whole bulk run. If someone edited the field since, the plugin asks before overwriting their work.

Related case studies