Linkpruefung: primaer Business-Leistungsseiten

This commit is contained in:
2026-09-21 20:36:43 +02:00
parent a43a86e988
commit 1f269a65a3
5 changed files with 163 additions and 120 deletions

View File

@@ -315,6 +315,14 @@ Adjektiven, rhetorische Fragen mit Sofortantwort, gleichfoermige Satzlaengen,
gleiche Satz- und Absatzanfaenge, gleich lange Absaetze und fehlendes
Praxiswissen.
Dazu die Linkpruefung: Das CTA-Ziel muss eine Business-Leistungsseite sein
(`handgeschriebene-businessbriefe`, `handgeschriebene-postkarten`,
`unterschriftenservice`, `automatisierte-follow-ups`) und mindestens zweimal
verlinkt sein, insgesamt mindestens zwei Business-Links. Hoechstens ein Link auf
die Privatkunden-Seiten, und nur im Block "Auch fuer Privatpersonen.".
`papier-schriftmuster` und `kontakt` sind ergaenzend erlaubt. Links auf `review`
(Dankeseite nach Bestellung) und Rechtstexte werden gemeldet.
Die Regeln liegen in `build/stilpruefung.js` und lassen sich dort erweitern.
Lokal testen:

View File

@@ -315,6 +315,12 @@ const brief = {
begriffe: 'begriffe_pflicht sind verbindlich. begriffe_erweitert nur verwenden, wenn der Satz '
+ 'dadurch nicht schlechter wird. Keine Saetze, die nur fuer den NeuronWriter-Score da sind. '
+ 'Keine Wettbewerbernamen. Zielwert im Import ist 65.',
links: 'Interne Links primaer auf Business-Leistungsseiten: handgeschriebene-businessbriefe, '
+ 'handgeschriebene-postkarten, unterschriftenservice, automatisierte-follow-ups. '
+ 'artikel.cta_ziel mindestens zweimal verlinken, im Text und im Abschluss-CTA, mindestens zwei '
+ 'Business-Links insgesamt. papier-schriftmuster und kontakt nur ergaenzend. Genau ein Link auf '
+ 'handschrift-fuer-privatpersonen, und nur im Block "Auch fuer Privatpersonen.". Keine Links auf '
+ 'review, agb, datenschutz, impressum, zahlungsmethoden, lieferung-versand.',
stil: 'Kurze und lange Saetze mischen. Absaetze unterschiedlich lang. Keine Formeln wie '
+ '"Genau das", "Der Grund ist", "nicht nur, sondern auch", "entscheidend ist", '
+ '"der groesste Hebel", "macht den Unterschied". Keine Aufzaehlung mit erstens, zweitens. '

View File

@@ -84,6 +84,35 @@ function stilpruefung(artikel) {
add('Kein Praxiswissen hinterlegt', 'Feld "praxis" in artikel-index.json fuellen, dann den Artikel darauf aufbauen');
}
// 8) Interne Links: primaer auf Business-Leistungsseiten
const B = 'https://skrift.de/';
const BUSINESS = ['handgeschriebene-businessbriefe', 'handgeschriebene-postkarten',
'unterschriftenservice', 'automatisierte-follow-ups'];
const NEUTRAL = ['papier-schriftmuster', 'kontakt'];
const PRIVAT = ['handschrift-fuer-privatpersonen', 'handgeschriebene-private-briefe',
'handgeschriebene-private-postkarten'];
const slugVon = (u) => String(u || '').replace(/^https?:\/\/(www\.)?skrift\.de\/?/, '').replace(/\/.*$/, '');
const links = [...html.matchAll(/<a\s[^>]*href="([^"]+)"/g)].map(m => m[1]);
const intern = links.filter(u => /^https?:\/\/(www\.)?skrift\.de/.test(u) || u.startsWith('/'));
const slugs = intern.map(u => u.startsWith('/') ? u.replace(/^\/|\/.*$/g, '') : slugVon(u));
const cta = slugVon(artikel.cta_ziel);
if (!BUSINESS.includes(cta)) add('Links: CTA-Ziel ist keine Business-Leistungsseite', `cta_ziel "${artikel.cta_ziel || 'leer'}", erlaubt: ${BUSINESS.join(', ')}`);
const ctaAnzahl = slugs.filter(s => s === cta).length;
if (ctaAnzahl < 2) add('Links: CTA-Ziel zu selten verlinkt', `${ctaAnzahl}x im Text, mindestens 2x (im Text und im Abschluss-CTA)`);
const bus = slugs.filter(s => BUSINESS.includes(s));
const priv = slugs.filter(s => PRIVAT.includes(s));
if (bus.length < 2) add('Links: zu wenige Business-Links', `${bus.length} Link(s) auf Business-Seiten, mindestens 2`);
if (priv.length > 1) add('Links: zu viele Privatkunden-Links', `${priv.length} Links, hoechstens einer im Block "Auch für Privatpersonen."`);
if (priv.length) {
const block = (html.split(/<h3>Auch für Privatpersonen\.<\/h3>/)[1] || '').split(/<h2/)[0];
const imBlock = PRIVAT.some(s => block.includes(s));
if (!imBlock) add('Links: Privatkunden-Link ausserhalb des Privat-Blocks', 'Privat-Links nur im Block "Auch für Privatpersonen."');
}
if (priv.length >= bus.length && priv.length > 0) add('Links: Privat-Links nicht in der Minderheit', `${bus.length} Business gegen ${priv.length} Privat`);
const unbekannt = [...new Set(slugs.filter(s => s && !BUSINESS.includes(s) && !NEUTRAL.includes(s) && !PRIVAT.includes(s)))];
unbekannt.forEach(s => add('Links: kein Linkziel fuer Ratgeber', `/${s}/ (z. B. Dankeseite, Rechtstexte)`));
return hinweise;
}
if (typeof module !== 'undefined') module.exports = { stilpruefung };

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long