/ JSON Checker Fixes / Schema Conflicts

How to Fix Schema Conflicts

Many sites accidentally output schema from multiple sources — theme, SEO plugin, page builder, manual additions — each declaring the same entity types with different values. The page ends up with three Article blocks declaring three different publish dates, two Organization blocks with different logos, and contradictions Google can't reconcile. The fix is consolidating into a single JSON-LD block with one source of truth using @graph.

1. Find conflicts

Step 1
Count JSON-LD blocks per page
curl -s https://yoursite.com/page | grep -c 'application/ld+json'
Healthy: 1. Common: 3-5. Problem: 6+. Each block needs justification.
Step 2
Test with Rich Results Test
search.google.com/test/rich-results shows each block separately under "Detected items". Compare blocks — values for the same field should match across blocks.
Step 3
Identify the sources
In your page source, JSON-LD blocks often have HTML comments above them indicating the source:
<!-- Yoast SEO -->
<script type="application/ld+json">{...}</script>

<!-- Theme -->
<script type="application/ld+json">{...}</script>

<!-- WP Schema Pro -->
<script type="application/ld+json">{...}</script>
Each is a candidate for consolidation or removal.

2. Common conflict patterns

Duplicate Organization

<!-- From theme -->
<script type="application/ld+json">
{ "@type": "Organization", "name": "Acme Co", "url": "https://acme.com" }
</script>

<!-- From Yoast -->
<script type="application/ld+json">
{ "@type": "Organization", "name": "Acme Co Ltd.", "url": "https://www.acme.com",
  "logo": "https://acme.com/logo.svg" }
</script>

Two declarations of the same Organization with different names and URLs. Google may merge, may pick one, may ignore both. Fix: pick the canonical version, remove the other.

Contradictory Article fields

<!-- Block 1 says publish date 2024-01-15 -->
<script type="application/ld+json">
{ "@type": "Article", "datePublished": "2024-01-15" }
</script>

<!-- Block 2 says publish date 2024-02-03 -->
<script type="application/ld+json">
{ "@type": "Article", "datePublished": "2024-02-03" }
</script>

One is your real publish date; the other is from somewhere with stale data. Both fields visible to Google, neither obviously correct. Fix: single source for dates, remove the duplicate.

Plugin-driven Product duplication

Common e-commerce pattern: WooCommerce outputs Product schema, then Yoast outputs Product schema, then a "structured data plugin" outputs Product schema. Three blocks, three slightly different formats. Pick one plugin/source, disable schema in the others.

3. Consolidate into @graph

One JSON-LD block with multiple typed entities, all sharing the same context and cross-referenced via @id.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://acme.com/#organization",
      "name": "Acme Co",
      "url": "https://acme.com",
      "logo": "https://acme.com/logo.svg"
    },
    {
      "@type": "WebSite",
      "@id": "https://acme.com/#website",
      "url": "https://acme.com",
      "publisher": { "@id": "https://acme.com/#organization" }
    },
    {
      "@type": "WebPage",
      "@id": "https://acme.com/page#webpage",
      "url": "https://acme.com/page",
      "isPartOf": { "@id": "https://acme.com/#website" },
      "inLanguage": "en-GB"
    },
    {
      "@type": "Article",
      "@id": "https://acme.com/page#article",
      "headline": "Article title",
      "datePublished": "2024-01-15",
      "isPartOf": { "@id": "https://acme.com/page#webpage" },
      "publisher": { "@id": "https://acme.com/#organization" }
    },
    {
      "@type": "BreadcrumbList",
      "@id": "https://acme.com/page#breadcrumb",
      "itemListElement": [
        { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://acme.com/" },
        { "@type": "ListItem", "position": 2, "name": "Article" }
      ]
    }
  ]
}
</script>

One block, five typed entities, properly cross-referenced. Google sees a coherent semantic graph instead of contradictory fragments.

4. Disable redundant sources

WordPress: Yoast SEO vs theme

If using Yoast (or Rank Math, AIOSEO), let it generate schema. Disable theme schema:

// functions.php - remove theme schema output
function disable_theme_schema() {
  remove_action('wp_head', 'theme_function_that_outputs_schema');
}
add_action('init', 'disable_theme_schema');

Or in theme settings, look for "Output schema markup" toggle, turn off.

Shopify: theme schema vs apps

Shopify themes often include built-in schema. If you've installed an SEO app that adds more, the theme schema typically needs disabling in theme.liquid:

{%- comment -%} Disable built-in schema, app handles it {%- endcomment -%}
{%- comment -%} {% render 'structured-data' %} {%- endcomment -%}

Drupal/Joomla: pick a single module

Don't run two structured-data modules simultaneously. Pick one (Schema.org Metatag for Drupal, JSON-LD Schema for Joomla) and disable the others.

5. Verify consolidation

Step 1
Re-test with Rich Results
One block, multiple entities, all valid. No duplicates of the same @type. No contradictions across fields.
Step 2
Check Search Console enhancements
Search Console → Enhancements section shows which schema types Google detects. After consolidation, the count of detected entities should match what you ship — no phantom duplicates.

6. Prevent regression

Schema conflicts often return when new plugins are installed or themes updated. Defence:

💡 The @graph pattern is what every modern schema reference recommends. Yoast and Rank Math both ship @graph output by default in recent versions. If your tooling outputs separate blocks per entity, it's probably old — check for updates.

📋 Re-run the JSON Checker

Verify schema conflict findings are cleared.

Run JSON Checker →
Related Guides: JSON Checker Fixes  ·  Fix JSON Syntax  ·  Schema Drift Fixes  ·  JSON Checker Guide
💬 Got a problem?