This commit is contained in:
Timo Knuth 2026-01-27 17:27:47 +01:00
parent 4dc7c29134
commit 1a6dc01291
5 changed files with 38 additions and 12 deletions

View File

@ -62,7 +62,7 @@ export default function HomePage() {
<SeoJsonLd data={[ <SeoJsonLd data={[
websiteSchema(), websiteSchema(),
organizationSchema(), organizationSchema(),
softwareApplicationSchema(), softwareApplicationSchema(aggregateRating),
aggregateRatingSchema(aggregateRating), aggregateRatingSchema(aggregateRating),
...reviewSchemas ...reviewSchemas
]} /> ]} />

View File

@ -79,11 +79,10 @@ export default function TestimonialsPage() {
{[...Array(5)].map((_, index) => ( {[...Array(5)].map((_, index) => (
<Star <Star
key={index} key={index}
className={`w-8 h-8 ${ className={`w-8 h-8 ${index < aggregateRating.ratingValue
index < aggregateRating.ratingValue ? 'fill-yellow-400 text-yellow-400'
? 'fill-yellow-400 text-yellow-400' : 'fill-gray-200 text-gray-200'
: 'fill-gray-200 text-gray-200' }`}
}`}
/> />
))} ))}
</div> </div>
@ -136,6 +135,8 @@ export default function TestimonialsPage() {
</div> </div>
</div> </div>
</section> </section>
</div> </div>
</> </>
); );

View File

@ -35,6 +35,9 @@ export default function AdBanner({
'/terms', '/terms',
'/cookie-policy', '/cookie-policy',
'/impressum', '/impressum',
'/press',
'/testimonials',
'/authors',
]; ];
// Check if current path matches strictly or starts with excluded path (for nested legal/blog pages if needed, though mostly exact matches here) // Check if current path matches strictly or starts with excluded path (for nested legal/blog pages if needed, though mostly exact matches here)

View File

@ -42,12 +42,12 @@ export function organizationSchema() {
sameAs: [ sameAs: [
'https://twitter.com/qrmaster', 'https://twitter.com/qrmaster',
], ],
contactPoint: { contactPoint: [{
'@type': 'ContactPoint', '@type': 'ContactPoint',
contactType: 'Customer Support', contactType: 'Customer Support',
email: 'support@qrmaster.net', email: 'support@qrmaster.net',
availableLanguage: ['en', 'de'], availableLanguage: ['en', 'de'],
}, }],
}; };
} }
@ -163,8 +163,8 @@ export function breadcrumbSchema(items: { name: string; url: string }[]) {
}; };
} }
export function softwareApplicationSchema() { export function softwareApplicationSchema(aggregateRating?: AggregateRating) {
return { const schema: any = {
'@context': 'https://schema.org', '@context': 'https://schema.org',
'@type': 'SoftwareApplication', '@type': 'SoftwareApplication',
name: 'QR Master', name: 'QR Master',
@ -179,6 +179,18 @@ export function softwareApplicationSchema() {
'@id': `${SITE_URL}/#organization`, '@id': `${SITE_URL}/#organization`,
} }
}; };
if (aggregateRating) {
schema.aggregateRating = {
'@type': 'AggregateRating',
ratingValue: aggregateRating.ratingValue,
reviewCount: aggregateRating.reviewCount,
bestRating: aggregateRating.bestRating,
worstRating: aggregateRating.worstRating
};
}
return schema;
} }
export function authorPageSchema(author: AuthorProfile, posts?: BlogPost[]) { export function authorPageSchema(author: AuthorProfile, posts?: BlogPost[]) {
@ -253,7 +265,12 @@ export function reviewSchema(testimonial: Testimonial) {
'@type': 'SoftwareApplication', '@type': 'SoftwareApplication',
name: 'QR Master', name: 'QR Master',
applicationCategory: 'BusinessApplication', applicationCategory: 'BusinessApplication',
operatingSystem: 'Web Browser' operatingSystem: 'Web Browser',
offers: {
'@type': 'Offer',
price: '0',
priceCurrency: 'EUR'
}
}, },
reviewRating: { reviewRating: {
'@type': 'Rating', '@type': 'Rating',
@ -276,6 +293,11 @@ export function aggregateRatingSchema(aggregateRating: AggregateRating) {
'@context': 'https://schema.org', '@context': 'https://schema.org',
'@type': 'Product', '@type': 'Product',
name: 'QR Master', name: 'QR Master',
offers: {
'@type': 'Offer',
price: '0',
priceCurrency: 'EUR'
},
aggregateRating: { aggregateRating: {
'@type': 'AggregateRating', '@type': 'AggregateRating',
ratingValue: aggregateRating.ratingValue, ratingValue: aggregateRating.ratingValue,

View File

@ -30,7 +30,7 @@ export const testimonials: Testimonial[] = [
title: "Perfect for my pottery", title: "Perfect for my pottery",
content: "I use QR-Master for my pottery as a link to my homepage and as a digital business card. I place the codes directly on my pottery pieces so interested customers can instantly access my website. Reliable and practical a great solution!", content: "I use QR-Master for my pottery as a link to my homepage and as a digital business card. I place the codes directly on my pottery pieces so interested customers can instantly access my website. Reliable and practical a great solution!",
author: { author: {
name: "Claudia Knuth", name: "Claudia",
company: "Hotshpotsh", company: "Hotshpotsh",
location: "Texas" location: "Texas"
}, },