Skip to content

Commit 4c4cc25

Browse files
committed
feat: render JSON-LD for every AccordionContainer
Ok, this will render a JSON-LD for *every* AccordionContainer similar to this example: https://developers.google.com/search/docs/appearance/structured-data/faqpage#examples Note that wether or not the `AccordionContainer` contains FAQ it will render them as JSON-LD. Maybe it would be better to have a dedicated component for FAQs? This PR will also introduce a bug: Every JSON-LD will be rendered twice. This is most likely a bug in the current version of svelte-kit: sveltejs/svelte#7745 Updating the dependency should fix the problem.
1 parent 83d7c65 commit 4c4cc25

File tree

5 files changed

+34
-29
lines changed

5 files changed

+34
-29
lines changed

src/lib/components/AccordionContainer/AccordionContainer.svelte

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import { mapPadding } from '$lib/helpers';
55
export let module: Partial<AccordionContainer> = {};
66
7-
import LDTag from '$lib/components/JSON-LD/LDTag.svelte';
8-
import { websiteSchema } from '$lib/components/JSON-LD/json-ld';
7+
import { accordionContainerToJsonLd } from '$lib/jsonLd';
98
</script>
109

11-
<LDTag schema={websiteSchema} />
10+
<svelte:head>
11+
{@html accordionContainerToJsonLd(module)}
12+
</svelte:head>
1213

1314
<div class="mod_accordionContainer relative">
1415
<div class="relative w-full {mapPadding(module.paddingTop)}" />

src/lib/components/JSON-LD/LDTag.svelte

-8
This file was deleted.

src/lib/components/JSON-LD/json-ld.js

-18
This file was deleted.

src/lib/graphql/queries/fragments.ts

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export const accordingContainerFragment = gql`
3939
heading3
4040
content {
4141
html
42+
text
4243
}
4344
image {
4445
id

src/lib/jsonLd.ts

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { AccordionContainer } from '$lib/graphql/generated/schema';
2+
3+
const serializeSchema = (thing: Record<string, unknown>) => {
4+
return `<script type="application/ld+json">${JSON.stringify(thing, null, 2)}</script>`;
5+
};
6+
7+
const accordionItemToJsonLdQuestion = (
8+
accordionItem: AccordionContainer['accordionItems'][number]
9+
) => {
10+
const name = accordionItem.headline;
11+
const text = accordionItem.content.text?.replace(/\\n/g, ' ') || '';
12+
return {
13+
'@type': 'Question',
14+
name,
15+
acceptedAnswer: {
16+
'@type': 'Answer',
17+
text
18+
}
19+
};
20+
};
21+
22+
export const accordionContainerToJsonLd = (module: AccordionContainer) => {
23+
const mainEntity = module.accordionItems.map(accordionItemToJsonLdQuestion);
24+
return serializeSchema({
25+
'@context': 'https://schema.org',
26+
'@type': 'FAQPage',
27+
mainEntity
28+
});
29+
};

0 commit comments

Comments
 (0)