Ajouter des données de schéma aux sites Next.js

Paul Grieselhuber

Paul Grieselhuber

Apr 25, 2019

Dans le même esprit que le billet de la semaine dernière sur adding citations to Schema.org data, ce billet propose une méthode rapide et facile pour ajouter des données Schema.org à un site Next.js.

Dans ce projet, j'utilise Apollo pour extraire des données via GraphQL d'un site Wordpress (qui finit par générer un site HTML statique) - donc supposons une structure de données de post WP standard. Cette méthode suppose que vous avez appelé le composant Schema dans votre composant Post (ou similaire) dans votre application Next.js. Donc, appelez le composant Schema comme suit :

<Schema post={post} />

Et le composant Schema lui-même :

import Head from "next/head";
import { site, siteTitle } from "../../config";

function strip(html) {
  const one = html.replace(/<\/?[^>]+(>|$)/gm, "");
  const two = one.replace(/[\r\n]\s*[\r\n]/gm, "");

  return two;
}

const Schema = ({ post }) => {
  const {
    title,
    blurb,
    featuredImage,
    date,
    modified,
    slug,
    commentCount,
    author,
    ratingCount,
    ratingAverage,
    citations,
  } = post;
  const published = new Date(date);
  const copyrightYear = published.getFullYear();

  let mediaDetails, sourceUrl;

  if (featuredImage) {
    sourceUrl = featuredImage.sourceUrl;
  }

  const citationsList = citations.map((citation, i) => {
    return `{ "@type": "CreativeWork", "citation": ${JSON.stringify(
      citation
    )} }${i === citations.length - 1 ? "" : ","}\n`;
  });

  const citationsText = citationsList.join("");

  const org = `{ "@id": "${site}#organization", "type": "Organization", "name":"${siteTitle}", "logo": {
    "@type": "ImageObject",
    "name": "${siteTitle} Logo",
    "width": "230",
    "height": "67",
    "url": "${site}images/logo.png"
} }`;

  return (
    <Head>
      <script type="application/ld+json">{`
    {
      "@context":"https://schema.org/",
      "@type":"Article",
      "name":"${title}",
      ${
        ratingAverage > 4
          ? `"aggregateRating": {
        "@type":"AggregateRating",
        "ratingValue":${ratingAverage},
        "reviewCount":${ratingCount}
      },`
          : ""
      }
      "about": "${blurb}",
      "author": { "@type": "Person", "@id": "${site}author/${
        author.slug
      }", "name": "${author.name}" },
      ${
        citationsText.length
          ? `"citation": [
        ${citationsText}
      ],`
          : ""
      }
      "commentCount": ${commentCount},
      "copyrightHolder": { "@id": "${site}#organization" },
      "copyrightYear": ${copyrightYear},
      "datePublished": "${date}",
      "dateModified": "${modified}",
      "description": "${blurb}",
      "discussionUrl": "${site}articles/${slug}#comments",
      "editor": { "@id": "${site}author/${author.slug}#author" },
      "headline": "${title}",
      ${sourceUrl ? `"image": "${sourceUrl}",` : ""}
      "inLanguage": "English",
      "mainEntityOfPage": "${site}articles/${slug}",
      "publisher": { "@id": "${site}#organization" },
      "sourceOrganization": ${org},
      "url": "${site}articles/${slug}"

    }
    `}</script>
    </Head>
  );
};

export default Schema;

Vous verrez un strip function that I left in place in the example. I am trying to decide whether or not to include the post content dans les données Schema. Si c'est le cas, cette fonction est utilisée pour nettoyer le HTML renvoyé comme contenu, afin que nous puissions l'inclure dans la réponse JSON.

Voici l'essentiel de cet extrait si vous avez des idées pour l'améliorer. Les PRs sont bien sûr les bienvenus.

Paul Grieselhuber

Paul Grieselhuber

Founder, President

Paul has extensive background in software development and product design. Currently he runs rendr.

Réservez un appel de découverte avec nos experts produits.

Notre équipe d'experts en applications web et mobiles est impatiente de discuter avec vous de votre prochain projet.

Réservez un appel 👋