v0.4.1 · preparing wordpress.org submission

Open Graph, the way WordPress should have had it.

Full control over meta tags for twelve platforms. One admin UI, per-post and per-archive overrides, live preview, a clean takeover from SEO plugins.

Free · GPL-2.0-or-later · PHP 8.1+ · WordPress 6.2+

218
PHPUnit tests
0.047 ms
Front-page render
12
Platforms
7
SEO plugin takeovers

One plugin, twelve platforms. Each with its own rules.

Facebook
X / Twitter
LinkedIn
iMessage
Threads
Mastodon
Bluesky
WhatsApp
Discord
Pinterest
Telegram
Slack

12 supported platforms out of the box

Try it yourself

Change the title, description, or image on the left and watch the preview update across the six most common platforms.

leonenko.cz · OG demo
leonenko.cz
A website that wins clients without discount stunts
Most company sites say what everyone else says. We'll show how to find a real voice and build a simple information flow.
The plugin emits the meta tags. This shows what platforms render — truncation included.

What it does

Every SEO plugin (Yoast, Rank Math, AIOSEO) does Open Graph "somehow". But they all do it as a side feature — one global Facebook & Twitter block, no preview, no per-platform logic. Open Graph Control flips it. OG is the main product, and everything else adapts to it.

Twelve platforms have their own rules. Pinterest wants a vertical image, iMessage a square one, LinkedIn a longer description, WhatsApp a smaller file size. The plugin knows and watches — each post can override an individual platform, with inline real-time warnings.

Core features

React admin UI · 11 sections

Top-level menu, no filter-only API. Overview, Site defaults, Platforms, Post types, Archive overrides, Images, Fallback chains, Integrations, Security, Debug, Import/Export.

Per-post + per-archive overrides

Every post, category, tag, custom taxonomy, and author has its own OG title / description / image — with live preview for all 12 platforms.

SEO plugin takeover

Detection and clean takeover of OG output from 7 SEO packs (Yoast, Rank Math, AIOSEO, SEOPress, Jetpack, TSF, Slim SEO). No duplicate tags.

Pinterest Rich Pins

Article / Product / Recipe JSON-LD built in. Payload hardened with JSON_HEX_TAG against stored XSS breakout.

Per-platform image sizes

Auto-resize to three sizes (landscape 1200×630, square 600×600, Pinterest 1000×1500). Bulk regeneration for existing attachments.

Length & image validation

Every platform has its own limits. The plugin knows them and flags inline right away, not when you try to share.

Output cache · sub-ms render

Transient-based cache with smart invalidation via save_post / update_option / term_meta / user_meta. Front page 0.047 ms, single post 0.396 ms (mean, 500 iterations).

WP-CLI tooling

wp ogc tags / validate / regenerate / bench. Everything auditable from a terminal, no admin click-through for ops.

Where it works

Every platform has its own Platform class that knows what it does and returns the right tags. The list isn't frozen — the registry is filter-based, new platforms can be added without a fork.

Facebook
X / Twitter
LinkedIn
iMessage
Threads
Mastodon
Bluesky
WhatsApp
Discord
Pinterest
Telegram
Slack

How it works

Install the plugin

Via the WordPress admin (once approved) or manually from a ZIP. The plugin detects the existing SEO pack and offers a clean takeover.

Set global defaults

Image, default content type, Twitter handle, Facebook app ID. All in one React admin UI, without digging into filters.

Share. Everything fits.

Every post gets the right meta tags for every platform. Per-post override is one click away when you need to tune it.

Security & testing

The plugin will run on tens of thousands of sites and has admin-context access. Security isn't an extra feature, it's a precondition. Here's what the code goes through before it reaches you.

Static analysis — PHPStan level 8

The strictest level of PHP type analysis. No mixed types, no implicit conversions, no silent errors. The linter runs as part of CI on every commit.

218 PHPUnit + 30 Playwright tests

218 PHPUnit tests (429 assertions) + 18 Playwright fixture + 12 WP E2E. Critical paths (resolvers, takeover, archive overrides, JSON-LD escaping) covered at 90+ %. A new version isn't published unless the whole suite passes.

Sanitisation and escaping, input and output

Every user input goes through sanitize_text_field / wp_kses / esc_* according to context. No raw echo, no concatenation into HTML. The plugin meets WordPress Coding Standards in strict mode.

Nonces, capabilities, authorisation

Every admin action is protected by wp_verify_nonce(). Before any destructive operation, always current_user_can() with a fine-grained capability (manage_options / edit_posts). No "if you don't see the UI, you can't reach it" thinking.

Prepared SQL

Every DB query goes through $wpdb->prepare() or the ORM. No string concatenation. The plugin passed a SQL injection review across all REST endpoints and admin forms.

Plugin Check + axe-core a11y

WordPress.org's official plugin-check-action runs on every push against the built zip. @axe-core/playwright scans the admin shell, Security panel, Archive overrides, and term edit screen — zero violations (WCAG 2 AA).

Frequently asked

Will the plugin be free?

Yes. Open Graph Control is licensed under GPL-2.0-or-later and aimed at the WordPress Plugin Directory as a fully free plugin. No paywall, no pro versions, no feature gating.

Does it work with my SEO plugin?

Yes — specifically with Yoast SEO, Rank Math, All in One SEO, SEOPress, Jetpack, The SEO Framework, and Slim SEO. The plugin detects their OG output and takes it over cleanly, so the page doesn't end up with duplicate meta tags.

What if I want different tags for one platform?

Every post has a per-post meta box with per-platform override. You can have a different title for LinkedIn (longer, for a B2B audience) and a shorter one for X. The plugin validates lengths and image size in real time.

Does it do Pinterest Rich Pins?

Yes — JSON-LD for Article, Product, and Recipe. The plugin generates the right schema.org code based on content type and per-post override.

How does it handle images?

On install the plugin automatically registers 3 image sizes: landscape 1200×630 (Facebook/Twitter/LinkedIn), square 600×600 (iMessage), and vertical 1000×1500 (Pinterest). WordPress generates them from the featured image.

When will it be on WP.org?

v0.4.1 is feature-complete. Before submission I still need to publish a GitHub Security Advisory for the stored-XSS fix from v0.2.1 and finish PNG banners/icons for the wp.org directory. Then submit. In the meantime, the v0.4.1 zip is on GitHub releases — it bundles both dynamic OG card generation (v0.4.0) and ACF + JetEngine field sources (v0.4.1).

What about performance and data?

The plugin makes no external API calls, ships no telemetry, doesn't phone home. Renders are sub-millisecond — front page 0.047 ms, single post 0.396 ms (mean over 500 iterations via wp ogc bench). The output cache reduces cached contexts to a single get_transient read.

Changelog & plan

  1. v0.4.1April 2026 · current · Dynamic OG cards + Dynamic field sources
    • NEW (v0.4.1): Dynamic field sources — map ACF + JetEngine custom fields into the OG title / description chain per post type
    • NEW (v0.4.1): Settings → Field sources tab with detection badges and per-post-type dropdowns
    • NEW (v0.4.1): Filters ogc_resolve_title_step + ogc_resolve_description_step for external per-step extension of title/description resolvers
    • NEW (v0.4.0): Dynamic OG card generation — server-side rendered 1200×630 PNG card for posts, archives, and authors without their own OG image (~80 % of blogs)
    • NEW (v0.4.0): Card template editor with live preview (debounced 300 ms), customizable background (gradient/solid/image), logo, and text color
    • NEW (v0.4.0): Per-post + per-archive status badges in the meta box and the ArchiveEditor
    • NEW (v0.4.0): 5 REST endpoints under /og-card/* + 4 WP-CLI subcommands (wp ogc cards generate/regenerate/status/purge)
    • NEW (v0.4.0): Filter ogc_card_should_generate + action ogc_card_generated + per-step filter ogc_resolve_image_step
    • NEW (v0.4.0): BackfillCron (daily 5-post sweep) + GcCron (stale version cleanup, 7-day grace) — render-on-save in the shutdown hook, never blocks the editor
    • Bundled Inter font (SIL OFL), cold-start fallback via transient lock
    • Carry-over from v0.3: 12 platforms, per-archive overrides, SEO takeover for 7 plugins, Pinterest Rich Pins, output cache, 3 auto-generated image sizes
    • 359 PHPUnit (656 assertions) + golden cards image-diff CI + PHPStan level 9
    • ImagickRenderer stub in place; full implementation ships in v0.5 (GD is the default and works on 99 % of WP hosts)
  2. v1.0+Planned · Bigger steps
    • Multisite support (network-wide settings + per-site overrides)
    • WordPress block to embed an OG preview card directly in post content
    • Analytics: CTR from Facebook/Twitter across OG variants
    • Multi-template presets, square (600×600) + Pinterest (1000×1500) auto-render
  3. v2.0+Planned · Community & ecosystem
    • Federated sharing via ActivityPub (Mastodon-native, no external services)
    • AI-assisted alt text and meta descriptions for content missing them (opt-in, local model)
    • Ecosystem integrations: Gravity Forms, WooCommerce product variants, Events Calendar
    • Public plugin API for the community — stable namespace, docs, extension template
  4. v3.0+Planned · Research & experiments
    • A/B testing framework for OG variants — track performance of different title/image combinations
    • Schema.org beyond Rich Pins — full structured data suite (Event, Review, HowTo)
    • Headless CMS integration — GraphQL schema for OG payload read/write without admin UI

Technical requirements

  • PHP 8.1 or newer
  • WordPress 6.2 or newer
  • Licence: GPL-2.0-or-later
  • Namespace: EvzenLeonenko\OpenGraphControl
  • Plugin slug: open-graph-control
v0.4.1 release available

Try Open Graph Control before it lands on WP.org.

Grab the v0.4.1 zip from GitHub releases — it bundles dynamic OG card generation (v0.4.0) and ACF + JetEngine field sources (v0.4.1). wordpress.org submission is planned within a couple of weeks — once the GHSA is published and the wp.org directory banners/icons are finished.

Free forever · GPL-2.0-or-later · open-source · zero telemetry