diff --git a/content/liens-morts/index.md b/content/liens-morts/index.md index 558ec13c..52f71654 100644 --- a/content/liens-morts/index.md +++ b/content/liens-morts/index.md @@ -1,5 +1,7 @@ --- title: Liens morts +seo: + noindex: true --- Il est inévitable, surtout quand on crée beaucoup de liens, de se retrouver confronter à des liens morts. diff --git a/content/recherche/index.md b/content/recherche/index.md index b2c03c8d..c5ed6021 100644 --- a/content/recherche/index.md +++ b/content/recherche/index.md @@ -1,3 +1,5 @@ --- title: Recherche +seo: + noindex: true --- diff --git a/content/stats/index.md b/content/stats/index.md index f38681a2..c563d105 100644 --- a/content/stats/index.md +++ b/content/stats/index.md @@ -1,5 +1,7 @@ --- title: Statistiques +seo: + noindex: true --- > Statistiques générées le {{< stats-var key="generated_at" >}} diff --git a/content/taxonomies/_index.md b/content/taxonomies/_index.md index 7f5671b0..6399a680 100644 --- a/content/taxonomies/_index.md +++ b/content/taxonomies/_index.md @@ -1,5 +1,7 @@ --- title: Taxonomies +seo: + noindex: true --- Taxonomies employées à la catégorisation du contenu de mon site. diff --git a/layouts/partials/head/json-ld.html b/layouts/partials/head/json-ld.html new file mode 100644 index 00000000..99a389fb --- /dev/null +++ b/layouts/partials/head/json-ld.html @@ -0,0 +1,139 @@ +{{- $noindex := partial "seo/noindex.html" . -}} +{{- if not $noindex -}} + {{- $language := site.LanguageCode | default site.Language.LanguageCode | default "fr-FR" -}} + {{- $description := partial "head/description.html" . -}} + {{- $pageClassification := partial "seo/page-classification.html" . -}} + {{- $websiteID := printf "%s#website" site.Home.Permalink -}} + {{- $author := partial "seo/person.html" . -}} + {{- $authorID := index $author "@id" -}} + {{- $website := dict + "@type" "WebSite" + "@id" $websiteID + "url" site.Home.Permalink + "name" site.Title + "inLanguage" $language + "author" (dict "@id" $authorID) + -}} + {{- with site.Params.description -}} + {{- $website = merge $website (dict "description" .) -}} + {{- end -}} + {{- with site.Params.search -}} + {{- with .action -}} + {{- $searchURL := . | absURL -}} + {{- $searchParam := $.Site.Params.search.param | default "q" -}} + {{- $website = merge $website (dict + "potentialAction" (dict + "@type" "SearchAction" + "target" (printf "%s?%s={search_term_string}" $searchURL $searchParam) + "query-input" "required name=search_term_string" + ) + ) -}} + {{- end -}} + {{- end -}} + + {{- $graph := slice $website $author -}} + + {{- if not .IsHome -}} + {{- $breadcrumbPages := partial "seo/breadcrumb-pages.html" . -}} + {{- if gt (len $breadcrumbPages) 1 -}} + {{- $items := slice -}} + {{- range $index, $item := $breadcrumbPages -}} + {{- $items = $items | append (dict + "@type" "ListItem" + "position" (add $index 1) + "name" (default $item.Title $item.LinkTitle) + "item" $item.Permalink + ) -}} + {{- end -}} + {{- $graph = $graph | append (dict + "@type" "BreadcrumbList" + "@id" (printf "%s#breadcrumb" .Permalink) + "itemListElement" $items + ) -}} + {{- end -}} + {{- end -}} + + {{- if .IsPage -}} + {{- $image := partial "seo/image.html" . -}} + {{- $pageSchema := dict + "@type" (index $pageClassification "jsonLdType") + "@id" (printf "%s#webpage" .Permalink) + "url" .Permalink + "name" .Title + "inLanguage" $language + "isPartOf" (dict "@id" $websiteID) + "author" (dict "@id" $authorID) + -}} + {{- with $description -}} + {{- $pageSchema = merge $pageSchema (dict "description" .) -}} + {{- end -}} + {{- with $image -}} + {{- $pageSchema = merge $pageSchema (dict "image" .) -}} + {{- end -}} + {{- with .Date -}} + {{- $pageSchema = merge $pageSchema (dict "datePublished" (.Format "2006-01-02T15:04:05Z07:00")) -}} + {{- end -}} + {{- with .Lastmod -}} + {{- $pageSchema = merge $pageSchema (dict "dateModified" (.Format "2006-01-02T15:04:05Z07:00")) -}} + {{- end -}} + + {{- if eq (index $pageClassification "jsonLdType") "BlogPosting" -}} + {{- $pageSchema = merge $pageSchema (dict + "headline" .Title + "mainEntityOfPage" .Permalink + ) -}} + {{- with .CurrentSection -}} + {{- if ne .RelPermalink "/" -}} + {{- $pageSchema = merge $pageSchema (dict "articleSection" .Title) -}} + {{- end -}} + {{- end -}} + {{- $keywords := slice -}} + {{- with .GetTerms "tags" -}} + {{- range . -}} + {{- $keywords = $keywords | append .LinkTitle -}} + {{- end -}} + {{- end -}} + {{- if gt (len $keywords) 0 -}} + {{- $pageSchema = merge $pageSchema (dict "keywords" $keywords) -}} + {{- end -}} + {{- else if eq (index $pageClassification "jsonLdType") "Review" -}} + {{- $itemReviewed := dict + "@type" (index $pageClassification "reviewedType") + "name" .Title + -}} + {{- with .Params.wikidata_id -}} + {{- $itemReviewed = merge $itemReviewed (dict "sameAs" (printf "https://www.wikidata.org/wiki/%s" .)) -}} + {{- end -}} + {{- $pageSchema = merge $pageSchema (dict + "itemReviewed" $itemReviewed + "mainEntityOfPage" .Permalink + ) -}} + {{- else if eq (index $pageClassification "jsonLdType") "Article" -}} + {{- $pageSchema = merge $pageSchema (dict + "headline" .Title + "mainEntityOfPage" .Permalink + ) -}} + {{- end -}} + + {{- $graph = $graph | append $pageSchema -}} + {{- else if not .IsHome -}} + {{- $pageSchema := dict + "@type" (index $pageClassification "jsonLdType") + "@id" (printf "%s#collection" .Permalink) + "url" .Permalink + "name" .Title + "inLanguage" $language + "isPartOf" (dict "@id" $websiteID) + -}} + {{- with $description -}} + {{- $pageSchema = merge $pageSchema (dict "description" .) -}} + {{- end -}} + {{- $graph = $graph | append $pageSchema -}} + {{- end -}} + + {{- $payload := dict + "@context" "https://schema.org" + "@graph" $graph + -}} + +{{- end -}} diff --git a/layouts/partials/head/metadata.html b/layouts/partials/head/metadata.html index b9043073..edcdcc5d 100644 --- a/layouts/partials/head/metadata.html +++ b/layouts/partials/head/metadata.html @@ -10,16 +10,13 @@ {{- $socialImage := partial "head/social-image.html" . -}} {{- $openGraphImage := $socialImage.openGraph -}} {{- $twitterImage := $socialImage.twitter -}} -{{- $searchPath := site.Params.search.action | relURL -}} -{{- $isSearchPage := eq .RelPermalink $searchPath -}} +{{- $noindex := partial "seo/noindex.html" . -}} +{{- $pageClassification := partial "seo/page-classification.html" . -}} {{- $robots := "max-image-preview:large" -}} -{{- if $isSearchPage -}} +{{- if $noindex -}} {{- $robots = "noindex, follow" -}} {{- end -}} -{{- $ogType := "website" -}} -{{- if and .IsPage (not $isSearchPage) -}} - {{- $ogType = "article" -}} -{{- end -}} +{{- $ogType := index $pageClassification "openGraphType" -}} {{- $localeCode := site.LanguageCode | default site.Language.LanguageCode | default "fr-FR" -}} {{- $locale := replace $localeCode "-" "_" -}} {{ $title }} @@ -60,7 +57,7 @@ {{- with $twitterImage.alt }} {{- end }} -{{- if eq $ogType "article" -}} +{{- if and (eq $ogType "article") (index $pageClassification "isArticleLike") -}} {{- with .Date }} {{- end }} diff --git a/layouts/partials/seo/breadcrumb-pages.html b/layouts/partials/seo/breadcrumb-pages.html new file mode 100644 index 00000000..215fa45e --- /dev/null +++ b/layouts/partials/seo/breadcrumb-pages.html @@ -0,0 +1,23 @@ +{{- $page := . -}} +{{- with .Page -}} + {{- $page = . -}} +{{- end -}} +{{- $trail := slice $page.Site.Home -}} +{{- if $page -}} + {{- range $page.Ancestors.Reverse -}} + {{- if ne .RelPermalink "/" -}} + {{- $trail = $trail | append . -}} + {{- end -}} + {{- end -}} + {{- if eq $page.Kind "term" -}} + {{- with site.GetPage "taxonomy" $page.Data.Plural -}} + {{- if not (in $trail .) -}} + {{- $trail = $trail | append . -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- if ne $page.RelPermalink "/" -}} + {{- $trail = $trail | append $page -}} + {{- end -}} +{{- end -}} +{{- return $trail -}} diff --git a/layouts/partials/seo/image.html b/layouts/partials/seo/image.html new file mode 100644 index 00000000..79430f24 --- /dev/null +++ b/layouts/partials/seo/image.html @@ -0,0 +1,19 @@ +{{- $socialImage := partial "head/social-image.html" . -}} +{{- $openGraphImage := $socialImage.openGraph -}} +{{- $image := dict -}} +{{- with $openGraphImage.url -}} + {{- $image = dict + "@type" "ImageObject" + "url" . + -}} + {{- with $openGraphImage.width -}} + {{- $image = merge $image (dict "width" .) -}} + {{- end -}} + {{- with $openGraphImage.height -}} + {{- $image = merge $image (dict "height" .) -}} + {{- end -}} + {{- with $openGraphImage.alt -}} + {{- $image = merge $image (dict "caption" .) -}} + {{- end -}} +{{- end -}} +{{- return $image -}} diff --git a/layouts/partials/seo/noindex.html b/layouts/partials/seo/noindex.html new file mode 100644 index 00000000..ff8384a3 --- /dev/null +++ b/layouts/partials/seo/noindex.html @@ -0,0 +1,10 @@ +{{- $searchPath := site.Params.search.action | relURL -}} +{{- $noindex := eq .RelPermalink $searchPath -}} +{{- if not $noindex -}} + {{- with .Params.seo -}} + {{- with index . "noindex" -}} + {{- $noindex = . -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{- return $noindex -}} diff --git a/layouts/partials/seo/page-classification.html b/layouts/partials/seo/page-classification.html new file mode 100644 index 00000000..c68c81ba --- /dev/null +++ b/layouts/partials/seo/page-classification.html @@ -0,0 +1,47 @@ +{{- $classification := dict + "openGraphType" "website" + "isArticleLike" false + "jsonLdType" "WebPage" + "reviewedType" "" +-}} + +{{- if .IsPage -}} + {{- if in (slice "interets" "prompted") .Section -}} + {{- $classification = merge $classification (dict + "openGraphType" "article" + "isArticleLike" true + "jsonLdType" "BlogPosting" + ) -}} + {{- else if eq .Section "critiques" -}} + {{- $reviewedType := "CreativeWork" -}} + {{- with .CurrentSection -}} + {{- if eq .RelPermalink "/critiques/films/" -}} + {{- $reviewedType = "Movie" -}} + {{- else if eq .RelPermalink "/critiques/jeux-video/" -}} + {{- $reviewedType = "VideoGame" -}} + {{- else if eq .RelPermalink "/critiques/livres/" -}} + {{- $reviewedType = "Book" -}} + {{- else if eq .RelPermalink "/critiques/series/" -}} + {{- $reviewedType = "TVSeries" -}} + {{- end -}} + {{- end -}} + {{- $classification = merge $classification (dict + "openGraphType" "article" + "isArticleLike" true + "jsonLdType" "Review" + "reviewedType" $reviewedType + ) -}} + {{- else if eq .Section "collections" -}} + {{- $classification = merge $classification (dict + "openGraphType" "article" + "isArticleLike" true + "jsonLdType" "Article" + ) -}} + {{- end -}} +{{- else if not .IsHome -}} + {{- $classification = merge $classification (dict + "jsonLdType" "CollectionPage" + ) -}} +{{- end -}} + +{{- return $classification -}} diff --git a/layouts/partials/seo/person.html b/layouts/partials/seo/person.html new file mode 100644 index 00000000..113657f5 --- /dev/null +++ b/layouts/partials/seo/person.html @@ -0,0 +1,8 @@ +{{- $authorID := printf "%s#author" .Site.Home.Permalink -}} +{{- $person := dict + "@type" "Person" + "@id" $authorID + "name" .Site.Title + "url" .Site.Home.Permalink +-}} +{{- return $person -}} diff --git a/layouts/sitemap.xml b/layouts/sitemap.xml new file mode 100644 index 00000000..ae6794a1 --- /dev/null +++ b/layouts/sitemap.xml @@ -0,0 +1,14 @@ +{{- printf "" | safeHTML -}} + + {{- range .Site.Pages -}} + {{- if not (partial "seo/noindex.html" .) -}} + + {{ .Permalink }} + {{- with .Lastmod }} + {{ .Format "2006-01-02T15:04:05Z07:00" }} + {{- end }} + + {{- end -}} + {{- end -}} + diff --git a/themes/2026/layouts/_partials/head.html b/themes/2026/layouts/_partials/head.html index 8de31d0d..c8358619 100644 --- a/themes/2026/layouts/_partials/head.html +++ b/themes/2026/layouts/_partials/head.html @@ -1,6 +1,7 @@ {{ partial "head/metadata.html" . }} +{{ partial "head/json-ld.html" . }} diff --git a/themes/42/layouts/_partials/head.html b/themes/42/layouts/_partials/head.html index c535163b..14405d50 100644 --- a/themes/42/layouts/_partials/head.html +++ b/themes/42/layouts/_partials/head.html @@ -1,6 +1,7 @@ {{ partial "head/metadata.html" . }} +{{ partial "head/json-ld.html" . }}