Read this first.
From a fresh install to wiring custom schema with filters. Written by the team that ships the plugin.
# Introduction
Metasift is an SEO toolkit that lives inside WordPress. It replaces the meta box, sitemap generator, schema renderer and rank tracker you currently run as four separate plugins, with a single panel that scores your content against what already ranks.
This guide takes you from a fresh install to a fully configured site in the order most publishers need. Each section stands alone — if you only came here to wire up FAQ schema, jump straight to Schema markup.
New here? Most sites are production-ready after the four-minute setup wizard. Come back to the rest when you need it.
# Requirements
Metasift is conservative about dependencies. If your site runs a current WordPress, it will run Metasift.
- WordPress 6.2 or newer (works on the Classic Editor plugin too)
- PHP 7.4 minimum, 8.1 or newer recommended for faster analysis
- MySQL 5.7 or MariaDB 10.3+
- HTTPS — Google indexes the https version; sitemaps and schema assume it
- A theme that serves
srcseton images (core since 5.4) for image sitemaps
On PHP 8.2+, Metasift suppresses the dynamic-property deprecation notice for third-party themes rather than forcing you to patch them.
# Installation
Three ways to install. Use the dashboard upload unless your server blocks zip uploads.
From the dashboard
- Download the zip from your account — the file is named
metasift-3.2.zip. - Upload it at Plugins ▸ Add New ▸ Upload Plugin, choose the zip, click Install Now.
- Activate Metasift from the plugins list. On activation it scans your theme and prints a one-line health check to Metasift ▸ Tools ▸ System status.
Over FTP
Unzip locally and upload the metasift/ folder to /wp-content/plugins/. Make sure the folder is writable by the web server so the sitemap cache can write at runtime.
With WP-CLI
For scripted or multisite installs, use the CLI directly:
wp plugin install metasift-3.2.zip --activate
wp metasift wizard run --business="Cafe" --type=LocalBusiness
Don't keep two SEO plugins active. Metasift detects a second sitemap or meta handler and pauses its own to avoid duplicate output, but you'll lose features. Deactivate the old plugin once the import finishes.
# License activation
Your license key lives at Metasift ▸ Settings ▸ License. Paste the key from your purchase receipt and click Activate. The key is validated once, then stored locally — updates pull from the CDN without phoning home on every page load.
- Solo — valid on 1 production site plus 1 staging clone
- Pro — 3 sites, each with its own staging domain
- Agency — 25 sites, deactivate and move keys freely
Staging domains (those matching .local, .test, staging., .wpengineinst and similar) never count against your limit.
# Setup wizard
After activation, Metasift opens a seven-step wizard. It configures roughly 90% of sites correctly with no manual editing. The steps:
- Entity — pick Person, Company or Local Business. Sets the organization schema and the homepage title template.
- Social profiles — paste URLs for
sameAs. Skip the ones you don't use; they won't render. - Title format — accept the recommended templates or edit. Variables are live, so you see your real homepage title.
- Default social image — used when a post has no featured image. Upload once; Metasift crops the sizes Open Graph and Twitter need.
- Old plugin import — if Yoast, Rank Math or AIOSEO is detected, the importer runs here and lists what it transferred.
- Webmaster verification — paste Google, Bing and Pinterest tokens. Metasift injects them into
<head>for you. - First keyword — add one tracked keyword to confirm rank tracking is online. Batch-import the rest later.
Re-run any step from Metasift ▸ Settings ▸ General ▸ Re-run wizard without losing existing settings.
# Titles & meta
Metasift generates titles and meta descriptions from templates per content type, then lets you override any single post in the editor sidebar. Templates use variables wrapped in double braces.
{{post_title}} — {{term_1}} guide | {{site_name}}
{{term_1}}, {{term_2}} reviewed for {{current_year}}
Available variables include {{post_title}}, {{site_name}}, {{term_1}} (your focus keyword), {{current_year}}, {{author}}, {{page}} for paginated archives, and {{separator}}, which defaults to an em dash. Title length is validated live against Google's pixel-width truncation, not a character count.
Changing the separator
Filter the separator from your theme's functions.php:
add_filter( 'metasift/title_separator', function () {
return '·';
} );
# XML sitemaps
Sitemaps are on by default at /metasift-sitemap.xml. Metasift splits them by content type — post-sitemap.xml, page-sitemap.xml, one per custom post type and taxonomy — so large sites never serve a single bloated file.
The <lastmod> value reflects the last time the page actually rendered, not the post_modified column. This matters: editing a typo bumps post_modified but doesn't change the rendered output, and we don't want to tell Google something changed when it didn't.
Excluding content
Use the per-post toggle in the sidebar, or exclude by rule at Metasift ▸ Sitemaps ▸ Rules. For programmatic control:
add_filter( 'metasift/sitemap_include_post', function ( $include, $post ) {
if ( $post->post_type === 'ad_slot' ) {
return false;
}
return $include;
}, 10, 2 );
# Schema markup
Schema is output as JSON-LD in the page footer. Metasift assembles a @graph with Organization, WebSite, BreadcrumbList and the content-specific type, then validates the final JSON against Google's Rich Results rules before it reaches the DOM.
Adding a custom type
Say you have a "Course" custom post type. Register its schema with a single filter:
add_filter( 'metasift/schema_for_post_type', function ( $schema, $post ) {
if ( $post->post_type !== 'course' ) {
return $schema;
}
return array(
'@type' => 'Course',
'name' => get_the_title( $post ),
'provider' => array( '@type' => 'Organization', 'name' => get_bloginfo( 'name' ) ),
'inLanguage' => get_post_meta( $post->ID, 'course_lang', true ) ?: 'en',
);
}, 10, 2 );
Test the output by appending ?metasift_schema=raw to any URL while logged in as an editor — it prints the JSON-LD @graph for that page so you can paste it straight into Google's Rich Results Test.
FAQ and HowTo blocks render inline schema from their content, so you don't fill the same data twice. Disable a block's schema from its toolbar if you've covered it elsewhere.
# Content analysis
Open any post and the Metasift sidebar scores it against the live top ten for your focus keyword. The score is a weighted blend of four pillars, each visible as its own bar:
- Keyword — placement in title, H1, slug, first 100 words and image alt text
- Topic coverage — entities present in top-ranking pages, pulled from the current SERP
- Readability — sentence length, grade level and passive-voice ratio, tuned to your niche
- Technical — internal link count, outbound authority links, image sizes and heading order
Each check links to the exact paragraph it refers to, so fixing a warning is a click rather than a hunt. The pillar weights are editable at Metasift ▸ Analysis ▸ Scoring if your team weights readability above keyword density.
Analysis runs entirely in your browser while editing — no requests to the server as you type. SERP entity data is fetched once and cached locally for 24 hours.
# Redirect manager
Find it at Metasift ▸ Redirects. Add 301, 302 and 307 redirects, group them, and log every hit. Paths support plain matches, wildcards (/old/*) and full regex.
Two safety nets run before a redirect is saved: a loop detector that rejects A→B→A, and a chain-shortener that rewrites A→B and B→C into A→C automatically. When you rename a post slug, Metasift offers to create a redirect from the old URL in the publish metabox.
source: ^/blog/([0-9]{4})/(.*)$
target: /articles/$2
type: 301 permanent
# Rank tracking
Add keywords at Metasift ▸ Rankings. For each keyword you choose a location, device and search engine. Positions refresh daily; force an update for a single keyword from its row.
Group keywords by the page they target — Metasift suggests a target URL based on your current ranking URL, and flags when a keyword starts ranking for a different page than the one you intended. Connect Search Console at Metasift ▸ Integrations to overlay real impressions and clicks on the same chart.
Tracking consumes your plan's keyword quota. Deleting a keyword frees its slot immediately but keeps its history for 90 days in case you re-add it.
# Hooks & filters
Metasift is built to be extended without editing plugin files. The most common filters:
add_filter( 'metasift/title_separator', '__return_empty_string', 10 );
add_action( 'metasift/after_analysis', function ( $score, $post_id ) {
if ( $score['total'] < 60 ) {
error_log( "Post {$post_id} scored {$score['total']} before publish." );
}
}, 10, 2 );
add_filter( 'metasift/og_image_size', function () {
return 'social-wide';
} );
Reference
metasift/title_separator— string, the title segment separatormetasift/meta_description_default— auto-generated description before manual overridemetasift/sitemap_include_post— boolean per post, exclude withfalsemetasift/schema_for_post_type— array, the JSON-LD payload for a post typemetasift/og_image_size— registered image size name used for social previewsmetasift/analysis_weights— array of pillar weights, must sum to 100metasift/after_analysis— action, receives the score array and post ID
# WP-CLI
Metasift ships a wp metasift namespace for automation and bulk work. Useful commands:
wp metasift sitemap flush # rebuild + warm the sitemap cache
wp metasift redirect scan # find changed slugs, add 301s
wp metasift track add "running shoes" --location=US --device=mobile
wp metasift license activate KEY # activate without the admin UI
Run wp metasift with no arguments for the full list. Every command supports --format=json for piping into other tools.
# Troubleshooting
The sitemap returns a 404
This is almost always a permalink issue. Visit Settings ▸ Permalinks and click Save once to flush rewrite rules. On nginx, confirm your config passes non-existent files to index.php; Metasift's sitemap is a virtual path, not a real file.
My score doesn't update as I type
Analysis debounces for one second after you stop typing. If it never fires, check the browser console — a syntax-highlighting or minification plugin occasionally strips the inline dependency. The Metasift ▸ Tools ▸ System status screen reports a broken dependency explicitly.
Schema isn't showing in Google's test
First confirm the JSON-LD is in your page source with ?metasift_schema=raw. If it's there but Google rejects it, the validation log at Metasift ▸ Schema ▸ Log names the exact failing property. The most common cause is a required field left empty in a Product or Review block.
Still stuck
Email support with the output of Metasift ▸ Tools ▸ System status attached. Pro and Agency plans get a first reply within one business day; a real engineer reads every ticket.