garmeeh/next-seo

Make final breadcrumb's item field optional

Opened this issue · 0 comments

The Google SEO doc for adding breadcrumbs says

If the breadcrumb is the last item in the breadcrumb trail, item is not required. If item isn't included for the last item, Google uses the URL of the containing page.

Currently, providing an item for every breadcrumb is required in this library. This makes adding the final breadcrumb more difficult since you have to manually add the current url. I wish BreadCrumbJsonLdProps => ItemListElements => item would be optional. That way it would more closely follow Google's recommendation, and the final url would be added for you automatically.

An example output would be:

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [{
    "@type": "ListItem",
    "position": 1,
    "name": "Books",
    "item": "https://example.com/books"
  },{
    "@type": "ListItem",
    "position": 2,
    "name": "Science Fiction",
    "item": "https://example.com/books/sciencefiction"
  },{
    "@type": "ListItem",
    "position": 3,
    "name": "Award Winners"
  }]
}

Related to #95

The new prop types could look like:

export interface BreadCrumbJsonLdProps extends JsonLdProps {
  itemListElements: {
    item?: string;
    name: string;
    position: number;
  }[];
}

or maybe something like this instead to capture that it should only be for the last one:

export interface BreadCrumbJsonLdProps extends JsonLdProps {
  itemListElements: {
    item: string;
    name: string;
    position: number;
    isFinalBreadcrumb?: boolean;
  } | {
    item?: string;
    name: string;
    position: number;
    isFinalBreadcrumb: true;
  }[];
}

I realize this isn't entirely trivial to add because of how setItemListElements is used, but would be a nice addition! Thank you :)