{"id":302780,"date":"2026-05-19T11:23:53","date_gmt":"2026-05-19T11:23:53","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/codedication-schema-blocks\/"},"modified":"2026-09-01T09:03:43","modified_gmt":"2026-09-01T09:03:43","slug":"codedication-schema-blocks","status":"publish","type":"plugin","link":"https:\/\/dsb.wordpress.org\/plugins\/codedication-schema-blocks\/","author":23479631,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.0","stable_tag":"2.1.0","tested":"7.1","requires":"6.5","requires_php":"8.0","requires_plugins":null,"header_name":"Schema Blocks","header_author":"Codedication","header_description":"FAQ schema and review schema Gutenberg blocks that generate Schema.org JSON-LD for rich snippets and structured data SEO.","assets_banners_color":"153045","last_updated":"2026-09-01 09:03:43","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/codedication.com","header_plugin_uri":"https:\/\/codedication.com\/plugins\/schema-blocks","header_author_uri":"https:\/\/codedication.com","rating":5,"author_block_rating":0,"active_installs":20,"downloads":542,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"codedication","date":"2026-05-19 11:23:36","revision":3537180},"1.0.2":{"tag":"1.0.2","author":"codedication","date":"2026-05-20 10:27:25","revision":3538862},"1.1.0":{"tag":"1.1.0","author":"codedication","date":"2026-07-04 10:09:02","revision":3595870},"1.2.0":{"tag":"1.2.0","author":"codedication","date":"2026-08-15 11:39:47","revision":3648512},"2.0.0":{"tag":"2.0.0","author":"codedication","date":"2026-08-19 09:35:37","revision":3654286},"2.1.0":{"tag":"2.1.0","author":"codedication","date":"2026-09-01 09:03:43","revision":3675724}},"upgrade_notice":{"2.1.0":"<p>Settings are five tabs, the Entities tab draws the site graph, and the interface now speaks ten languages. Breaking for addons: the settings payload replaces the three social-profile fields with <code>site_identity.same_as<\/code> \/ <code>person.person_same_as<\/code>. Normal sites need no migration.<\/p>","2.0.0":"<p>Seven new blocks (nine in total), per-author E-E-A-T profiles and per-post content and page type overrides. Existing FAQ and Review blocks are unchanged.<\/p>","1.0.3":"<p>Adds an animated +\/\u00d7 icon to FAQ items (CSS-only, accessible). No breaking changes.<\/p>","1.0.2":"<p>Translatable Review block labels reach the <code>.pot<\/code> and apply at render. Tested with WordPress 7.0.<\/p>","1.0.1":"<p>Fixes the Settings page appearing empty under the centralized admin. Saved values now hydrate correctly. Recommended upgrade.<\/p>","1.0.0":"<p>First release \u2014 FAQ Block with FAQPage schema and Review Block with star ratings and JSON-LD output.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3537180,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3537180,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3537180,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3537180,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3675724,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/post.php?post=1&action=edit\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"login\":true,\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"codedication-schema-blocks\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php require '\\\/wordpress\\\/wp-load.php'; $content = \\\"<!-- wp:paragraph -->\\\\n<p>Every block this plugin ships. Select one to see its editor card, or view the page and search the source for <code>application\\\/ld+json<\\\/code> to see the single connected graph they produce together.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">Recipe<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-recipe {\\\\\\\"blockId\\\\\\\":\\\\\\\"bpr000000001\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Tortilla de patatas\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"The classic Spanish potato omelette: slow-poached potatoes and onion folded through beaten egg.\\\\\\\",\\\\\\\"prepTime\\\\\\\":\\\\\\\"PT20M\\\\\\\",\\\\\\\"cookTime\\\\\\\":\\\\\\\"PT35M\\\\\\\",\\\\\\\"totalTime\\\\\\\":\\\\\\\"PT55M\\\\\\\",\\\\\\\"recipeYield\\\\\\\":\\\\\\\"6 servings\\\\\\\",\\\\\\\"recipeCategory\\\\\\\":\\\\\\\"Main course\\\\\\\",\\\\\\\"recipeCuisine\\\\\\\":\\\\\\\"Spanish\\\\\\\",\\\\\\\"usePostAuthor\\\\\\\":true,\\\\\\\"ratingValue\\\\\\\":4.7,\\\\\\\"reviewCount\\\\\\\":128} -->\\\\n<!-- wp:codedication\\\/schema-recipe-ingredients {\\\\\\\"ingredients\\\\\\\":[\\\\\\\"6 medium waxy potatoes, peeled and thinly sliced\\\\\\\",\\\\\\\"1 large brown onion, finely sliced\\\\\\\",\\\\\\\"6 free-range eggs\\\\\\\",\\\\\\\"250 ml extra virgin olive oil\\\\\\\",\\\\\\\"1 tsp fine sea salt\\\\\\\"]} \\\/-->\\\\n\\\\n<!-- wp:codedication\\\/schema-recipe-instructions {\\\\\\\"steps\\\\\\\":[{\\\\\\\"text\\\\\\\":\\\\\\\"Warm the olive oil in a deep frying pan over a low heat, then add the potatoes and onion.\\\\\\\",\\\\\\\"image\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"imageId\\\\\\\":0},{\\\\\\\"text\\\\\\\":\\\\\\\"Poach gently for 25 minutes until tender but not coloured. Drain, keeping 2 tbsp of the oil.\\\\\\\",\\\\\\\"image\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"imageId\\\\\\\":0},{\\\\\\\"text\\\\\\\":\\\\\\\"Beat the eggs, fold the warm potatoes through them and rest for 10 minutes.\\\\\\\",\\\\\\\"image\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"imageId\\\\\\\":0},{\\\\\\\"text\\\\\\\":\\\\\\\"Cook over a medium-low heat for 5 minutes, invert, then 4 minutes more. Rest before slicing.\\\\\\\",\\\\\\\"image\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"imageId\\\\\\\":0}]} \\\/-->\\\\n\\\\n<!-- wp:codedication\\\/schema-recipe-nutrition {\\\\\\\"servingSize\\\\\\\":\\\\\\\"1 wedge\\\\\\\",\\\\\\\"calories\\\\\\\":\\\\\\\"318\\\\\\\",\\\\\\\"fatContent\\\\\\\":\\\\\\\"19\\\\\\\",\\\\\\\"saturatedFatContent\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"carbohydrateContent\\\\\\\":\\\\\\\"26\\\\\\\",\\\\\\\"sugarContent\\\\\\\":\\\\\\\"2\\\\\\\",\\\\\\\"fiberContent\\\\\\\":\\\\\\\"3\\\\\\\",\\\\\\\"proteinContent\\\\\\\":\\\\\\\"11\\\\\\\",\\\\\\\"sodiumContent\\\\\\\":\\\\\\\"480\\\\\\\",\\\\\\\"cholesterolContent\\\\\\\":\\\\\\\"186\\\\\\\"} \\\/-->\\\\n<!-- \\\/wp:codedication\\\/schema-recipe -->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">Product<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-product {\\\\\\\"blockId\\\\\\\":\\\\\\\"bpp000000001\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Carbon-steel paella pan, 34 cm\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Traditional polished carbon-steel pan with riveted handles.\\\\\\\",\\\\\\\"sku\\\\\\\":\\\\\\\"PAN-CS-34\\\\\\\",\\\\\\\"gtin\\\\\\\":\\\\\\\"8412345678905\\\\\\\",\\\\\\\"brandIsSite\\\\\\\":true,\\\\\\\"price\\\\\\\":\\\\\\\"39.95\\\\\\\",\\\\\\\"priceCurrency\\\\\\\":\\\\\\\"GBP\\\\\\\",\\\\\\\"availability\\\\\\\":\\\\\\\"InStock\\\\\\\",\\\\\\\"ratingValue\\\\\\\":4.6,\\\\\\\"reviewCount\\\\\\\":87} \\\/-->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">Event<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-event {\\\\\\\"blockId\\\\\\\":\\\\\\\"bpe000000001\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"Structured Data Masterclass\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"A one-day workshop on Schema.org modelling for editorial teams.\\\\\\\",\\\\\\\"startDate\\\\\\\":\\\\\\\"2026-10-08T09:30\\\\\\\",\\\\\\\"endDate\\\\\\\":\\\\\\\"2026-10-08T17:00\\\\\\\",\\\\\\\"locationType\\\\\\\":\\\\\\\"Place\\\\\\\",\\\\\\\"locationName\\\\\\\":\\\\\\\"Barbican Conference Centre\\\\\\\",\\\\\\\"streetAddress\\\\\\\":\\\\\\\"Silk Street\\\\\\\",\\\\\\\"addressLocality\\\\\\\":\\\\\\\"London\\\\\\\",\\\\\\\"postalCode\\\\\\\":\\\\\\\"EC2Y 8DS\\\\\\\",\\\\\\\"addressCountry\\\\\\\":\\\\\\\"GB\\\\\\\",\\\\\\\"organizerIsSite\\\\\\\":true,\\\\\\\"offerPrice\\\\\\\":\\\\\\\"180.00\\\\\\\",\\\\\\\"offerCurrency\\\\\\\":\\\\\\\"GBP\\\\\\\",\\\\\\\"offerAvailability\\\\\\\":\\\\\\\"InStock\\\\\\\",\\\\\\\"eventStatus\\\\\\\":\\\\\\\"EventScheduled\\\\\\\",\\\\\\\"eventAttendanceMode\\\\\\\":\\\\\\\"OfflineEventAttendanceMode\\\\\\\"} \\\/-->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">Local Business<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-local-business {\\\\\\\"blockId\\\\\\\":\\\\\\\"bpl000000001\\\\\\\",\\\\\\\"businessType\\\\\\\":\\\\\\\"Restaurant\\\\\\\",\\\\\\\"name\\\\\\\":\\\\\\\"La Sobremesa\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Neighbourhood tapas kitchen serving Andalusian small plates.\\\\\\\",\\\\\\\"servesCuisine\\\\\\\":\\\\\\\"Spanish, Tapas, Andalusian\\\\\\\",\\\\\\\"streetAddress\\\\\\\":\\\\\\\"14 Bridge Street\\\\\\\",\\\\\\\"addressLocality\\\\\\\":\\\\\\\"Bristol\\\\\\\",\\\\\\\"postalCode\\\\\\\":\\\\\\\"BS1 4TW\\\\\\\",\\\\\\\"addressCountry\\\\\\\":\\\\\\\"GB\\\\\\\",\\\\\\\"telephone\\\\\\\":\\\\\\\"+44 117 496 0142\\\\\\\",\\\\\\\"priceRange\\\\\\\":\\\\\\\"$$\\\\\\\",\\\\\\\"latitude\\\\\\\":\\\\\\\"51.4536\\\\\\\",\\\\\\\"longitude\\\\\\\":\\\\\\\"-2.5977\\\\\\\",\\\\\\\"ratingValue\\\\\\\":4.8,\\\\\\\"reviewCount\\\\\\\":212,\\\\\\\"openingHours\\\\\\\":[{\\\\\\\"days\\\\\\\":[\\\\\\\"Tuesday\\\\\\\",\\\\\\\"Wednesday\\\\\\\",\\\\\\\"Thursday\\\\\\\"],\\\\\\\"opens\\\\\\\":\\\\\\\"17:30\\\\\\\",\\\\\\\"closes\\\\\\\":\\\\\\\"23:00\\\\\\\"},{\\\\\\\"days\\\\\\\":[\\\\\\\"Friday\\\\\\\",\\\\\\\"Saturday\\\\\\\"],\\\\\\\"opens\\\\\\\":\\\\\\\"12:00\\\\\\\",\\\\\\\"closes\\\\\\\":\\\\\\\"00:00\\\\\\\"}]} \\\/-->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">How-To<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-howto {\\\\\\\"name\\\\\\\":\\\\\\\"How to season a carbon-steel pan\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Build a durable non-stick patina in about an hour.\\\\\\\",\\\\\\\"totalTime\\\\\\\":\\\\\\\"PT1H\\\\\\\",\\\\\\\"estimatedCost\\\\\\\":\\\\\\\"4.00\\\\\\\",\\\\\\\"estimatedCostCurrency\\\\\\\":\\\\\\\"GBP\\\\\\\",\\\\\\\"supply\\\\\\\":[\\\\\\\"Flaxseed or grapeseed oil\\\\\\\",\\\\\\\"Coarse salt\\\\\\\"],\\\\\\\"tool\\\\\\\":[\\\\\\\"Lint-free cloth\\\\\\\",\\\\\\\"Oven gloves\\\\\\\"],\\\\\\\"steps\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"Strip the factory coating\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Scrub with hot soapy water, then dry over a low flame.\\\\\\\",\\\\\\\"image\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"Apply a thin oil film\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Rub oil over every surface, then wipe it back until dry.\\\\\\\",\\\\\\\"image\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"Bake the layer on\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Upside down in a 230 \\u00b0C oven for 40 minutes, then cool in the oven.\\\\\\\",\\\\\\\"image\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"\\\\\\\"}],\\\\\\\"publisherIsSite\\\\\\\":true} -->\\\\n<div class=\\\\\\\"wp-block-codedication-schema-howto cddc-schema-howto\\\\\\\"><div class=\\\\\\\"cddc-schema-howto__header\\\\\\\"><h3 class=\\\\\\\"cddc-schema-howto__title\\\\\\\">How to season a carbon-steel pan<\\\/h3><p class=\\\\\\\"cddc-schema-howto__description\\\\\\\">Build a durable non-stick patina in about an hour.<\\\/p><\\\/div><ol class=\\\\\\\"cddc-schema-howto__steps\\\\\\\" role=\\\\\\\"list\\\\\\\"><li class=\\\\\\\"cddc-schema-howto__step\\\\\\\"><div class=\\\\\\\"cddc-schema-howto__step-number\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">1<\\\/div><div class=\\\\\\\"cddc-schema-howto__step-content\\\\\\\"><strong class=\\\\\\\"cddc-schema-howto__step-name\\\\\\\">Strip the factory coating<\\\/strong><p class=\\\\\\\"cddc-schema-howto__step-text\\\\\\\">Scrub with hot soapy water, then dry over a low flame.<\\\/p><\\\/div><\\\/li><li class=\\\\\\\"cddc-schema-howto__step\\\\\\\"><div class=\\\\\\\"cddc-schema-howto__step-number\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">2<\\\/div><div class=\\\\\\\"cddc-schema-howto__step-content\\\\\\\"><strong class=\\\\\\\"cddc-schema-howto__step-name\\\\\\\">Apply a thin oil film<\\\/strong><p class=\\\\\\\"cddc-schema-howto__step-text\\\\\\\">Rub oil over every surface, then wipe it back until dry.<\\\/p><\\\/div><\\\/li><li class=\\\\\\\"cddc-schema-howto__step\\\\\\\"><div class=\\\\\\\"cddc-schema-howto__step-number\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">3<\\\/div><div class=\\\\\\\"cddc-schema-howto__step-content\\\\\\\"><strong class=\\\\\\\"cddc-schema-howto__step-name\\\\\\\">Bake the layer on<\\\/strong><p class=\\\\\\\"cddc-schema-howto__step-text\\\\\\\">Upside down in a 230 \\u00b0C oven for 40 minutes, then cool in the oven.<\\\/p><\\\/div><\\\/li><\\\/ol><\\\/div>\\\\n<!-- \\\/wp:codedication\\\/schema-howto -->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">Job Posting<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-jobposting {\\\\\\\"blockId\\\\\\\":\\\\\\\"bpj000000001\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"Senior WordPress Engineer\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"Own our block editor tooling: Gutenberg blocks, the Interactivity API and the structured-data pipeline behind them.\\\\\\\",\\\\\\\"datePosted\\\\\\\":\\\\\\\"2026-08-04\\\\\\\",\\\\\\\"validThrough\\\\\\\":\\\\\\\"2026-11-30\\\\\\\",\\\\\\\"employmentType\\\\\\\":\\\\\\\"FULL_TIME\\\\\\\",\\\\\\\"hiringOrgName\\\\\\\":\\\\\\\"Codedication\\\\\\\",\\\\\\\"addressLocality\\\\\\\":\\\\\\\"Manchester\\\\\\\",\\\\\\\"postalCode\\\\\\\":\\\\\\\"M3 1RH\\\\\\\",\\\\\\\"addressCountry\\\\\\\":\\\\\\\"GB\\\\\\\",\\\\\\\"salaryCurrency\\\\\\\":\\\\\\\"GBP\\\\\\\",\\\\\\\"salaryMin\\\\\\\":\\\\\\\"62000\\\\\\\",\\\\\\\"salaryMax\\\\\\\":\\\\\\\"78000\\\\\\\",\\\\\\\"salaryUnit\\\\\\\":\\\\\\\"YEAR\\\\\\\",\\\\\\\"directApply\\\\\\\":true} \\\/-->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">Review<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-review {\\\\\\\"blockId\\\\\\\":\\\\\\\"bpv000000001\\\\\\\",\\\\\\\"itemName\\\\\\\":\\\\\\\"The Art of Structured Data\\\\\\\",\\\\\\\"itemType\\\\\\\":\\\\\\\"Book\\\\\\\",\\\\\\\"itemDescription\\\\\\\":\\\\\\\"A practical guide to modelling entities for search engines and answer engines.\\\\\\\",\\\\\\\"ratingValue\\\\\\\":4.5,\\\\\\\"authorType\\\\\\\":\\\\\\\"Organization\\\\\\\",\\\\\\\"authorFromSiteIdentity\\\\\\\":true,\\\\\\\"datePublished\\\\\\\":\\\\\\\"2026-07-21\\\\\\\",\\\\\\\"reviewBody\\\\\\\":\\\\\\\"Teaches a way of thinking rather than cataloguing every Schema.org type. The chapters on author credibility earn their place on their own.\\\\\\\",\\\\\\\"bookAuthor\\\\\\\":\\\\\\\"Amelia Hartley\\\\\\\",\\\\\\\"bookIsbn\\\\\\\":\\\\\\\"9781399812345\\\\\\\",\\\\\\\"bookFormat\\\\\\\":\\\\\\\"Hardcover\\\\\\\",\\\\\\\"bookNumberOfPages\\\\\\\":384} -->\\\\n<div class=\\\\\\\"wp-block-codedication-schema-review cddc-schema-review\\\\\\\"><div class=\\\\\\\"cddc-schema-review__header\\\\\\\"><div class=\\\\\\\"cddc-schema-review__meta\\\\\\\"><h3 class=\\\\\\\"cddc-schema-review__item-name\\\\\\\">The Art of Structured Data<\\\/h3><p class=\\\\\\\"cddc-schema-review__book-meta\\\\\\\">by Amelia Hartley \\u00b7 Hardcover \\u00b7 384 pages \\u00b7 ISBN 9781399812345<\\\/p><p class=\\\\\\\"cddc-schema-review__item-description\\\\\\\">A practical guide to modelling entities for search engines and answer engines.<\\\/p><div class=\\\\\\\"cddc-schema-review__rating\\\\\\\"><div class=\\\\\\\"cddc-schema-review__rating-top\\\\\\\"><div class=\\\\\\\"cddc-schema-review__stars\\\\\\\" role=\\\\\\\"img\\\\\\\" aria-label=\\\\\\\"Rating: 4.5 out of 5 stars\\\\\\\"><span class=\\\\\\\"cddc-schema-review__star is-filled\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">\\u2605<\\\/span><span class=\\\\\\\"cddc-schema-review__star is-filled\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">\\u2605<\\\/span><span class=\\\\\\\"cddc-schema-review__star is-filled\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">\\u2605<\\\/span><span class=\\\\\\\"cddc-schema-review__star is-filled\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">\\u2605<\\\/span><span class=\\\\\\\"cddc-schema-review__star is-half\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">\\u2605<\\\/span><\\\/div><span class=\\\\\\\"cddc-schema-review__rating-value\\\\\\\">4.5<\\\/span><\\\/div><div class=\\\\\\\"cddc-schema-review__rating-bar\\\\\\\" role=\\\\\\\"presentation\\\\\\\"><div class=\\\\\\\"cddc-schema-review__rating-fill\\\\\\\" style=\\\\\\\"width:90%\\\\\\\"><\\\/div><\\\/div><\\\/div><\\\/div><\\\/div><div class=\\\\\\\"cddc-schema-review__content\\\\\\\"><p class=\\\\\\\"cddc-schema-review__body\\\\\\\">Teaches a way of thinking rather than cataloguing every Schema.org type. The chapters on author credibility earn their place on their own.<\\\/p><\\\/div><div class=\\\\\\\"cddc-schema-review__footer\\\\\\\"><span class=\\\\\\\"cddc-schema-review__author\\\\\\\"><\\\/span><time class=\\\\\\\"cddc-schema-review__date\\\\\\\" datetime=\\\\\\\"2026-07-21\\\\\\\">2026-07-21<\\\/time><\\\/div><\\\/div>\\\\n<!-- \\\/wp:codedication\\\/schema-review -->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">Breadcrumb<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-breadcrumb {\\\\\\\"items\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"Recipes\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"\\\/recipes\\\/\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"Spanish classics\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"\\\/recipes\\\/spanish\\\/\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"Tortilla de patatas\\\\\\\",\\\\\\\"url\\\\\\\":\\\\\\\"\\\\\\\"}],\\\\\\\"autoGenerate\\\\\\\":false} -->\\\\n<nav class=\\\\\\\"wp-block-codedication-schema-breadcrumb cddc-schema-breadcrumb\\\\\\\" aria-label=\\\\\\\"Breadcrumb\\\\\\\"><ol class=\\\\\\\"cddc-schema-breadcrumb__list\\\\\\\"><li class=\\\\\\\"cddc-schema-breadcrumb__item\\\\\\\"><a href=\\\\\\\"\\\/recipes\\\/\\\\\\\" class=\\\\\\\"cddc-schema-breadcrumb__link\\\\\\\">Recipes<\\\/a><\\\/li><li class=\\\\\\\"cddc-schema-breadcrumb__item\\\\\\\"><span class=\\\\\\\"cddc-schema-breadcrumb__separator\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">\\\/<\\\/span><a href=\\\\\\\"\\\/recipes\\\/spanish\\\/\\\\\\\" class=\\\\\\\"cddc-schema-breadcrumb__link\\\\\\\">Spanish classics<\\\/a><\\\/li><li class=\\\\\\\"cddc-schema-breadcrumb__item\\\\\\\"><span class=\\\\\\\"cddc-schema-breadcrumb__separator\\\\\\\" aria-hidden=\\\\\\\"true\\\\\\\">\\\/<\\\/span><span class=\\\\\\\"cddc-schema-breadcrumb__current\\\\\\\" aria-current=\\\\\\\"page\\\\\\\">Tortilla de patatas<\\\/span><\\\/li><\\\/ol><\\\/nav>\\\\n<!-- \\\/wp:codedication\\\/schema-breadcrumb -->\\\\n\\\\n<!-- wp:heading -->\\\\n<h2 class=\\\\\\\"wp-block-heading\\\\\\\">FAQ<\\\/h2>\\\\n<!-- \\\/wp:heading -->\\\\n\\\\n<!-- wp:codedication\\\/schema-faq {\\\\\\\"closeOthers\\\\\\\":true} -->\\\\n<!-- wp:details -->\\\\n<details class=\\\\\\\"wp-block-details\\\\\\\"><summary>Which blocks do I get?<\\\/summary>\\\\n<!-- wp:paragraph -->\\\\n<p>All nine: FAQ, Review, Recipe, Product, Event, Local Business, How-To, Job Posting and Breadcrumb, plus the site identity, author profiles and per-post controls behind them.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n<\\\/details>\\\\n<!-- \\\/wp:details -->\\\\n\\\\n<!-- wp:details -->\\\\n<details class=\\\\\\\"wp-block-details\\\\\\\"><summary>Will this clash with my SEO plugin?<\\\/summary>\\\\n<!-- wp:paragraph -->\\\\n<p>It sits alongside one. Your SEO plugin keeps handling meta tags and site-wide schema; these blocks handle content-level schema.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n<\\\/details>\\\\n<!-- \\\/wp:details -->\\\\n\\\\n<!-- wp:details -->\\\\n<details class=\\\\\\\"wp-block-details\\\\\\\"><summary>Where does the JSON-LD go?<\\\/summary>\\\\n<!-- wp:paragraph -->\\\\n<p>Into a single &lt;script type=\\\\\\\"application\\\/ld+json\\\\\\\"&gt; in the page head, as one connected @graph.<\\\/p>\\\\n<!-- \\\/wp:paragraph -->\\\\n<\\\/details>\\\\n<!-- \\\/wp:details -->\\\\n<!-- \\\/wp:codedication\\\/schema-faq -->\\\"; wp_update_post( [ 'ID' => 1, 'post_title' => 'Schema Blocks \\u2014 every block', 'post_content' => $content, 'post_status' => 'publish' ] ); update_option( 'cddc_schema_blocks_settings', array_merge( (array) get_option( 'cddc_schema_blocks_settings', [] ), [ 'site_identity' => [ 'entity_type' => 'Organization', 'person_user_id' => 0, 'org_name' => 'Codedication', 'org_url' => home_url(), 'org_logo' => '', 'org_logo_id' => 0, 'org_description' => 'Structured data tooling for WordPress.', 'org_email' => '', 'org_phone' => '', 'org_founding_year' => '2019', 'org_address' => [ 'street_address' => '30 Deansgate', 'address_locality' => 'Manchester', 'address_region' => '', 'postal_code' => 'M3 1RH', 'address_country' => 'GB' ], 'org_contact_point' => [ 'contact_type' => '', 'telephone' => '', 'email' => '', 'available_language' => '' ], 'social_profiles' => [ 'social_twitter' => 'https:\\\/\\\/x.com\\\/codedication', 'social_linkedin' => '', 'social_facebook' => '', 'social_instagram' => '', 'social_youtube' => '', 'social_github' => 'https:\\\/\\\/github.com\\\/codedication' ] ], ] ) );\"}]}"}},"all_blocks":{"codedication\/schema-faq":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-faq","version":"1.0.0","title":"FAQ Schema","category":"schema-blocks","description":"Create an FAQ section with Schema.org markup for better SEO.","keywords":["faq","questions","answers","schema","seo"],"textdomain":"codedication-schema-blocks","attributes":{"closeOthers":{"type":"boolean","default":false},"description":{"type":"string","default":""}},"supports":{"html":false,"anchor":true,"className":true,"align":["wide","full"],"spacing":{"margin":true,"padding":true},"color":{"background":true,"text":true},"typography":{"fontSize":true,"lineHeight":true,"letterSpacing":true,"textTransform":true,"fontStyle":true,"fontWeight":true,"textDecoration":true,"fontVariant":true},"interactivity":true},"render":"file:.\/render.php","editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css"},"codedication\/schema-breadcrumb":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-breadcrumb","version":"1.0.0","title":"Breadcrumb Schema","category":"schema-blocks","icon":"admin-links","description":"Add Schema.org BreadcrumbList structured data for navigation breadcrumbs.","keywords":["breadcrumb","navigation","trail","path","schema"],"textdomain":"codedication-schema-blocks","attributes":{"items":{"type":"array","default":[],"items":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"}}}},"autoGenerate":{"type":"boolean","default":true},"separator":{"type":"string","default":"\/"},"includeHome":{"type":"boolean","default":true},"homeLabel":{"type":"string","default":"Home"},"name":{"type":"string","default":""}},"supports":{"html":false,"anchor":true,"className":true,"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true},"color":{"text":true,"link":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css"},"codedication\/schema-review":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-review","version":"1.0.0","title":"Review Schema","category":"schema-blocks","description":"Create a review with star ratings and Schema.org markup for rich snippets.","keywords":["review","rating","stars","schema","seo"],"textdomain":"codedication-schema-blocks","attributes":{"blockId":{"type":"string"},"itemName":{"type":"string","default":""},"itemType":{"type":"string","default":"Product","enum":["Product","LocalBusiness","Movie","Book","Restaurant","Thing"]},"itemImage":{"type":"string","default":""},"itemDescription":{"type":"string","default":""},"itemUrl":{"type":"string","default":""},"ratingValue":{"type":"number","default":0},"bestRating":{"type":"number","default":5},"worstRating":{"type":"number","default":1},"authorName":{"type":"string","default":""},"authorType":{"type":"string","default":"Person","enum":["Person","Organization"]},"authorFromSiteIdentity":{"type":"boolean","default":false},"datePublished":{"type":"string","default":""},"reviewBody":{"type":"string","default":""},"publisherName":{"type":"string","default":""},"publisherType":{"type":"string","default":"Organization","enum":["Organization","Person"]},"reviewAspect":{"type":"string","default":""},"positiveNotes":{"type":"array","default":[],"items":{"type":"string"}},"negativeNotes":{"type":"array","default":[],"items":{"type":"string"}},"ratingExplanation":{"type":"string","default":""},"bookAuthor":{"type":"string","default":""},"bookIsbn":{"type":"string","default":""},"bookFormat":{"type":"string","default":"","enum":["","EBook","Paperback","Hardcover","AudiobookFormat","GraphicNovel"]},"bookNumberOfPages":{"type":"number","default":0},"bookPublisher":{"type":"string","default":""},"bookDatePublished":{"type":"string","default":""},"bookSameAs":{"type":"array","default":[],"items":{"type":"string"}}},"supports":{"html":false,"anchor":true,"className":true,"align":["wide"],"spacing":{"margin":true,"padding":true},"color":{"background":true,"text":true},"typography":{"fontSize":true}},"render":"file:.\/render.php","editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css"},"codedication\/schema-event":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-event","version":"1.0.0","title":"Event Schema","category":"schema-blocks","description":"An event block with full Schema.org markup for rich results.","textdomain":"codedication-schema-blocks","keywords":["event","schema","calendar","conference","meeting"],"attributes":{"blockId":{"type":"string"},"name":{"type":"string","default":""},"description":{"type":"string","default":""},"image":{"type":"string","default":""},"imageId":{"type":"number","default":0},"imageAlt":{"type":"string","default":""},"startDate":{"type":"string","default":""},"endDate":{"type":"string","default":""},"locationType":{"type":"string","default":"Place","enum":["Place","VirtualLocation","Mixed"]},"locationName":{"type":"string","default":""},"streetAddress":{"type":"string","default":""},"addressLocality":{"type":"string","default":""},"addressRegion":{"type":"string","default":""},"postalCode":{"type":"string","default":""},"addressCountry":{"type":"string","default":""},"virtualUrl":{"type":"string","default":""},"organizerName":{"type":"string","default":""},"organizerUrl":{"type":"string","default":""},"organizerIsSite":{"type":"boolean","default":false},"offerPrice":{"type":"string","default":""},"offerCurrency":{"type":"string","default":"EUR"},"offerUrl":{"type":"string","default":""},"offerAvailability":{"type":"string","default":"InStock","enum":["InStock","SoldOut","PreOrder"]},"eventStatus":{"type":"string","default":"EventScheduled","enum":["EventScheduled","EventCancelled","EventPostponed","EventRescheduled"]},"eventAttendanceMode":{"type":"string","default":"OfflineEventAttendanceMode","enum":["OfflineEventAttendanceMode","OnlineEventAttendanceMode","MixedEventAttendanceMode"]},"performerName":{"type":"string","default":""},"performerType":{"type":"string","default":"Person","enum":["Person","PerformingGroup","MusicGroup"]},"performerUrl":{"type":"string","default":""}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","render":"file:.\/render.php"},"codedication\/schema-jobposting":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-jobposting","version":"1.0.0","title":"Job Posting Schema","category":"schema-blocks","description":"A job posting block with full Schema.org markup for Google Jobs rich results.","textdomain":"codedication-schema-blocks","keywords":["job","jobposting","schema","hiring","career"],"attributes":{"blockId":{"type":"string"},"title":{"type":"string","default":""},"description":{"type":"string","default":""},"datePosted":{"type":"string","default":""},"validThrough":{"type":"string","default":""},"employmentType":{"type":"string","default":"","enum":["","FULL_TIME","PART_TIME","CONTRACTOR","TEMPORARY","INTERN","VOLUNTEER","PER_DIEM","OTHER"]},"hiringOrgName":{"type":"string","default":""},"hiringOrgUrl":{"type":"string","default":""},"hiringOrgLogo":{"type":"string","default":""},"hiringOrgLogoId":{"type":"number","default":0},"remote":{"type":"boolean","default":false},"streetAddress":{"type":"string","default":""},"addressLocality":{"type":"string","default":""},"addressRegion":{"type":"string","default":""},"postalCode":{"type":"string","default":""},"addressCountry":{"type":"string","default":""},"applicantCountry":{"type":"string","default":""},"salaryCurrency":{"type":"string","default":"USD"},"salaryMin":{"type":"string","default":""},"salaryMax":{"type":"string","default":""},"salaryUnit":{"type":"string","default":"YEAR","enum":["HOUR","DAY","WEEK","MONTH","YEAR"]},"identifierValue":{"type":"string","default":""},"identifierName":{"type":"string","default":""},"directApply":{"type":"boolean","default":false}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","render":"file:.\/render.php"},"codedication\/schema-recipe":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-recipe","version":"1.0.0","title":"Recipe Schema","category":"schema-blocks","description":"A recipe block with full Schema.org markup for rich results.","textdomain":"codedication-schema-blocks","keywords":["recipe","schema","cooking","food","ingredients"],"attributes":{"blockId":{"type":"string"},"name":{"type":"string","default":""},"description":{"type":"string","default":""},"image":{"type":"string","default":""},"imageId":{"type":"number","default":0},"imageAlt":{"type":"string","default":""},"prepTime":{"type":"string","default":""},"cookTime":{"type":"string","default":""},"totalTime":{"type":"string","default":""},"recipeYield":{"type":"string","default":""},"recipeCategory":{"type":"string","default":""},"recipeCuisine":{"type":"string","default":""},"authorName":{"type":"string","default":""},"usePostAuthor":{"type":"boolean","default":false},"keywords":{"type":"string","default":""},"ratingValue":{"type":"number","default":0},"reviewCount":{"type":"number","default":0}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","render":"file:.\/render.php"},"codedication\/schema-local-business":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-local-business","version":"1.0.0","title":"Local Business Schema","category":"schema-blocks","description":"A local business block with full Schema.org markup for rich results.","textdomain":"codedication-schema-blocks","keywords":["local","business","schema","restaurant","store","shop"],"attributes":{"blockId":{"type":"string"},"businessType":{"type":"string","default":"LocalBusiness"},"servesCuisine":{"type":"string","default":""},"isSiteIdentity":{"type":"boolean","default":false},"name":{"type":"string","default":""},"description":{"type":"string","default":""},"image":{"type":"string","default":""},"imageId":{"type":"number","default":0},"imageAlt":{"type":"string","default":""},"logo":{"type":"string","default":""},"logoId":{"type":"number","default":0},"streetAddress":{"type":"string","default":""},"addressLocality":{"type":"string","default":""},"addressRegion":{"type":"string","default":""},"postalCode":{"type":"string","default":""},"addressCountry":{"type":"string","default":""},"telephone":{"type":"string","default":""},"email":{"type":"string","default":""},"url":{"type":"string","default":""},"latitude":{"type":"string","default":""},"longitude":{"type":"string","default":""},"priceRange":{"type":"string","default":""},"ratingValue":{"type":"number","default":0},"reviewCount":{"type":"number","default":0},"openingHours":{"type":"array","default":[],"items":{"type":"object","properties":{"days":{"type":"array","items":{"type":"string"}},"opens":{"type":"string"},"closes":{"type":"string"}}}},"sameAs":{"type":"array","default":[],"items":{"type":"string"}}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","render":"file:.\/render.php"},"codedication\/schema-howto":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-howto","version":"1.0.0","title":"How-To Schema","category":"schema-blocks","icon":"list-view","description":"Add Schema.org HowTo structured data for step-by-step instructions.","keywords":["howto","tutorial","guide","steps","instructions","schema"],"textdomain":"codedication-schema-blocks","attributes":{"name":{"type":"string","default":""},"description":{"type":"string","default":""},"image":{"type":"string","default":""},"totalTime":{"type":"string","default":""},"estimatedCost":{"type":"string","default":""},"estimatedCostCurrency":{"type":"string","default":"USD"},"supply":{"type":"array","default":[],"items":{"type":"string"}},"tool":{"type":"array","default":[],"items":{"type":"string"}},"steps":{"type":"array","default":[],"items":{"type":"object","properties":{"name":{"type":"string"},"text":{"type":"string"},"image":{"type":"string"},"url":{"type":"string"}}}},"yield":{"type":"string","default":""},"publisherIsSite":{"type":"boolean","default":false}},"supports":{"html":false,"anchor":true,"className":true,"align":["wide"],"spacing":{"margin":true,"padding":true},"color":{"background":true,"text":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css"},"codedication\/schema-product":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-product","version":"1.0.0","title":"Product Schema","category":"schema-blocks","description":"A product block with full Schema.org markup for rich results.","textdomain":"codedication-schema-blocks","keywords":["product","schema","shop","ecommerce","price"],"attributes":{"blockId":{"type":"string"},"name":{"type":"string","default":""},"description":{"type":"string","default":""},"image":{"type":"string","default":""},"imageId":{"type":"number","default":0},"imageAlt":{"type":"string","default":""},"sku":{"type":"string","default":""},"gtin":{"type":"string","default":""},"mpn":{"type":"string","default":""},"brand":{"type":"string","default":""},"brandIsSite":{"type":"boolean","default":false},"price":{"type":"string","default":""},"priceCurrency":{"type":"string","default":"EUR"},"priceValidUntil":{"type":"string","default":""},"availability":{"type":"string","default":"InStock","enum":["InStock","OutOfStock","PreOrder","Discontinued"]},"url":{"type":"string","default":""},"ratingValue":{"type":"number","default":0},"reviewCount":{"type":"number","default":0},"canonicalId":{"type":"string","default":""},"productType":{"type":"string","default":"Product","enum":["Product","SoftwareApplication","Book"]},"applicationCategory":{"type":"string","default":""},"operatingSystem":{"type":"string","default":""},"bookIsbn":{"type":"string","default":""},"bookAuthor":{"type":"string","default":""},"sameAs":{"type":"array","default":[],"items":{"type":"string"}},"reviews":{"type":"array","default":[],"items":{"type":"object","properties":{"author":{"type":"string"},"rating":{"type":"number"},"body":{"type":"string"},"datePublished":{"type":"string"}}}}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","render":"file:.\/render.php"},"codedication\/schema-recipe-ingredients":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-recipe-ingredients","version":"1.0.0","title":"Recipe Ingredients","category":"schema-blocks","description":"List of ingredients for a recipe.","textdomain":"codedication-schema-blocks","parent":["codedication\/schema-recipe"],"attributes":{"ingredients":{"type":"array","default":[],"items":{"type":"string"}}},"supports":{"html":false,"reusable":false},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","render":"file:.\/render.php"},"codedication\/schema-recipe-instructions":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-recipe-instructions","version":"1.0.0","title":"Recipe Instructions","category":"schema-blocks","description":"Step-by-step instructions for a recipe.","textdomain":"codedication-schema-blocks","parent":["codedication\/schema-recipe"],"attributes":{"steps":{"type":"array","default":[],"items":{"type":"object"}}},"supports":{"html":false,"reusable":false},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","render":"file:.\/render.php"},"codedication\/schema-recipe-nutrition":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"codedication\/schema-recipe-nutrition","version":"1.0.0","title":"Recipe Nutrition","category":"schema-blocks","description":"Nutritional information for a recipe.","textdomain":"codedication-schema-blocks","parent":["codedication\/schema-recipe"],"attributes":{"servingSize":{"type":"string","default":""},"calories":{"type":"string","default":""},"fatContent":{"type":"string","default":""},"saturatedFatContent":{"type":"string","default":""},"carbohydrateContent":{"type":"string","default":""},"sugarContent":{"type":"string","default":""},"fiberContent":{"type":"string","default":""},"proteinContent":{"type":"string","default":""},"sodiumContent":{"type":"string","default":""},"cholesterolContent":{"type":"string","default":""}},"supports":{"html":false,"reusable":false},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","render":"file:.\/render.php"}},"tagged_versions":["1.0.1","1.0.2","1.1.0","1.2.0","2.0.0","2.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3654286,"resolution":"1","location":"assets","locale":"","width":2560,"height":1440},"screenshot-10.jpg":{"filename":"screenshot-10.jpg","revision":3654286,"resolution":"10","location":"assets","locale":"","width":2560,"height":1440},"screenshot-11.jpg":{"filename":"screenshot-11.jpg","revision":3654286,"resolution":"11","location":"assets","locale":"","width":2560,"height":1440},"screenshot-12.jpg":{"filename":"screenshot-12.jpg","revision":3654286,"resolution":"12","location":"assets","locale":"","width":2560,"height":1440},"screenshot-13.jpg":{"filename":"screenshot-13.jpg","revision":3654286,"resolution":"13","location":"assets","locale":"","width":2560,"height":1440},"screenshot-14.jpg":{"filename":"screenshot-14.jpg","revision":3654286,"resolution":"14","location":"assets","locale":"","width":2560,"height":1440},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3654286,"resolution":"2","location":"assets","locale":"","width":2560,"height":1440},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3654286,"resolution":"3","location":"assets","locale":"","width":2560,"height":1440},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3654286,"resolution":"4","location":"assets","locale":"","width":2560,"height":1440},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3654286,"resolution":"5","location":"assets","locale":"","width":2560,"height":1440},"screenshot-6.jpg":{"filename":"screenshot-6.jpg","revision":3654286,"resolution":"6","location":"assets","locale":"","width":2560,"height":1440},"screenshot-7.jpg":{"filename":"screenshot-7.jpg","revision":3654286,"resolution":"7","location":"assets","locale":"","width":2560,"height":1440},"screenshot-8.jpg":{"filename":"screenshot-8.jpg","revision":3654286,"resolution":"8","location":"assets","locale":"","width":2560,"height":1440},"screenshot-9.jpg":{"filename":"screenshot-9.jpg","revision":3654286,"resolution":"9","location":"assets","locale":"","width":2560,"height":1440}},"screenshots":{"1":"The nine schema blocks in the inserter: FAQ, Review, Recipe, Product, Event, Local Business, How-To, Job Posting and Breadcrumb","2":"Recipe block in the editor, with ingredients, instructions and nutrition as inner blocks, prep and cook times, yield and cuisine","3":"Product block in the editor: price, currency, availability, SKU, GTIN and MPN, and the toggle that points the brand at your site identity","4":"Local Business block in the editor: business subtype, address, geo coordinates and opening hours","5":"Job Posting block in the editor: employment type, hiring organization, location and salary range","6":"The Schema panel in the document sidebar, overriding the content type and page type of a single page","7":"Settings &gt; Blocks: enable or disable each of the nine blocks; a disabled block leaves the inserter and stops emitting JSON-LD","8":"Settings &gt; Site Identity, with the schema completeness ring and the live JSON-LD preview","9":"The Schema author profile on the user screen: job title, sameAs URLs, areas of expertise, credentials and the worksFor opt-in that enrich every author entity","10":"A Recipe on the front end: the block renders the content its markup describes, so the two can never disagree","11":"The FAQ accordion on the front end, built on native details and summary elements","12":"Settings &gt; Content: map each post type to Article, Blog posting or nothing, with the live JSON-LD preview and the completeness ring beside it","13":"Settings &gt; Validgraph: the optional validation connection, its tier and quota, the project the site reports to, and post-publish URL re-validation","14":"ValidGraph results in the editor sidebar: completeness and AI discoverability per entity, property warnings, missing recommended fields and the full AI discoverability breakdown"}},"plugin_section":[],"plugin_tags":[2516,2998,1117,186,1121],"plugin_category":[55],"plugin_contributors":[263511,162622],"plugin_business_model":[],"class_list":["post-302780","plugin","type-plugin","status-publish","hentry","plugin_tags-json-ld","plugin_tags-rich-snippets","plugin_tags-schema","plugin_tags-seo","plugin_tags-structured-data","plugin_category-seo-and-marketing","plugin_contributors-codedication","plugin_contributors-pauloc","plugin_committers-codedication"],"banners":{"banner":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/banner-772x250.png?rev=3537180","banner_2x":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/banner-1544x500.png?rev=3537180","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/icon-128x128.png?rev=3537180","icon_2x":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/icon-256x256.png?rev=3537180","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-1.jpg?rev=3654286","caption":"The nine schema blocks in the inserter: FAQ, Review, Recipe, Product, Event, Local Business, How-To, Job Posting and Breadcrumb"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-2.jpg?rev=3654286","caption":"Recipe block in the editor, with ingredients, instructions and nutrition as inner blocks, prep and cook times, yield and cuisine"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-3.jpg?rev=3654286","caption":"Product block in the editor: price, currency, availability, SKU, GTIN and MPN, and the toggle that points the brand at your site identity"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-4.jpg?rev=3654286","caption":"Local Business block in the editor: business subtype, address, geo coordinates and opening hours"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-5.jpg?rev=3654286","caption":"Job Posting block in the editor: employment type, hiring organization, location and salary range"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-6.jpg?rev=3654286","caption":"The Schema panel in the document sidebar, overriding the content type and page type of a single page"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-7.jpg?rev=3654286","caption":"Settings &gt; Blocks: enable or disable each of the nine blocks; a disabled block leaves the inserter and stops emitting JSON-LD"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-8.jpg?rev=3654286","caption":"Settings &gt; Site Identity, with the schema completeness ring and the live JSON-LD preview"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-9.jpg?rev=3654286","caption":"The Schema author profile on the user screen: job title, sameAs URLs, areas of expertise, credentials and the worksFor opt-in that enrich every author entity"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-10.jpg?rev=3654286","caption":"A Recipe on the front end: the block renders the content its markup describes, so the two can never disagree"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-11.jpg?rev=3654286","caption":"The FAQ accordion on the front end, built on native details and summary elements"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-12.jpg?rev=3654286","caption":"Settings &gt; Content: map each post type to Article, Blog posting or nothing, with the live JSON-LD preview and the completeness ring beside it"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-13.jpg?rev=3654286","caption":"Settings &gt; Validgraph: the optional validation connection, its tier and quota, the project the site reports to, and post-publish URL re-validation"},{"src":"https:\/\/ps.w.org\/codedication-schema-blocks\/assets\/screenshot-14.jpg?rev=3654286","caption":"ValidGraph results in the editor sidebar: completeness and AI discoverability per entity, property warnings, missing recommended fields and the full AI discoverability breakdown"}],"raw_content":"<!--section=description-->\n<h4>Structured data that lives with your content<\/h4>\n\n<p>Most schema plugins park your structured data somewhere else: a metabox, a separate settings screen, a template file. The page says one thing, the markup says another, and nobody notices until a rich result quietly disappears.<\/p>\n\n<p>Schema Blocks works the other way round. You write the recipe, the FAQ, the product details or the job ad as blocks in the editor, and those same blocks emit the JSON-LD. What a visitor reads and what a search engine parses come from the same source, so they cannot drift apart.<\/p>\n\n<h4>Nine blocks for the things people actually publish<\/h4>\n\n<p><strong>FAQ<\/strong> - questions and answers in a native accordion. Visitors get a real disclosure widget, machines get <code>FAQPage<\/code> \/ <code>Question<\/code> \/ <code>Answer<\/code> markup they can read.<\/p>\n\n<p><strong>Review<\/strong> - <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/review-snippet\">review snippets<\/a> with a 1-5 rating for products, books, movies, restaurants, local businesses or any <code>Thing<\/code>. Pros, cons, rating explanation, and book details (author, publisher, ISBN, page count, external identity URLs) when the reviewed item is a book.<\/p>\n\n<p><strong>Recipe<\/strong> - <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/recipe\">recipe rich results<\/a> built from inner blocks: ingredients, instructions and nutrition are content on the page, not hidden fields. Plus prep, cook and total time, yield, category, cuisine, keywords and rating.<\/p>\n\n<p><strong>Product<\/strong> - <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/product\">product rich results<\/a> with price, currency, availability, condition, SKU, GTIN and MPN, brand, manufacturer and aggregate rating.<\/p>\n\n<p><strong>Event<\/strong> - <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/event\">event rich results<\/a> with start and end dates, attendance mode, status, a physical or virtual location, organizer and ticket offers.<\/p>\n\n<p><strong>Local Business<\/strong> - <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/local-business\">local business markup<\/a> with subtype (Restaurant, Store, ProfessionalService and dozens more), address, geo coordinates, telephone, price range, cuisine served and opening hours.<\/p>\n\n<p><strong>How-To<\/strong> - ordered steps with images, estimated cost, total time, tools and supplies, described in the page itself.<\/p>\n\n<p><strong>Job Posting<\/strong> - <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/job-posting\">job posting rich results<\/a> with employment type, hiring organization, location, posting and validity dates, and base salary.<\/p>\n\n<p><strong>Breadcrumb<\/strong> - <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/breadcrumb\">breadcrumb markup<\/a> generated from your site hierarchy, or a manual trail when the hierarchy does not match the story. Where the block is used it replaces the site-wide trail, so a page never emits two.<\/p>\n\n<h4>Configure the site once<\/h4>\n\n<p>The Settings screen holds everything that belongs to the whole site, with a live JSON-LD preview and a completeness ring next to it:<\/p>\n\n<ul>\n<li><strong>Site Identity<\/strong> - Organization or Person, with name, logo, description, contact details, address, social profiles and founding year.<\/li>\n<li><strong>WebSite<\/strong> - site name, alternate name, description, language and the search action.<\/li>\n<li><strong>Breadcrumbs<\/strong> - the site-wide <code>BreadcrumbList<\/code>, with separator and home label.<\/li>\n<li><strong>Content<\/strong> - map each public post type to Article, Blog posting or nothing. Posts default to Article, so a normal blog is marked up correctly the moment you activate the plugin.<\/li>\n<li><strong>Blocks<\/strong> - switch off the blocks you do not use. They leave the inserter and stop emitting anything.<\/li>\n<li><strong>Advanced<\/strong> - Wikidata ID, Wikipedia URL, legal name, VAT ID and employee count for organizations; job title, credentials and ORCID, LinkedIn or ResearchGate profiles for people; areas of expertise for either, emitted as <code>knowsAbout<\/code>. There is also a switch that suppresses the site-level nodes when another plugin already emits them.<\/li>\n<li><strong>Validgraph<\/strong> - the optional validation connection described below.<\/li>\n<\/ul>\n\n<h4>Your authors are people, not strings<\/h4>\n\n<p>An author name typed into a field is text. An author entity is something a search engine can recognise across your site and beyond it.<\/p>\n\n<p>Every WordPress user gets a <strong>Schema - author profile<\/strong> section on their profile screen:<\/p>\n\n<ul>\n<li>Job title, honorific prefix, credentials and areas of expertise.<\/li>\n<li><code>sameAs<\/code> URLs: LinkedIn, ORCID, Wikidata, a personal site.<\/li>\n<li>Where they studied (<code>alumniOf<\/code>) and which colleagues they work with, picked from the other authors who have a profile, so the <code>Person<\/code> nodes reference each other.<\/li>\n<li>An avatar override, and two opt-ins that tie the author to the site organization: member of it (<code>worksFor<\/code>) and founder of it.<\/li>\n<\/ul>\n\n<p>Those fields enrich the <code>Person<\/code> node referenced by every article that user writes, down to <code>givenName<\/code> and <code>familyName<\/code> taken from their WordPress first and last name. Their author archive is typed as <code>ProfilePage<\/code>, and the Organization node lists the authors who opted in as <code>employee<\/code> and <code>founder<\/code>: the full roster on the front page, the current author elsewhere.<\/p>\n\n<p>This is about being unambiguous, which is what E-E-A-T signals are made of. Nobody can promise you a ranking from it.<\/p>\n\n<h4>Per-post control when the site-wide rule is wrong<\/h4>\n\n<p>A <strong>Schema<\/strong> panel in the document sidebar overrides the defaults for a single post or page:<\/p>\n\n<ul>\n<li><strong>Content type<\/strong> - Article, Blog posting, News article, or none, whatever the post type mapping says.<\/li>\n<li><strong>Page type<\/strong> - About page, Contact page, Profile page, Item page or Collection page.<\/li>\n<\/ul>\n\n<p>There is also a smart rule you never have to configure: when the main content of a page is a schema block, that entity becomes the page's <code>mainEntity<\/code> instead of a redundant Article node.<\/p>\n\n<h4>One connected graph, not a pile of snippets<\/h4>\n\n<p>The plugin prints a single <code>&lt;script type=\"application\/ld+json\"&gt;<\/code> containing one <code>@graph<\/code>. Inside it, every entity has a stable <code>@id<\/code> and references the others: the <code>WebPage<\/code> node points at the site identity and the <code>WebSite<\/code>, the article points at its author, the breadcrumb trail belongs to the page, and the primary image is a node instead of a bare URL.<\/p>\n\n<p>Posts mapped to Article carry the detail a machine needs to place them: the manual excerpt as <code>description<\/code>, the word count, the tags as <code>keywords<\/code> and every category in <code>articleSection<\/code>, alongside headline, dates, publisher, primary image and the author entity.<\/p>\n\n<p>Block-level entities join the same graph. A Recipe can take its author from the post author, an Event can name your Organization as the organizer, a Product can point its brand and manufacturer at the site identity, and a Local Business block can <em>become<\/em> the site identity rather than compete with it.<\/p>\n\n<h4>Optional: check your work before you publish<\/h4>\n\n<p>Connect a <a href=\"https:\/\/validgraph.com\">ValidGraph<\/a> account under Settings and the editor gains a validation panel: a completeness score, an AI discoverability breakdown, rich-result eligibility, errors, range warnings and the recommended fields you have left empty, per schema on the page. A small indicator on each block shows its state, and a summary appears in the pre-publish panel.<\/p>\n\n<p>It is entirely opt-in and read-only. The API key is stored on your server and every call goes through a server-side proxy, so it never reaches the browser. Skip it and the plugin emits exactly the same markup, which you can check with the <a href=\"https:\/\/search.google.com\/test\/rich-results\">Google Rich Results Test<\/a> and the <a href=\"https:\/\/validator.schema.org\/\">Schema.org Validator<\/a>.<\/p>\n\n<h4>It sits beside your SEO plugin<\/h4>\n\n<p>Schema Blocks is not an SEO plugin and does not want to replace one. It writes structured data; Yoast SEO, Rank Math, All in One SEO or The SEO Framework keep doing titles, meta descriptions, sitemaps and redirects.<\/p>\n\n<p>If another plugin already emits the same node type, the plugin tells you: a notice on the settings screen lists the conflicts it detects. From there you either disable that schema type in the other plugin, or use the Advanced switch to stop emitting the site-level nodes here.<\/p>\n\n<h4>For developers<\/h4>\n\n<p>The output is filterable at every level, and the extensibility contract (1.8.0) is documented and versioned:<\/p>\n\n<ul>\n<li><code>cddc_schema_faq_output<\/code>, <code>cddc_schema_review_output<\/code>, <code>cddc_schema_recipe_output<\/code>, <code>cddc_schema_product_output<\/code>, <code>cddc_schema_event_output<\/code>, <code>cddc_schema_local_business_output<\/code>, <code>cddc_schema_howto_output<\/code>, <code>cddc_schema_jobposting_output<\/code>, <code>cddc_schema_breadcrumb_output<\/code> - the node each block emits.<\/li>\n<li><code>cddc_schema_blocks_graph_nodes<\/code> - the whole <code>@graph<\/code> before it is printed.<\/li>\n<li><code>cddc_schema_blocks_author_person<\/code> - enrich the author <code>Person<\/code> node.<\/li>\n<li><code>cddc_schema_blocks_page_content_type<\/code> - override the content type per post in code.<\/li>\n<li><code>cddc_schema_blocks_identity_extra_schema<\/code>, <code>cddc_schema_blocks_organization_schema<\/code>, <code>cddc_schema_blocks_website_schema<\/code>, <code>cddc_schema_blocks_breadcrumb_schema<\/code> - the site-level nodes.<\/li>\n<li><code>Schema_Graph::flag_main_entity()<\/code>, <code>Schema_Graph::ensure_author_person()<\/code> and <code>Schema_Graph::registered_identity_id()<\/code> are public seams for add-ons.<\/li>\n<li>The editor toolkit used by the blocks is exposed on <code>window.cddcSchema.ui<\/code>, so an add-on can build cards that look native.<\/li>\n<\/ul>\n\n<p>Blocks are registered from <code>block.json<\/code>, rendered server-side, and the FAQ accordion uses the Interactivity API with no jQuery and no custom front-end framework.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin generates and prints JSON-LD on your own server. Nothing is sent anywhere unless you connect a ValidGraph account with your own API key, and until you do, no request leaves your site.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In your WordPress admin, go to Plugins &gt; Add New and search for \"Schema Blocks\", or upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open <strong>Schema Blocks<\/strong> in the admin menu and fill in Site Identity. The completeness ring tells you what is still missing.<\/li>\n<li>Add schema blocks to your posts and pages from the \"Schema Blocks\" category in the inserter.<\/li>\n<\/ol>\n\n<p>Posts emit Article markup from the moment you activate the plugin, so a normal blog is covered before you touch anything.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20guarantee%20rich%20results%20in%20google%3F\"><h3>Will this guarantee rich results in Google?<\/h3><\/dt>\n<dd><p>No, and be suspicious of any plugin that says it will. Search engines decide what to display, based on the quality of the page, the market and their own policies. What a plugin can do is give them complete, valid and unambiguous markup, which is the part you control.<\/p><\/dd>\n<dt id=\"do%20faq%20blocks%20still%20produce%20those%20dropdowns%20in%20google%20search%20results%3F\"><h3>Do FAQ blocks still produce those dropdowns in Google search results?<\/h3><\/dt>\n<dd><p>Not any more. Google retired FAQ rich results for the vast majority of sites, and How-To rich results before that, so no plugin can bring them back. <code>FAQPage<\/code> markup is still worth publishing: it is how assistants, AI answer engines and other parsers read the questions on your page, and the accordion itself is good for your visitors.<\/p><\/dd>\n<dt id=\"does%20it%20conflict%20with%20yoast%20seo%2C%20rank%20math%20or%20all%20in%20one%20seo%3F\"><h3>Does it conflict with Yoast SEO, Rank Math or All in One SEO?<\/h3><\/dt>\n<dd><p>No. It writes content-level and site-level structured data alongside them. If two plugins emit the same node type, the settings screen shows a conflict notice: disable that schema type in the other plugin, or use the Advanced switch here to stop emitting the site-level nodes and keep only the block-level ones.<\/p><\/dd>\n<dt id=\"my%20seo%20plugin%20already%20emits%20organization%20and%20website.%20can%20i%20keep%20theirs%3F\"><h3>My SEO plugin already emits Organization and WebSite. Can I keep theirs?<\/h3><\/dt>\n<dd><p>Yes. Settings &gt; Advanced has a toggle that suppresses the site-level nodes from this plugin. Your blocks still emit their own entities and reference the identity the other plugin publishes.<\/p><\/dd>\n<dt id=\"how%20do%20my%20posts%20get%20article%20schema%3F\"><h3>How do my posts get Article schema?<\/h3><\/dt>\n<dd><p>Automatically. Settings &gt; Content maps every public post type to Article, Blog posting or none, with posts set to Article by default. Each matching post emits an <code>Article<\/code> node with headline, dates, author, publisher, primary image and section, wired into the same graph as the blocks on the page.<\/p><\/dd>\n<dt id=\"can%20i%20change%20that%20for%20one%20specific%20post%3F\"><h3>Can I change that for one specific post?<\/h3><\/dt>\n<dd><p>Yes. The Schema panel in the document sidebar overrides both the content type (Article, Blog posting, News article or none) and the page type (About, Contact, Profile, Item or Collection page) for that post only.<\/p><\/dd>\n<dt id=\"what%20do%20the%20author%20profile%20fields%20do%3F\"><h3>What do the author profile fields do?<\/h3><\/dt>\n<dd><p>They turn each author into a proper <code>Person<\/code> entity: job title, honorific prefix, credentials, areas of expertise, <code>sameAs<\/code> profile URLs, <code>alumniOf<\/code>, the colleagues they know, an avatar override, and optional links to the site organization as a member (<code>worksFor<\/code>) or a founder. Every article that user signs references that entity, their author archive is typed as <code>ProfilePage<\/code>, and the Organization lists them as <code>employee<\/code>. The documented benefit is disambiguation, not a ranking boost.<\/p><\/dd>\n<dt id=\"what%20is%20validgraph%2C%20and%20do%20i%20need%20it%3F\"><h3>What is ValidGraph, and do I need it?<\/h3><\/dt>\n<dd><p>ValidGraph is our validation service. Connect it and the block editor shows a completeness score, an AI discoverability breakdown, rich-result eligibility and a list of errors and missing recommended fields, before you publish. It is optional: without it the plugin emits the same markup, and you can validate manually with Google's Rich Results Test or the Schema.org Validator.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20my%20data%20anywhere%3F\"><h3>Does the plugin send my data anywhere?<\/h3><\/dt>\n<dd><p>Not by default. All markup is generated and printed on your own server. The only exception is the ValidGraph connection, which you have to set up yourself with your own API key. Requests go through a server-side proxy, so the key is never exposed to the browser.<\/p><\/dd>\n<dt id=\"can%20i%20turn%20off%20the%20blocks%20i%20do%20not%20use%3F\"><h3>Can I turn off the blocks I do not use?<\/h3><\/dt>\n<dd><p>Yes. Settings &gt; Blocks enables or disables each of the nine blocks. A disabled block disappears from the inserter and stops emitting JSON-LD.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20block%20themes%20and%20the%20site%20editor%3F\"><h3>Does it work with block themes and the site editor?<\/h3><\/dt>\n<dd><p>Yes. The blocks use the standard block API and work in any theme, classic or block based. The plugin does not depend on a particular theme.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20with%20woocommerce%3F\"><h3>Can I use it with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. You can add Review, FAQ or any other block to a product page. If WooCommerce or your SEO plugin already emits <code>Product<\/code> markup for the same item, use one or the other, not both.<\/p><\/dd>\n<dt id=\"what%20about%20performance%3F\"><h3>What about performance?<\/h3><\/dt>\n<dd><p>The graph is assembled during the render of the page and printed as one JSON-LD script. There are no extra HTTP requests on the front end, no jQuery, and no impact on Core Web Vitals.<\/p><\/dd>\n<dt id=\"is%20it%20translation-ready%3F\"><h3>Is it translation-ready?<\/h3><\/dt>\n<dd><p>Yes. Every string is translatable, and the schema output carries an <code>inLanguage<\/code> property derived from your site language.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20uninstall%20it%3F\"><h3>What happens if I uninstall it?<\/h3><\/dt>\n<dd><p>Uninstalling removes the plugin's own data: settings, the author profile fields it added, and the per-post schema meta. Your posts and pages are untouched, though the blocks stop rendering, so export or migrate your markup first if you plan to move.<\/p><\/dd>\n<dt id=\"can%20developers%20change%20the%20output%3F\"><h3>Can developers change the output?<\/h3><\/dt>\n<dd><p>Yes. Every block node, the site-level nodes and the whole <code>@graph<\/code> pass through documented filters, and the plugin exposes public seams for add-ons. See the \"For developers\" section above.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Fixed: a FAQ block sharing a page with a Product, Event, Recipe, How-To, Job Posting, Local Business or Review block no longer emits a broken <code>FAQPage<\/code>. The other block claims the page's <code>mainEntity<\/code>, which overwrote the FAQ's question list while the <code>FAQPage<\/code> type stayed behind \u2014 a type whose one required property pointed somewhere else, with no question left anywhere in the graph. The type now goes with the list, so the page declares only what it actually carries. A FAQ block on its own is unchanged.<\/li>\n<li>Fixed: the settings tab error message was Spanish on every site. The boundary that catches a settings tab failing to load had its source string written in Spanish, so an English site was shown Spanish, and every other language was translated from Spanish rather than from English. The source string is English now and all ten catalogues carry a real translation of it.<\/li>\n<li>New: the interface is available in ten languages. The whole catalogue \u2014 857 strings each \u2014 is translated, compiled and shipped for Spanish, French, German, Italian, Dutch, Portuguese (Portugal and Brazil), Chinese (simplified and traditional) and Japanese, so the settings page, the block cards, the author-profile section and both Validgraph panels speak the site's language. Schema.org type and property names (<code>Product<\/code>, <code>sameAs<\/code>, <code>@id<\/code>) are left as written wherever they name what lands in your JSON-LD, because translating an identifier would teach you something false about your own markup. <code>languages\/GLOSSARY.md<\/code> writes that rule down, along with the plural rule each locale needs. Once the plugin is listed on WordPress.org, community translations take precedence over these.<\/li>\n<li>Fixed: the plugin's interface can be translated. Only 165 of its strings ever reached the translation catalogue, because the extractor cannot read TypeScript and was told to skip the compiled bundles where those same strings survive as ordinary calls \u2014 so the settings page, the block cards, the author-profile section and both Validgraph panels stayed English in every language. The catalogue now holds 857 strings, and every script bundle is told where to find its translations, blocks included. That is the plumbing the shipped catalogues need.<\/li>\n<li>New: the Entities tab draws the graph. Connected to ValidGraph, an \"Entity graph\" section shows the site-level graph this plugin emits as a picture \u2014 one circle per entity, one arrow per <code>@id<\/code> reference, your identity in the middle \u2014 built from the same PHP that prints the JSON-LD, so it cannot show something the front end does not. Screen readers get the same relations as a list. Without a connection the section says what the picture would be and links to the Validgraph tab; it sends no request and shows no notice.<\/li>\n<li>Changed: one visual language across the plugin's screens. Every collapsible group in Settings is the same card \u2014 the Identity tab's Address and Contact Point were the last two in the old panel style and now match Legal, Expertise and Wikidata exactly. Each tab and each titled section carries a small monochrome icon from one shared map, hidden from screen readers so names are unchanged. Additional type moved into the Wikidata section, next to the ID it usually points at. The Settings page, the author-profile section and the Validgraph tab share one spacing, radius, border and help-text scale, and block card sections take their icons from the same map. Motion respects <code>prefers-reduced-motion<\/code>. No stored data and no emitted JSON-LD changes.<\/li>\n<li>Changed: the Settings page is five tabs, one question each. <strong>Identity<\/strong> (who you are: type, name, logo, description, contact, address, plus the legal, expertise and Wikidata fields that used to sit on Advanced), <strong>Entities<\/strong> (how you link to the world: canonical @id, Same As, related entities, the authors with a schema profile, and a graph preview), <strong>Site<\/strong> (what this site is: WebSite, breadcrumbs, content types, and the \"do not emit site-level schema\" switch), <strong>Blocks<\/strong> and <strong>Validgraph<\/strong>. Advanced survives only as the extension point for other plugins and is listed only when one fills it. Old links keep working: <code>site-identity<\/code> opens Identity, and <code>website<\/code>, <code>breadcrumbs<\/code> and <code>content-types<\/code> open Site. Looking for \"Social Profiles\"? It is Entities \u203a Same As now.<\/li>\n<li>New: the Entities tab explains the four things that all look like a URL \u2014 <code>@id<\/code>, <code>url<\/code>, <code>sameAs<\/code> and a related entity \u2014 so it is clear which box a value belongs in. Related-entity rows are cards: pick the relation from a grouped list with a sentence explaining it, and the schema type fills itself in and locks when the relation implies one (founder is always a Person). The row's URL box is gone; it is derived from the @id, and any URL already stored is kept.<\/li>\n<li>New: the Entities tab lists every user with a schema profile, their canonical @id and a link to edit it, and names the user mapped as the site Person.<\/li>\n<li>Changed: each content type row on the Site tab shows its own icon.<\/li>\n<li>Changed: the \"Schema \u2014 author profile\" section on the WordPress profile screen is now the same React interface as the Settings page \u2014 Identity, Expertise, Links and Organization cards, a token field for the areas of expertise, repeatable rows for credentials and alumni, a URL list for sameAs and a checkbox list for colleagues \u2014 and it links to the Settings page where the site organization and its canonical <code>@id<\/code> are defined. What gets saved, and who is allowed to save it, is unchanged.<\/li>\n<li>Changed: one <code>sameAs<\/code> list per identity. The six fixed social-profile boxes on the Site Identity tab, the LinkedIn\/ORCID\/ResearchGate\/Wikipedia URL fields on the Advanced tab and the Website tab's <code>sameAs<\/code> repeater are replaced by a single \"Same As \/ profiles\" list on the identity itself \u2014 any page that is this organization or person elsewhere goes there, including networks the plugin never had a field for. Existing values are folded into the list the first time the settings are read and persisted on the next save; nothing is lost and no migration runs. The Wikidata ID stays its own field.<\/li>\n<li>Changed: <code>WebSite<\/code> no longer emits <code>sameAs<\/code> \u2014 the property describes the organization or person, not the website, so it now lives only on the identity node.<\/li>\n<li>Changed (breaking, for addons): the settings payload drops <code>site_identity.social_profiles<\/code>, <code>person.person_social_profiles<\/code> and <code>website.site_same_as<\/code> in favour of <code>site_identity.same_as<\/code> \/ <code>person.person_same_as<\/code> (both <code>string[]<\/code>), and the identity-extra option drops <code>same_as_linkedin<\/code>, <code>same_as_orcid<\/code>, <code>same_as_researchgate<\/code> and <code>wikipedia_url<\/code>. The completeness contributor ids <code>org.social<\/code> \/ <code>person.social<\/code> and their weights are unchanged.<\/li>\n<li>New: the Validgraph tab explains itself. Without a connection it now shows what ValidGraph checks in the graph this plugin emits \u2014 validation against the full schema.org vocabulary with a corrected snippet for every error, a completeness score and rich-result eligibility for 16 result types on Pro, six AI-discoverability checks, and the scheduled rescans that come with Agency \u2014 plus links to create a free account or read the pricing, and an \"I already have an API key\" disclosure that reveals the connect form. With a connection it shows tier, remaining quota, the project, the re-validate toggle, where the connection works in this site, and a link to the dashboard. New filter <code>cddc_schema_blocks_validgraph_pitch<\/code> rewrites every string and URL.<\/li>\n<li>New: a discreet Validgraph panel in the post sidebar when the site is not connected \u2014 one sentence and a link to the settings tab. No admin notice, no pre-publish check and no request is sent until a key is saved.<\/li>\n<li>New: one entity, one identifier across several sites. The Site Identity tab gains a \"Canonical @id\" field that replaces this site's own <code>#organization<\/code> \/ <code>#person<\/code> id everywhere the plugin references the identity, a \"Related entities\" list that expresses relations toward entities living on other sites (founder, employee, owns, brand, parentOrganization, worksFor, knows\u2026), and the author profile gains the same canonical id field so one person is one node on every site. Each referenced entity also gets a small node of its own, so no reference dangles. Sites that fill none of these fields emit exactly what they emit today.<\/li>\n<li>New: the Product block can carry a canonical <code>@id<\/code> and a more specific schema type (Software application or Book), emitted alongside <code>Product<\/code> so offers and ratings keep validating as a product rich result.<\/li>\n<li>New: the Product block can describe the type it declares. Choosing Software application reveals an application category and an operating system; choosing Book reveals an ISBN and a book author. Fields are kept when the type changes, so switching back restores what was typed, and only the fields of the declared type are emitted, so the graph never contradicts its own type.<\/li>\n<li>Changed: extensibility contract 1.9.0 (additive) \u2014 new public filter <code>cddc_schema_blocks_author_person_id<\/code>, and a collector-provided <code>@id<\/code> now survives the graph dispatcher.<\/li>\n<li>Fixed: internal references between nodes now carry the target's <code>@type<\/code> \u2014 <code>WebSite.publisher<\/code>, <code>WebPage.isPartOf<\/code>, <code>Review.author<\/code> and every other <code>@id<\/code> reference print as <code>{\"@id\": \u2026, \"@type\": \u2026}<\/code> instead of a bare id, so consumers no longer have to resolve the graph to learn what a reference points at.<\/li>\n<li>Fixed: <code>WebSite.author<\/code> references the site Person instead of emitting a second, anonymous Person node, whenever the Website tab's author URL is the site itself.<\/li>\n<li>Changed: one validated source for the site language. The Website tab's language field is checked against the BCP-47 shape (invalid values are flagged in the form and discarded on save), and every <code>inLanguage<\/code> the plugin emits \u2014 WebSite, WebPage, Article, FAQ and Review \u2014 reads the same resolved value, falling back to the WordPress locale. WebSite and WebPage can no longer disagree.<\/li>\n<li>New: optional identity fields \u2014 a disambiguating description for the organization, the person and the site, an <code>additionalType<\/code> URI (Wikidata class or another ontology), and for a Person identity: the employer's canonical <code>@id<\/code>, an alumni URL, a repeatable \"member of\" list, a brand, and a contact point built from the person's phone and email. An organization referenced by <code>@id<\/code> gets its own Organization node in the graph, so the reference never dangles. Every field is optional and a site that fills none of them emits the node it emits today.<\/li>\n<li>New: a <code>ProfilePage<\/code> override on a Person-identity site points <code>about<\/code> (and <code>mainEntity<\/code>, when no block claims it) at that Person, and the front page falls back to the site description when the page itself yields none.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>New: seven more blocks \u2014 Recipe, Product, Event, Local Business, How-To, Job Posting and Breadcrumb. Recipe carries Ingredients, Instructions and Nutrition as inner blocks, so the markup describes what the page shows.<\/li>\n<li>New: per-author E-E-A-T profiles. The WordPress profile screen gains job title, honorific prefix, sameAs URLs, areas of expertise, credentials, <code>alumniOf<\/code>, a colleague picker (<code>knows<\/code>), an avatar override and opt-in member\/founder links to the site organization; those fields enrich every author <code>Person<\/code> node (which also carries <code>givenName<\/code>\/<code>familyName<\/code>), the Organization lists members as <code>employee<\/code>\/<code>founder<\/code>, and author archives are typed as <code>ProfilePage<\/code>.<\/li>\n<li>New: per-post content-type and page-type overrides from a \"Schema\" panel in the document sidebar.<\/li>\n<li>New: advanced site-identity fields \u2014 Wikidata ID, Wikipedia URL, legal name, VAT ID, employee count, job title, credentials, areas of expertise (<code>knowsAbout<\/code>, for Organization and Person alike) and LinkedIn\/ORCID\/ResearchGate profiles \u2014 on the Settings page's Advanced tab, together with a toggle that suppresses the site-level nodes when another plugin already emits them.<\/li>\n<li>Fixed: the E-E-A-T identity fields (job title, credentials, areas of expertise, ORCID\/LinkedIn\/ResearchGate) never reached the output when the site identity was a Person. The Person node is emitted with the hybrid type <code>[\"Person\",\"Organization\"]<\/code>, and the overlay compared the type as a plain string, so every one of those fields was dropped.<\/li>\n<li>New: entity linking on the blocks \u2014 Event organizer, Product brand and manufacturer, How-To publisher and Recipe author can reference the site identity or the post author instead of repeating free text, and a Local Business block can compose itself into the site identity.<\/li>\n<li>Changed: the Blocks tab lists all nine blocks, enabled or disabled individually and saved by the same Save button.<\/li>\n<li>Changed: extensibility contract 1.8.0 (additive) \u2014 the seven <code>cddc_schema_{type}_output<\/code> filters and <code>cddc_schema_blocks_identity_extra_schema<\/code> are public plugin filters. Every existing <code>cddc_schema_blocks_*<\/code> hook, the <code>window.cddcSchema.ui<\/code> toolkit and the <code>cddc.settings.*<\/code> JS hooks are unchanged.<\/li>\n<li>Changed: uninstalling removes everything the plugin stores \u2014 its settings option, the author-profile user meta and both post meta keys.<\/li>\n<li>New: Article nodes carry <code>description<\/code> from the manual excerpt, <code>wordCount<\/code>, <code>keywords<\/code> from the post tags and every category in <code>articleSection<\/code>.<\/li>\n<li>Fixed: credentials are emitted as the <code>name<\/code> of the <code>EducationalOccupationalCredential<\/code>, not as <code>credentialCategory<\/code>.<\/li>\n<li>Changed: the \"another schema plugin detected\" notice links straight to that plugin's schema settings (Yoast, Rank Math, AIOSEO, SEOPress, Schema Pro) and to the Advanced tab toggle, instead of to our Settings page.<\/li>\n<li>Compat: Tested up to WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Fixed: the ValidGraph validation bridge now calls the correct API endpoint (<code>validgraph.com\/api\/v1\/...<\/code>) \u2014 the previous URL (<code>wp-json\/validgraph<\/code>) never resolved, so validation requests always failed.<\/li>\n<li>Fixed: the Website settings tab now reaches the output \u2014 the <code>WebSite<\/code> node emits <code>description<\/code>, <code>inLanguage<\/code> and <code>author<\/code> from the fields the tab already collected, each omitted when empty. Previously five fields were saved and previewed but never emitted.<\/li>\n<li>Changed: the Website tab's \"sameAs\" field accepts several URLs instead of one, using the same repeater the Review block uses. Stored single URLs keep working and are converted on the next save; no migration needed. The publisher URL stays a fallback \u2014 when a site identity is configured, the <code>WebSite<\/code> node keeps referencing it instead.<\/li>\n<li>New: review authors can be attributed to the site identity \u2014 a new \"Attribute to the site identity\" toggle on the Review block makes <code>Review.author<\/code> reference the site Organization or Person node instead of an anonymous inline author, and the visible byline is resolved at render time, so renaming the identity in Settings updates published posts without re-saving them. Falls back to the inline author when no identity is configured, so a reference never dangles. Extensibility contract bumped to <code>1.7.0<\/code> \u2014 <code>Schema_Graph::registered_identity_id()<\/code> is now a public seam.<\/li>\n<li>Changed: review <code>@id<\/code>s are now stable across block reordering \u2014 each Review node derives its <code>@id<\/code> from the block's own id (<code>{permalink}#review-a1b2c3d4<\/code>) instead of its position on the page, and duplicated blocks emit two nodes instead of silently merging into one. Reviews saved before this release keep their current ids; nothing is rewritten.<\/li>\n<li>New: book details on the Review block \u2014 when the reviewed item type is <code>Book<\/code>, a new \"Book Details\" section adds author, publisher, publication date, format, page count, ISBN and external identity URLs (OpenLibrary, Wikidata, Goodreads). The filled fields are emitted on <code>itemReviewed<\/code> (<code>author<\/code>, <code>publisher<\/code>, <code>datePublished<\/code>, <code>bookFormat<\/code>, <code>numberOfPages<\/code>, <code>isbn<\/code>, <code>sameAs<\/code>) and shown as a metadata line under the item name, so the markup describes visible content. Every field is optional and existing reviews are unchanged.<\/li>\n<li>New: author Person entities \u2014 the automatic Article node now carries an <code>author<\/code> referencing a <code>Person<\/code> node built from the post author's WordPress profile (name, author archive URL, avatar, bio, website). Nodes are minted on demand with a stable, PII-free <code>@id<\/code>, deduplicated against the site Person identity via a new Site Identity \"WordPress user\" picker. Extensibility contract bumped to <code>1.5.0<\/code> \u2014 new <code>Schema_Graph::ensure_author_person()<\/code> seam (callable by addons) and <code>cddc_schema_blocks_author_person<\/code> enrichment filter for E-E-A-T fields.<\/li>\n<li>New: automatic Article schema \u2014 posts now emit an <code>Article<\/code> node (<code>{permalink}#article<\/code>) wired into the unified graph, with headline, dates, publisher, primary image, and category. A new Content settings tab maps each public post type to None, Article, or Blog posting (default: posts \u2192 Article). Extensibility contract bumped to <code>1.4.0<\/code> \u2014 new <code>cddc_schema_blocks_page_content_type<\/code> filter (per-post type overrides, e.g. <code>NewsArticle<\/code>) and main-entity election API (<code>Schema_Graph::flag_main_entity()<\/code>) so addon content nodes replace the automatic Article instead of competing with it.<\/li>\n<li>New: FAQ and Review schemas now emit an <code>inLanguage<\/code> property derived from the site language (BCP-47, e.g. <code>en-US<\/code>). No configuration needed; overridable via the <code>cddc_schema_faq_output<\/code> \/ <code>cddc_schema_review_output<\/code> filters.<\/li>\n<li>Changed: unified JSON-LD output \u2014 the page now prints one <code>&lt;script type=\"application\/ld+json\"&gt;<\/code> with a single <code>@graph<\/code> instead of two separate scripts. Adds WebPage (and primary image) anchor nodes linking site identity, WebSite, breadcrumbs, and block schemas together. Extensibility contract bumped to <code>1.3.0<\/code> \u2014 new <code>cddc_schema_blocks_graph_nodes<\/code> filter.<\/li>\n<li>Changed: the FAQ block's <code>{permalink}#faq<\/code> node id is retired \u2014 its questions now live on the page's WebPage node (<code>@type: [\"WebPage\",\"FAQPage\"]<\/code>, <code>mainEntity<\/code>). FAQ rich results were retired by Google (2026-05-07), so no SERP feature depends on the old id.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: Extensibility contract 1.1.0 \u2014 the shared schema-ui editor toolkit is now exposed to addons on <code>window.cddcSchema.ui<\/code> via the <code>cddc-schema-ui<\/code> script handle (SchemaBlockCard, SchemaFormSection, SchemaPreviewInline, DurationInput, and more).<\/li>\n<li>New: Extensibility contract 1.2.0 \u2014 added the <code>cddc_schema_blocks_settings_url<\/code> filter so a companion hosting the Settings screen elsewhere can correct internal links (admin notices, the plugins-list action link).<\/li>\n<li>New: \"Settings\" action link on the Plugins screen, next to Deactivate.<\/li>\n<li>New: WordPress Playground blueprint (<code>.wordpress-org\/blueprints\/blueprint.json<\/code>) powering the Live Preview button on the wp.org plugin directory.<\/li>\n<li>Fix: the site-wide BreadcrumbList is suppressed on pages containing an addon breadcrumb block with manual items, so a page never emits two BreadcrumbList schemas.<\/li>\n<li>Fix: the Review block's <code>reviewBody<\/code> now falls back to the block's rendered HTML when the attribute isn't set explicitly.<\/li>\n<li>Removed: the dead <code>load_optional_integrations()<\/code> bootstrap and <code>Admin_Integration<\/code> companion-coupling code (unreachable without a package this plugin never ships) \u2014 the Settings screen registration is simpler and wp.org-review-clean as a result.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>New: FAQ summaries now show an animated +\/\u00d7 icon that rotates when an item opens. Pure CSS driven by the native <code>details[open]<\/code> state (no JS), mirrored in the editor and respecting <code>prefers-reduced-motion<\/code>.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: Review block now renders translatable labels through <code>__()<\/code> so strings reach the <code>.pot<\/code> and translations apply at render time.<\/li>\n<li>Compat: Tested up to WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix (WordPress.org review): conflict admin notice no longer emits an inline <code>&lt;script&gt;<\/code> tag \u2014 the dismiss handler is now an enqueued asset (<code>assets\/admin\/conflict-notice.js<\/code>) wired via <code>data-*<\/code> attributes on the notice container. The notice is also gated to the plugin Settings page and <code>plugins.php<\/code> only.<\/li>\n<li>Fix (WordPress.org review): FAQ block render callback no longer echoes a <code>WP_HTML_Tag_Processor<\/code>-mutated HTML string. The wrapper <code>&lt;div&gt;<\/code> is composed from escape-aware core APIs, and per-<code>&lt;details&gt;<\/code> Interactivity API directives are now injected via a <code>render_block<\/code> filter scoped to FAQ-ancestor renders. Foreign <code>data-wp-*<\/code> directives on nested blocks are preserved.<\/li>\n<li>Fix: Settings page rendered empty when the centralized Codedication admin was active. The plugin now registers a \"Settings\" tab inside the centralized renderer and the React app hydrates from saved option values.<\/li>\n<li>Fix: <code>useSlotFills<\/code> crash on older <code>@wordpress\/components<\/code>; the Advanced tab now derives its visibility from the internal fill bridge.<\/li>\n<li>Improvement: Completeness score redistributed to weigh Site Identity (75), Website (20) and Breadcrumbs (5) \u2014 previously only Site Identity counted, so the page could reach 100% while Website and Breadcrumbs were empty.<\/li>\n<li>New filter: <code>cddc_schema_blocks_is_settings_screen<\/code> lets integrations declare authoritatively when the React Settings app should be enqueued.<\/li>\n<li>Cleanup: removed dead code paths in <code>Admin_Integration<\/code>, dead <code>utils\/completeness-score.ts<\/code> \/ <code>utils\/json-ld-preview.ts<\/code> modules, the unused <code>HelpTip<\/code> component family and the divergent PHP <code>Site_Schema::get_completeness_score()<\/code> (the React UI is now the single source of truth for completeness).<\/li>\n<li>Fix: schema-conflict admin notice now links to the real settings screen (<code>Admin_Integration::get_settings_url()<\/code>) instead of guessing from <code>class_exists()<\/code>, so the link is correct in the fallback path where the shared admin package exists but its renderer is not yet available.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>FAQ Block with FAQPage schema<\/li>\n<li>FAQ Item child block<\/li>\n<li>Review Block with Review schema<\/li>\n<li>Support for 6 item types<\/li>\n<li>Settings page for block management<\/li>\n<li>Interactivity API for accordion<\/li>\n<\/ul>","raw_excerpt":"Nine schema blocks - FAQ, Review, Recipe, Product, Event, Local Business, How-To, Job Posting, Breadcrumb - emitted as one JSON-LD graph.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/302780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=302780"}],"author":[{"embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/codedication"}],"wp:attachment":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=302780"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=302780"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=302780"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=302780"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=302780"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=302780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}