Linkpruefung: primaer Business-Leistungsseiten
This commit is contained in:
@@ -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:
|
||||
|
||||
|
||||
@@ -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. '
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user