Free tool

SEO Field Reference

Where Yoast, Rank Math, All in One SEO and SEOPress store the SEO title, meta description and social fields, checked against live installs, with the traps that make a correct write look broken.

Verified on

  • Yoast SEO28.5 (free)
  • Rank Math1.0.278 (free)
  • All in One SEO5.0.1.1 (free)
  • SEOPress10.2 (free)

Each plugin was the only SEO plugin active. SnippetGrove 0.54.4 wrote all six fields below through it, then read the plugin’s own rendered page before the write, after it and after undo. The page carried one title and no duplicate tags, and post_modified did not change. The whole matrix passed on WordPress 6.9.4 / PHP 8.5.6 and on WordPress 7.1.1 / PHP 8.5.6. Only the free editions were tested.

Every field, every plugin

Post meta keys, except All in One SEO, where these are columns of its own table. Table names use WordPress’s default wp_ prefix; yours may differ.

Where each SEO plugin stores the SEO title, meta description, Open Graph and X fields for a post, verified 19 September 2026.
FieldYoast SEO 28.5Rank Math 1.0.278All in One SEO 5.0.1.1SEOPress 10.2
Stored inwp_postmetawp_postmetawp_aioseo_postswp_postmeta
SEO title_yoast_wpseo_titlerank_math_titletitle_seopress_titles_title
Meta description_yoast_wpseo_metadescrank_math_descriptiondescription_seopress_titles_desc
Open Graph title_yoast_wpseo_opengraph-titlerank_math_facebook_titleog_title_seopress_social_fb_title
Open Graph description_yoast_wpseo_opengraph-descriptionrank_math_facebook_descriptionog_description_seopress_social_fb_desc
X (Twitter) card title_yoast_wpseo_twitter-titlerank_math_twitter_titletwitter_title_seopress_social_twitter_title
X (Twitter) card description_yoast_wpseo_twitter-descriptionrank_math_twitter_descriptiontwitter_description_seopress_social_twitter_desc

Plugin by plugin

Yoast SEO

verified 28.5 (free)

Post meta — but the page is rendered from Yoast's own indexables table. The fields live in wp_postmeta.

SEO title
_yoast_wpseo_title
Meta description
_yoast_wpseo_metadesc
Open Graph title
_yoast_wpseo_opengraph-title
Open Graph description
_yoast_wpseo_opengraph-description
X (Twitter) card title
_yoast_wpseo_twitter-title
X (Twitter) card description
_yoast_wpseo_twitter-description

The indexables trap

Yoast renders the page from wp_yoast_indexable, not from post meta. Update _yoast_wpseo_metadesc directly and the value is stored correctly while the page keeps serving the old one, until the post's indexable is rebuilt. After writing, SnippetGrove deletes that post's indexable through Yoast's own classes, and Yoast rebuilds it from post meta on the next request. It does not re-save the post, because that would change post_modified on every post a bulk run touches.

Verified on Yoast SEO 28.1, .

An empty field is not an empty page

With _yoast_wpseo_metadesc empty, Yoast still renders a description built from its template fallback. The rendered tag tells you what the page serves. The stored field tells you whether anyone actually wrote a description, and that is what an audit needs to know.

Verified on Yoast SEO 28.1, .

Rank Math

verified 1.0.278 (free)

Post meta, read directly by the page. The fields live in wp_postmeta.

SEO title
rank_math_title
Meta description
rank_math_description
Open Graph title
rank_math_facebook_title
Open Graph description
rank_math_facebook_description
X (Twitter) card title
rank_math_twitter_title
X (Twitter) card description
rank_math_twitter_description

Stored X fields do not render while X inherits Open Graph

While a post's X card is set to use its Open Graph data, Rank Math ignores whatever is stored in rank_math_twitter_title and rank_math_twitter_description. The per-post switch is the rank_math_twitter_use_facebook post meta key. SnippetGrove sets it to off when it writes X text, and on undo it puts back the original value, or removes the key if there was none.

Verified on Rank Math 1.0.278, .

Nothing renders until the setup wizard is finished

On a fresh install Rank Math printed no SEO tags at all, not even its own, until its setup wizard was completed. The wizard can be finished without connecting an account by using the Skip Step control. Until then, correctly stored values are invisible.

Verified on Rank Math 1.0.275, .

All in One SEO

verified 5.0.1.1 (free)

Its own table, one row per post, through its Post model. The fields live in wp_aioseo_posts.

SEO title
title
Meta description
description
Open Graph title
og_title
Open Graph description
og_description
X (Twitter) card title
twitter_title
X (Twitter) card description
twitter_description

Not post meta at all

AIOSEO keeps these fields as columns of wp_aioseo_posts, not in post meta. Go through its model, AIOSEO\Plugin\Common\Models\Post::getPost( $post_id ), which returns an unsaved record for a post that has never had one. The model caches each post for the rest of the request, so check a write from a second request. Reading it back in the same request only returns the object you just changed.

Verified on All in One SEO 4.9.10, .

The X card can inherit Open Graph

The post's twitter_use_og setting decides whether the X card uses the Open Graph fields. With it on, text stored in twitter_title and twitter_description does not reach the page. SnippetGrove sets it to 0 when it writes X text and restores the original setting on undo.

Verified on All in One SEO 5.0.1.1, .

SEOPress

verified 10.2 (free)

Post meta, read directly by the page. The fields live in wp_postmeta.

SEO title
_seopress_titles_title
Meta description
_seopress_titles_desc
Open Graph title
_seopress_social_fb_title
Open Graph description
_seopress_social_fb_desc
X (Twitter) card title
_seopress_social_twitter_title
X (Twitter) card description
_seopress_social_twitter_desc

Plain post meta, no cache layer

A post meta write showed up in the rendered page with nothing else to rebuild. Watch the names: Open Graph keys say fb and X keys say twitter.

Verified on SEOPress 10.2, .

Image alt text

Not an SEO plugin field. WordPress core stores it as post meta on the attachment, under _wp_attachment_image_alt, and SnippetGrove writes it there whichever plugin is active. Write and undo verified on WordPress 6.4 and 7.1.1, .

None of the four active

SnippetGrove falls back to its own keys, _wp_shelf_seo_title and _wp_shelf_seo_description, and prints the title and description tags itself. Those keys belong to SnippetGrove, not to any SEO plugin. Verified in the same matrix with SnippetGrove 0.54.4.

Why this page exists

Yoast SEO, Rank Math, All in One SEO and SEOPress store the same handful of fields, and no two of them use the same names. Writing to the wrong place fails silently: the value is saved, nothing errors, and the page doesn’t change. The names above come from the adapters SnippetGrove writes through, and we publish a name only after a live install has confirmed it.

Where the stored value and the page disagree

A correct key is not always enough. The reference above records four ways a value can be saved and still not reach the page:

  • Yoast SEOrenders from its indexables table. Updating post meta directly leaves the old value on the page until that post’s indexable is rebuilt.
  • All in One SEO has no post meta for these fields at all. They are columns of wp_aioseo_posts, behind its Post model.
  • Rank Math and All in One SEOcan make a post’s X card inherit Open Graph. While they do, X text you stored does not appear.
  • Rank Math 1.0.275 printed no SEO tags at all on a fresh install until its setup wizard was finished.

It also works the other way. An empty stored field does not mean an empty tag. Yoast rendered a templated description for a post whose _yoast_wpseo_metadesc was empty. So if you want to know whether anyone wrote a description, read the stored field, not the page.

Reading them from PHP

For the three post meta plugins, get_post_meta() with the key from the table is enough to read a value. All in One SEO needs its model:

// Yoast SEO, Rank Math, SEOPress: post meta
$desc = get_post_meta( $post_id, '_yoast_wpseo_metadesc', true );
$desc = get_post_meta( $post_id, 'rank_math_description', true );
$desc = get_post_meta( $post_id, '_seopress_titles_desc', true );

// All in One SEO: a row in wp_aioseo_posts, through its model
$desc = \AIOSEO\Plugin\Common\Models\Post::getPost( $post_id )->description;

Writing takes more care than reading. On Yoast, refresh the post’s indexable afterwards. On All in One SEO, set the property and call save() on the model, then check the value from a separate request. The model caches the post, so reading it back in the same request only returns the object you just changed.

What this page leaves out

SnippetGrove’s adapters also read focus keyphrases and category and tag (term) metadata. Neither was part of a live verification, so their names are not listed here. The same goes for canonical URLs, robots settings, schema and the premium editions of these plugins, which were not tested. We would rather leave a gap than publish a name nobody checked.

How it stays accurate

Each plugin row carries the version it was verified on, and each note carries its own version and date. These plugins change how they store data between major releases, so a version newer than the one listed has not been checked. Before you rely on a name in production, write a test value on a staging copy and check that your own site renders it.

Frequently asked questions

Where does Yoast SEO store the meta description?
In post meta, under _yoast_wpseo_metadesc, with the SEO title in _yoast_wpseo_title. The page is not rendered from post meta, though. It comes from Yoast's own wp_yoast_indexable table, which is why updating the post meta directly can leave the page showing the old value. Verified on Yoast SEO 28.5, 19 September 2026.
Does All in One SEO use post meta?
No. All in One SEO keeps the SEO title, meta description and social fields as columns of its own wp_aioseo_posts table: title, description, og_title, og_description, twitter_title and twitter_description. Read and write them through its AIOSEO\Plugin\Common\Models\Post model. Verified on All in One SEO 5.0.1.1, 19 September 2026.
I updated the Yoast meta description in the database. Why does the page still show the old one?
Because Yoast renders from its indexable for that post, not from post meta. Until the indexable is rebuilt, the page keeps serving what it held before. Deleting the post's indexable through Yoast's own classes makes Yoast rebuild it on the next request, without re-saving the post. Verified on Yoast SEO 28.1, 29 July 2026, and in the 28.5 matrix.
Why do my X (Twitter) card fields not show up in Rank Math or All in One SEO?
Both plugins can make a post's X card inherit its Open Graph data, and while that is on, stored X text is ignored. In Rank Math the per-post switch is the rank_math_twitter_use_facebook post meta key. In All in One SEO it is the twitter_use_og setting on the post's row. Verified on Rank Math 1.0.278 and All in One SEO 5.0.1.1, 19 September 2026.
How current is this reference?
The six fields for each plugin were verified on 19 September 2026 against the free editions of Yoast SEO 28.5, Rank Math 1.0.278, All in One SEO 5.0.1.1, SEOPress 10.2, one plugin at a time, on WordPress 6.9.4 and 7.1.1. Each note on the page carries the version and date it was checked on. These plugins change storage details between major versions, so a new major release is the point to check again.

SnippetGrove generates these fields in bulk and writes them through whichever of these plugins your site runs, with undo.

See how SnippetGrove works