Skip to main content
seofields
docs
.md

OpinionNewsArticle

The OpinionNewsArticle schema type identifies opinion, editorial, and op-ed content — a dedicated subtype of NewsArticle . Labelling commentary as opinion (rather than reported news) sends a clear E-E-A-T signal to Google Discover, Google News, and AI answer surfaces about the nature and authorship of the piece.

About OpinionNewsArticle

Use OpinionNewsArticle for clearly subjective content — columns, editorials, and op-eds — and reserve NewsArticle for reported journalism. To maximise E-E-A-T, attribute the piece to a real author using the Person variant with a jobTitle and sameAs links to their authoritative profiles, and use the backstory field to document the sources and context behind the opinion. As with all news content, include three image aspect ratios (16x9, 4x3, and 1x1) at ≥ 1200 px wide and keep dateModified current.

Fields

FieldTypeRequiredDescription
headlinestring✓Opinion headline (≤ 110 characters recommended).
descriptiontext—Summary or standfirst of the opinion piece.
imageurl | ImageObject—Lead image. Provide multiple aspect ratios for news surface eligibility.
authorurl | Person—The columnist or byline author. Use the Person variant with jobTitle and sameAs for E-E-A-T.
publisherurl | Organization—The publishing newsroom.
datePublisheddatetime—Publication date and time (ISO 8601).
dateModifieddatetime—Last update date and time (ISO 8601).
articleSectionstring—The section of the publication (e.g. "Opinion", "Editorial").
articleBodytext—The actual body text of the opinion piece.
datelinestring—The location from which the piece was filed (e.g. "Washington, D.C.").
printColumnstring—The number of the column in which the article appears in the print edition.
printEditionstring—The edition of the print product in which the article appears.
printPagestring—The exact name of the print page on which the article is found (e.g. "A5", "B18").
printSectionstring—The print section in which the article appeared.
backstorytext—Sources, context, and provenance behind the opinion piece — a strong E-E-A-T signal.

Plugin Registration

sanity.config.ts
import { defineConfig } from 'sanity'
import { schemaOrgOpinionNewsArticlePlugin } from 'sanity-plugin-seofields/schema'

export default defineConfig({
  plugins: [
    schemaOrgOpinionNewsArticlePlugin(),
  ],
})

Schema Usage

Add the schemaOrgOpinionNewsArticle field to any document schema:

schemas/opinionPiece.ts
import { defineField, defineType } from 'sanity'

export default defineType({
  name: 'opinionPiece',
  title: 'Opinion Piece',
  type: 'document',
  fields: [
    defineField({
      name: 'schemaOrgOpinionNewsArticle',
      title: 'OpinionNewsArticle Schema',
      type: 'schemaOrgOpinionNewsArticle',
    }),
  ],
})

GROQ Query

GROQ query
*[_type == "opinionPiece"][0]{
  schemaOrgOpinionNewsArticle {
    headline,
    description,
    image,
    author,
    publisher,
    datePublished,
    dateModified,
    articleSection,
    articleBody,
    dateline,
    printColumn,
    printEdition,
    printPage,
    printSection,
    backstory
  }
}

Next.js Component

app/opinion/[slug]/page.tsx
import { OpinionNewsArticleSchema } from 'sanity-plugin-seofields/schema/next'

export default function Page({ data }) {
  return <OpinionNewsArticleSchema data={data.schemaOrgOpinionNewsArticle} />
}

JSON-LD Output

Generated JSON-LD
{
  "@context": "https://schema.org",
  "@type": "OpinionNewsArticle",
  "headline": "Why the Council's Climate Plan Doesn't Go Far Enough",
  "description": "The 2030 target is a start, but our columnist argues it sidesteps the hardest choices.",
  "image": [
    "https://example.com/opinion/climate-16x9.jpg",
    "https://example.com/opinion/climate-4x3.jpg",
    "https://example.com/opinion/climate-1x1.jpg"
  ],
  "author": {
    "@type": "Person",
    "name": "Maria Chen",
    "jobTitle": "Senior Opinion Columnist",
    "url": "https://example.com/staff/maria-chen",
    "sameAs": [
      "https://twitter.com/mariachen",
      "https://www.linkedin.com/in/mariachen"
    ]
  },
  "publisher": {
    "@type": "Organization",
    "name": "The Daily Chronicle",
    "logo": {
      "@type": "ImageObject",
      "url": "https://example.com/logo.png"
    }
  },
  "datePublished": "2025-03-12T09:00:00Z",
  "dateModified": "2025-03-12T16:40:00Z",
  "articleSection": "Opinion",
  "backstory": "Based on the author's coverage of three prior council climate votes and interviews with two policy analysts."
}

Was this page helpful?