generated from knso/webklar-preview-template
Sprachseiten: FAQ in allen 27 Sprachen (sichtbar + FAQPage-Schema)
Bisher lagen alle 9 FAQ-Bloecke auf deutschen Seiten — die Sprachseiten hatten gar keine. Jetzt hat jede drei Fragen (Kosten, welche Briefe, Datenschutz) in der jeweiligen Sprache. Zwei Effekte: Google kann die aufklappbaren Fragen auch fuer diese Sprachen anzeigen (groesserer Treffer, mehr Klicks), und die Seiten sind inhaltlich nicht mehr duenn — das war mein Bedenken beim Anlegen der 28 Seiten. Sichtbarer Text und Schema werden aus derselben Quelle erzeugt, koennen also nicht auseinanderlaufen. Geprueft: 38 gueltige Bloecke, 0 kaputt, sichtbare Fragen identisch mit dem Schema. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1a239b7763
commit
5486a6aafb
30 files changed
+2899
-1243
No files matched your search
@@ -74,7 +74,9 @@ function schemaBlock(s, t) {
|
||||
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
||||
author: { '@type': 'Organization', name: 'Webklar GbR', url: BASIS },
|
||||
};
|
||||
return JSON.stringify(daten, null, 2)
|
||||
const faq = faqSchema(t);
|
||||
const inhalt = faq ? [daten, faq] : daten;
|
||||
return JSON.stringify(inhalt, null, 2)
|
||||
.split('\n').map((z) => ' ' + z).join('\n');
|
||||
}
|
||||
|
||||
@@ -111,6 +113,27 @@ function sitemapSchreiben() {
|
||||
return ALLE.length + andere.length;
|
||||
}
|
||||
|
||||
/** Sichtbare Fragen — Google verlangt, dass das Schema sichtbaren Text spiegelt. */
|
||||
function faqHtml(t) {
|
||||
return (t.faq || [])
|
||||
.map((f) => ` <details>\n <summary>${f.f}</summary>\n <p>${f.a}</p>\n </details>`)
|
||||
.join('\n');
|
||||
}
|
||||
|
||||
/** Dazu passendes FAQPage-Schema — gleiche Fragen, gleiche Sprache. */
|
||||
function faqSchema(t) {
|
||||
if (!t.faq || !t.faq.length) return null;
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'FAQPage',
|
||||
mainEntity: t.faq.map((f) => ({
|
||||
'@type': 'Question',
|
||||
name: f.f,
|
||||
acceptedAnswer: { '@type': 'Answer', text: f.a },
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
function seite(s) {
|
||||
const t = TEXTE[s.code];
|
||||
if (!t) throw new Error('Keine Texte für ' + s.code);
|
||||
@@ -129,6 +152,8 @@ function seite(s) {
|
||||
.replace(/\{\{HREFLANG\}\}/g, hreflangBlock())
|
||||
.replace(/\{\{WAEHLER_CSS\}\}/g, WAEHLER_CSS)
|
||||
.replace(/\{\{SCHEMA\}\}/g, schemaBlock(s, t))
|
||||
.replace(/\{\{S4_TITEL\}\}/g, t.s4Titel || 'FAQ')
|
||||
.replace(/\{\{FAQ_HTML\}\}/g, faqHtml(t))
|
||||
.replace(/\{\{WAEHLER\}\}/g, waehlerBlock(s.code, t.navLabel))
|
||||
.replace(/\{\{H1_A\}\}/g, t.h1a)
|
||||
.replace(/\{\{H1_B\}\}/g, t.h1b)
|
||||
|
||||
Reference in new issue
Block a user