WordPress Plugins
Free Tools
Claude Skills
Resources
Pricing Support My Account Cart
Support/SEObolt/Custom JSON-LD in the Schema Generator

Custom JSON-LD in the Schema GeneratorPRO

SEObolt Pro's Schema Generator ships with 67 templates covering the most common schema.org types. When you need something the templates don't cover, or when you want to hand-craft a schema block to match an exact rich-result shape, the Custom JSON-LD field lets you paste a full JSON-LD block that SEObolt adds to the page's structured data. This guide walks through where the field lives, how to paste your first block, how HTML tags inside your schema field values are preserved through save, and how to validate your JSON-LD before you paste it.

What Custom JSON-LD Is For

The Schema Generator's built-in templates cover the schema.org types most sites need: Article, Product, Service, LocalBusiness, Organization, FAQPage, HowTo, Event, and about fifty others. When you use a template, SEObolt asks you to fill named fields and it renders a schema block for you.

The Custom JSON-LD field is the escape hatch for the cases the templates don't cover. Common reasons to use it:

Whatever you paste into the Custom JSON-LD field is added to your page's structured data as you wrote it, inside the single <script type="application/ld+json"> graph SEObolt outputs in the page's <head>. SEObolt keeps your values as you wrote them, HTML tags included, apart from escaping quotes for JSON safety and leaving out empty values such as "image": "", which aren't valid schema. If your block uses @graph, each node in it is added to the page's graph next to SEObolt's own schema.

Prerequisites

SEObolt Pro 2.4.176 or later, on any tier that includes the Schema Generator. A valid JSON-LD block (see the Validate before you paste section below for how to check yours). Basic familiarity with schema.org's docs at schema.org/docs/gs.html if you're hand-writing your first block.

Where the Custom JSON-LD Field Lives

The Custom JSON-LD field is set per post (or per page, per custom post type). It's not a site-wide setting; each post gets its own blocks, and each post's blocks are output only on that post's URL.

In the WordPress editor (Gutenberg or Classic)

Open the post you want to add schema to

Edit the post or page in the WordPress editor. The Custom Schemas box appears below the post content and lists the schemas already attached to this post.

Open the Add Schema window

Click Add Schema. The window has three tabs: Templates, Import, and Custom JSON.

Paste your block on the Custom JSON tab

Click Custom JSON and paste your JSON-LD, the whole block including the outer braces and @context. The block needs an @type or a @graph at the top level. A line under the box says Valid JSON-LD. once the block parses, or shows the exact JSON error if it doesn't.

Click Use Selected, then update the post

Use Selected becomes clickable as soon as the block is valid. Click it and the block appears in the Custom Schemas list. Then click Update (or Publish) on the post to save it. To change the block later, click Edit next to it in the list; it reopens on the Custom JSON tab with your block filled in.

In Elementor

Open the SEObolt panel in the Elementor editor, go to the Schema tab, and click Schema Generator. On the Custom tab, fill in Schema Name and Schema Type, paste your block into JSON-LD, and click Create Schema. To switch an existing schema to custom JSON-LD, click its Edit button, turn on Use Custom JSON-LD (Advanced), paste your block into Custom JSON-LD, and click Save Schema.

Linking to SEObolt's Own Schema

SEObolt outputs a set of schema nodes with fixed @id values. Your custom block can point at them with {"@id": "..."} instead of repeating the same data. Replace https://example.com with your site's home URL and https://example.com/your-page/ with the page's own URL (with its trailing slash).

@idNodeOutput on
https://example.com/#organizationOrganizationEvery page
https://example.com/#websiteWebSiteEvery page
https://example.com/#localbusinessLocalBusiness (your business type)The homepage plus the About and Contact pages you pick in Local SEO, when the Local SEO module is on and a business name is set
https://example.com/your-page/#webpageWebPageThat post or page
https://example.com/your-page/#breadcrumbBreadcrumbListThat post or page
https://example.com/your-page/#articleArticleThat post or page, when its schema type is Article (the default)

A reference only resolves when the node it points at is on the same page. On posts and pages, Organization, WebSite, WebPage, and BreadcrumbList are always there, so they're safe to reference; #article is there when the post's schema type is Article. #localbusiness is only on the pages listed above; on any other page, reference #organization instead, or put the business details in your own block.

For example, a WebPage block on a loyalty page that belongs to the site and is about the business:

{
  "@context": "https://schema.org",
  "@type": "WebPage",
  "@id": "https://example.com/loyalty/#webpage",
  "url": "https://example.com/loyalty/",
  "name": "Rewards Club",
  "isPartOf": { "@id": "https://example.com/#website" },
  "about": { "@id": "https://example.com/#organization" }
}

When Your Block Uses an @id SEObolt Already Uses

If a node in your custom block has the same @id as a node SEObolt generates, your node replaces SEObolt's on that page. The example above does this on purpose: its #webpage node is output instead of the basic WebPage SEObolt would add. There is only ever one node per @id on the page.

Two practical rules follow:

Validate Before You Paste

Nine out of ten "my custom JSON-LD isn't working" support tickets come down to a JSON syntax error in the block itself. A single trailing comma, a curly quote instead of a straight quote, or a missing brace, and the whole block is invalid. Browsers and Google's Rich Results test will silently ignore it.

Before you paste into SEObolt, run your block through our free Schema Validator tool. It checks JSON syntax, warns on missing required properties per schema.org, and flags common Google rich-result eligibility gaps.

Free tool, no signup

Royal Plugins Schema Validator → Paste your JSON-LD (or the URL of a page you want to validate). Instant syntax check, missing-property warnings, and Google rich result eligibility. Save it as a bookmark, it's the fastest way to catch a bad block before it ships.

If the validator surfaces errors, fix them there first, then paste the corrected block into SEObolt. That way SEObolt is receiving a known-good block, and if the schema still doesn't behave as expected on your live page you know the issue is on the plugin or theme side, not in your JSON.

HTML Tags in Field Values

Schema.org allows plain HTML inside certain field values (Article body content, product descriptions, service listings, FAQ answers, review bodies). SEObolt preserves those tags through save so you can wrap emphasis, links, and lists the way schema.org intends.

For example, this Article articleBody field with inline HTML tags is stored, escaped for JSON safety, and output with its HTML tags intact:

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "How to Use Custom JSON-LD",
  "articleBody": "Paste any <strong>JSON-LD block</strong> into the Custom field. Wrap key phrases with <em>emphasis</em>, list <ul><li>items</li><li>here</li></ul>, and include <a href='https://example.com'>links</a>."
}
Quotes inside HTML values

Type the HTML tags as they are; don't convert < to &lt;, or the entity ends up in your schema as literal text. Double quotes inside a value must be escaped as \", so use single quotes for HTML attributes (<a href='...'>), as in the example. If you paste from a text editor that converts quotes to curly quotes, check the result in the Schema Validator before saving.

Common places where HTML in a JSON-LD field is legitimate per schema.org:

Common Templates You Can Copy

Three starter blocks below, each valid schema.org and ready to paste. Replace the placeholder values with your own before saving.

Service page

{
  "@context": "https://schema.org",
  "@type": "Service",
  "name": "Your Service Name",
  "description": "Short one-line pitch that reads well in a rich result.",
  "provider": {
    "@type": "Organization",
    "name": "Your Business Name",
    "url": "https://example.com"
  },
  "areaServed": {
    "@type": "AdministrativeArea",
    "name": "City or Region"
  },
  "serviceType": "Category label (Consulting, Repair, Cleaning, etc.)"
}

Product with in-stock offer

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Product Name",
  "description": "Product description with <strong>HTML preserved</strong> through save.",
  "brand": {
    "@type": "Brand",
    "name": "Your Brand"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/product-page",
    "priceCurrency": "USD",
    "price": "49.00",
    "availability": "https://schema.org/InStock"
  }
}

Article with author

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Your Article Title",
  "author": {
    "@type": "Person",
    "name": "Author Name",
    "url": "https://example.com/author-bio"
  },
  "datePublished": "2026-09-17",
  "dateModified": "2026-09-17",
  "articleBody": "Full body text. HTML like <em>emphasis</em> and <a href='https://example.com'>links</a> is preserved."
}

Validate each one in the Schema Validator after you fill your values in.

Troubleshooting

Use Selected stays grey on the Custom JSON tab

The button only turns on once the box holds valid JSON-LD. Read the line under the box: it shows the JSON error and its position (a trailing comma, a curly quote, a missing brace), or says the block needs an @type or @graph at the top level. Fix that and the button becomes clickable. If there's no line under the box at all, update SEObolt Pro to 2.4.176 or later and hard-reload the editor tab (Ctrl+Shift+R or Cmd+Shift+R).

My block saves but doesn't render on the page

First, check the block validates as JSON in the Schema Validator. Second, make sure you clicked Update on the post after adding the block; adding it to the Custom Schemas list doesn't save the post by itself. Then view your page source (right-click, View Page Source, search for application/ld+json) and look for one of your block's values. If SEObolt isn't outputting any schema on the page at all, check Settings → Schema in the SEObolt admin for a post-type filter that excludes this page.

A node from my block is missing, or SEObolt's version of it is gone

Your node and SEObolt's share an @id, so yours replaced SEObolt's (see When your block uses an @id SEObolt already uses). If you wanted both, give your node a new @id.

HTML tags in my field values got stripped

Update SEObolt Pro to 2.4.169 or later from the Plugins page, refresh the editor, and re-paste the block.

Schema Score badge stays at zero after save

The Schema Score badge refreshes on save (this landed in SEObolt Pro 2.4.169). If yours doesn't refresh, hard-reload the editor tab (Ctrl+Shift+R or Cmd+Shift+R) to clear any cached script. If the score is genuinely zero, run the block through the Schema Validator to check for missing required properties per schema.org for that @type.

Google's Rich Results Test flags the schema as ineligible

Rich Results eligibility is stricter than raw schema.org validity. Even a syntactically-correct block can be ineligible if it's missing properties Google specifically requires for a rich result (a Product needs an offers with priceCurrency and price, an Article needs author, etc.). The Schema Validator flags the common eligibility gaps; Google's own Rich Results Test is the final source of truth for what will render as a rich result.

A reference in my block points at nothing

An {"@id": "..."} reference only works when a node with that @id is on the same page. Check the spelling against the table in Linking to SEObolt's own schema, and remember #localbusiness is only on the homepage and your Local SEO About and Contact pages.