{"id":331707,"date":"2026-06-28T10:05:34","date_gmt":"2026-06-28T10:05:34","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/me-seo-schema-manager\/"},"modified":"2026-06-28T09:50:07","modified_gmt":"2026-06-28T09:50:07","slug":"markexcell-meta-tags-structured-data","status":"publish","type":"plugin","link":"https:\/\/oci.wordpress.org\/plugins\/markexcell-meta-tags-structured-data\/","author":23522858,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"trunk","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"MarkExcell Meta Tags and Structured Data","header_author":"Mark Excell","header_description":"Per-page SEO title, meta description, Open Graph tags, Twitter Card tags, and JSON-LD structured data, with sensible defaults. Built for lean WordPress setups that don't need a full SEO plugin.","assets_banners_color":"","last_updated":"2026-06-28 09:50:07","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/markexcell.co.uk\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":23,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":[],"upgrade_notice":{"1.0.0":"<p>Initial release \u2014 no upgrade steps required.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":[],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The <strong>SEO: Title, Description &amp; Open Graph<\/strong> meta box on the post edit screen.","2":"The <strong>Structured Data (JSON-LD)<\/strong> meta box showing a validation error after a malformed paste."}},"plugin_section":[],"plugin_tags":[2516,683,6487,1117,186],"plugin_category":[55],"plugin_contributors":[269229],"plugin_business_model":[],"class_list":["post-331707","plugin","type-plugin","status-publish","hentry","plugin_tags-json-ld","plugin_tags-meta","plugin_tags-open-graph","plugin_tags-schema","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-markwexcell","plugin_committers-markwexcell"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/markexcell-meta-tags-structured-data.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>MarkExcell Meta Tags and Structured Data<\/strong> is a lightweight plugin for WordPress sites that need precise control over their on-page SEO metadata without installing a full SEO suite.<\/p>\n\n<p>Every feature is controlled from a pair of meta boxes that appear directly on the page or post edit screen, keeping everything in context.<\/p>\n\n<p><strong>What it does:<\/strong><\/p>\n\n<ul>\n<li>Adds a custom <strong>title tag<\/strong> per page or post, with a fallback to the WordPress default (post title + site name).<\/li>\n<li>Adds a custom <strong>meta description<\/strong>, falling back to the post excerpt, then the site-wide tagline.<\/li>\n<li>Outputs <strong>Open Graph tags<\/strong> (<code>og:title<\/code>, <code>og:description<\/code>, <code>og:image<\/code>, <code>og:url<\/code>, <code>og:type<\/code>, <code>og:site_name<\/code>) with per-page overrides.<\/li>\n<li>Outputs <strong>Twitter Card<\/strong> (<code>summary_large_image<\/code>) tags using the same data.<\/li>\n<li>Provides a freeform <strong>JSON-LD structured data<\/strong> field for any page or post, with JSON validation on save and a clear error message if the JSON is malformed.<\/li>\n<li><strong>Auto-generates a <code>BlogPosting<\/code> schema<\/strong> for posts when no manual JSON-LD is provided, referencing your site's <code>#person<\/code> and <code>#website<\/code> entities.<\/li>\n<\/ul>\n\n<p><strong>What it does NOT do:<\/strong><\/p>\n\n<ul>\n<li>No settings pages, no dashboard widgets, no telemetry.<\/li>\n<li>No sitemap generation.<\/li>\n<li>No keyword analysis or content scoring.<\/li>\n<li>No redirection management.<\/li>\n<\/ul>\n\n<p><strong>Important:<\/strong> Do not run this plugin alongside a full SEO plugin (Yoast SEO, Rank Math, All in One SEO, etc.) \u2014 you will get duplicate title tags and meta tags in your <code>&lt;head&gt;<\/code>.<\/p>\n\n<p><strong>For developers:<\/strong><\/p>\n\n<p>Three filters let you customise the site-wide defaults without editing the plugin:<\/p>\n\n<ul>\n<li><code>me_seo_default_description<\/code> \u2014 override the fallback meta description.<\/li>\n<li><code>me_seo_default_og_image<\/code> \u2014 set a site-wide default OG image URL.<\/li>\n<li><code>me_seo_post_types<\/code> \u2014 add additional post types to show the meta boxes on (defaults to <code>page<\/code> and <code>post<\/code>).<\/li>\n<\/ul>\n\n<p>Example:<\/p>\n\n<pre><code>add_filter( 'me_seo_default_description', function() {\n    return 'Your custom site-wide description here.';\n} );\n\nadd_filter( 'me_seo_default_og_image', function() {\n    return 'https:\/\/example.com\/wp-content\/uploads\/default-share.png';\n} );\n\n\/\/ Add meta boxes to a custom post type called 'project'\nadd_filter( 'me_seo_post_types', function( $types ) {\n    $types[] = 'project';\n    return $types;\n} );\n<\/code><\/pre>\n\n<h3>Usage<\/h3>\n\n<h4>SEO: Title, Description &amp; Open Graph meta box<\/h4>\n\n<p><strong>Title tag<\/strong>\nEnter the exact string you want to appear in the browser tab and search results. Leave blank and WordPress will use its default format: <em>Post Title \u2013 Site Name<\/em>.<\/p>\n\n<p>Recommended length: 60 characters or fewer.<\/p>\n\n<p><strong>Meta description<\/strong>\nThe sentence or two that appears beneath your page title in search results. Leave blank to fall back to the post excerpt; if there is no excerpt, the site-wide default description is used.<\/p>\n\n<p>Recommended length: 120\u2013160 characters.<\/p>\n\n<p><strong>Open Graph overrides<\/strong>\nThese three fields let you set different text and image for social sharing without changing the SEO fields above \u2014 useful when the ideal tweet wording differs from the ideal title tag.<\/p>\n\n<ul>\n<li><code>og:title<\/code> \u2014 leave blank to inherit the title tag value.<\/li>\n<li><code>og:description<\/code> \u2014 leave blank to inherit the meta description.<\/li>\n<li><code>og:image URL<\/code> \u2014 paste the full URL of a 1200\u00d7630 px image. Leave blank to use the post's featured image; if there is no featured image, the site-wide default OG image is used (set via the <code>me_seo_default_og_image<\/code> filter).<\/li>\n<\/ul>\n\n<h4>Structured Data (JSON-LD) meta box<\/h4>\n\n<p>Paste a raw JSON-LD object into this field. The plugin will:<\/p>\n\n<ol>\n<li>Validate that the JSON is well-formed.<\/li>\n<li>Check that a top-level <code>@context<\/code> or <code>@graph<\/code> key is present.<\/li>\n<li>Re-encode and store the canonical form on save.<\/li>\n<li>Output it as a <code>&lt;script type=\"application\/ld+json\"&gt;<\/code> block in <code>&lt;head&gt;<\/code> on the front end.<\/li>\n<\/ol>\n\n<p>If the JSON fails validation, an error message is shown at the top of the meta box and the <strong>previous valid value is kept<\/strong> \u2014 your live schema is never broken by a typo.<\/p>\n\n<p>Do <strong>not<\/strong> include the surrounding <code>&lt;script&gt;<\/code> tags \u2014 paste the JSON object only.<\/p>\n\n<p>For posts where this field is left empty, the plugin automatically generates a <code>BlogPosting<\/code> schema using the post title, description, published\/modified dates, featured image, and author\/publisher references pointing to your site's <code>#person<\/code> and <code>#website<\/code> entities.<\/p>\n\n<h4>Fallback chain summary<\/h4>\n\n\n\n\n  Field\n  Primary\n  Secondary\n  Tertiary\n\n\n\n\n  Title tag\n  SEO title field\n  WordPress default (title + site name)\n  \u2014\n\n\n  Meta description\n  Description field\n  Post excerpt\n  Site tagline \/ filter default\n\n\n  og:title\n  OG title field\n  SEO title field\n  WordPress default title\n\n\n  og:description\n  OG description field\n  Meta description (resolved above)\n  \u2014\n\n\n  og:image\n  OG image URL field\n  Featured image\n  <code>me_seo_default_og_image<\/code> filter\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>markexcell-meta-tags-structured-data<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin from <strong>Plugins \u2192 Installed Plugins<\/strong> in your WordPress admin.<\/li>\n<li>Open any page or post for editing \u2014 two new meta boxes will appear:\n\n<ul>\n<li><strong>SEO: Title, Description &amp; Open Graph<\/strong> (near the top of the edit screen)<\/li>\n<li><strong>Structured Data (JSON-LD)<\/strong> (below the main editor)<\/li>\n<\/ul><\/li>\n<li>Fill in whichever fields you need, or leave them empty to use the automatic fallbacks.<\/li>\n<li>Publish or update the post\/page as normal.<\/li>\n<\/ol>\n\n<p>There is no settings page to configure.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20conflict%20with%20yoast%20seo%20%2F%20rank%20math%20%2F%20all%20in%20one%20seo%3F\"><h3>Will this conflict with Yoast SEO \/ Rank Math \/ All in One SEO?<\/h3><\/dt>\n<dd><p>Yes \u2014 running any two SEO plugins that output title tags and Open Graph meta simultaneously will produce duplicate tags. Deactivate your existing SEO plugin before using this plugin, or vice versa.<\/p><\/dd>\n<dt id=\"the%20json-ld%20field%20says%20%22last%20save%20rejected%22%20%E2%80%94%20what%20do%20i%20do%3F\"><h3>The JSON-LD field says \"Last save rejected\" \u2014 what do I do?<\/h3><\/dt>\n<dd><p>The JSON you pasted is either malformed or is missing a top-level <code>@context<\/code> or <code>@graph<\/code> key. Copy your JSON into a validator such as <a href=\"https:\/\/validator.schema.org\">validator.schema.org<\/a> or <a href=\"https:\/\/jsonlint.com\">jsonlint.com<\/a> to find the error, correct it, and save again. Your previously saved schema remains live until a valid replacement is submitted.<\/p><\/dd>\n<dt id=\"how%20do%20i%20set%20a%20site-wide%20default%20og%20image%3F\"><h3>How do I set a site-wide default OG image?<\/h3><\/dt>\n<dd><p>Use the <code>me_seo_default_og_image<\/code> filter in your theme's <code>functions.php<\/code> or a small mu-plugin:<\/p>\n\n<pre><code>add_filter( 'me_seo_default_og_image', function() {\n    return 'https:\/\/example.com\/path\/to\/default-share-image.png';\n} );\n<\/code><\/pre><\/dd>\n<dt id=\"the%20auto-generated%20blogposting%20schema%20references%20%60%23person%60%20and%20%60%23website%60%20%E2%80%94%20where%20do%20i%20define%20those%3F\"><h3>The auto-generated BlogPosting schema references `#person` and `#website` \u2014 where do I define those?<\/h3><\/dt>\n<dd><p>You define them on your homepage (or a suitable page) using the Structured Data (JSON-LD) meta box. Paste a JSON-LD <code>@graph<\/code> that includes your <code>Person<\/code> and <code>WebSite<\/code> entities with the matching <code>@id<\/code> values. The plugin references them by ID; it does not duplicate the full entity on every post.<\/p><\/dd>\n<dt id=\"can%20i%20add%20the%20meta%20boxes%20to%20custom%20post%20types%3F\"><h3>Can I add the meta boxes to custom post types?<\/h3><\/dt>\n<dd><p>Yes, using the <code>me_seo_post_types<\/code> filter:<\/p>\n\n<pre><code>add_filter( 'me_seo_post_types', function( $types ) {\n    $types[] = 'your_custom_post_type';\n    return $types;\n} );\n<\/code><\/pre><\/dd>\n<dt id=\"does%20the%20plugin%20need%20%60add_theme_support%28%20%27title-tag%27%20%29%60%20to%20work%3F\"><h3>Does the plugin need `add_theme_support( 'title-tag' )` to work?<\/h3><\/dt>\n<dd><p>Yes. The title tag override relies on WordPress managing the <code>&lt;title&gt;<\/code> element. Most modern themes already declare this support. If your theme hard-codes a <code>&lt;title&gt;<\/code> element in <code>header.php<\/code>, the custom title field will have no effect until that is removed.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Per-page SEO titles, meta descriptions, Open Graph tags, Twitter Cards, and JSON-LD structured data \u2014 no bloat, no settings pages.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/331707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=331707"}],"author":[{"embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/markwexcell"}],"wp:attachment":[{"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=331707"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=331707"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=331707"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=331707"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=331707"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/oci.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=331707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}