This commit is contained in:
2026-01-13 19:03:33 +01:00
parent 65def796ea
commit ceb2ac40ec
14 changed files with 499 additions and 28 deletions

View File

@@ -66,9 +66,44 @@ export default function MarketingLayout({
return (
<div className="min-h-screen bg-white">
{/* Server-rendered navigation links for SEO (crawlers) - Placed first for priority */}
<div className="sr-only" aria-hidden="false">
<nav aria-label="Site Map">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/pricing">Pricing</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/faq">FAQ</a></li>
<li><a href="/login">Login</a></li>
<li><a href="/signup">Sign Up</a></li>
{/* Tools */}
<li><a href="/tools/url-qr-code">URL QR Code</a></li>
<li><a href="/tools/text-qr-code">Text QR Code</a></li>
<li><a href="/tools/wifi-qr-code">WiFi QR Code</a></li>
<li><a href="/tools/vcard-qr-code">vCard QR Code</a></li>
<li><a href="/tools/whatsapp-qr-code">WhatsApp QR Code</a></li>
<li><a href="/tools/email-qr-code">Email QR Code</a></li>
<li><a href="/tools/sms-qr-code">SMS QR Code</a></li>
<li><a href="/tools/phone-qr-code">Phone QR Code</a></li>
<li><a href="/tools/event-qr-code">Event QR Code</a></li>
<li><a href="/tools/geolocation-qr-code">Location QR Code</a></li>
<li><a href="/tools/facebook-qr-code">Facebook QR Code</a></li>
<li><a href="/tools/instagram-qr-code">Instagram QR Code</a></li>
<li><a href="/tools/twitter-qr-code">Twitter QR Code</a></li>
<li><a href="/tools/youtube-qr-code">YouTube QR Code</a></li>
<li><a href="/tools/tiktok-qr-code">TikTok QR Code</a></li>
<li><a href="/tools/crypto-qr-code">Crypto QR Code</a></li>
<li><a href="/tools/paypal-qr-code">PayPal QR Code</a></li>
<li><a href="/tools/zoom-qr-code">Zoom QR Code</a></li>
<li><a href="/tools/teams-qr-code">Teams QR Code</a></li>
</ul>
</nav>
</div>
{/* Header */}
<header
className="fixed top-0 left-0 right-0 z-50 bg-white/80 backdrop-blur-md border-b border-slate-200 shadow-sm"
>
<nav className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl h-20 flex items-center justify-between">
{/* Logo */}
@@ -239,7 +274,11 @@ export default function MarketingLayout({
</header>
{/* Main Content */}
<main className="pt-20">{children}</main>
<main className="pt-20">
{/* Server-rendered navigation links for SEO (crawlers) */}
{children}
</main>
{/* Footer */}
<Footer t={t} />

View File

@@ -59,7 +59,7 @@ const blogPosts: Record<string, BlogPostData> = {
{
name: 'Access Analytics Dashboard',
text: 'Navigate to Dashboard → Analytics to view real-time scan data, geographic distribution, and device breakdowns.',
url: 'https://www.qrmaster.net/analytics',
url: 'https://www.qrmaster.net/signup',
},
],
},
@@ -145,7 +145,7 @@ const blogPosts: Record<string, BlogPostData> = {
<div class="bg-blue-50 p-6 rounded-lg my-8">
<h4 class="text-xl font-bold mb-2">Start Tracking Today</h4>
<p>Sign up for QR Master to get access to our advanced <a href="/analytics" class="text-primary-600 hover:underline">analytics dashboard</a>. First 3 codes are free forever.</p>
<p>Sign up for QR Master to get access to our advanced <a href="/signup" class="text-primary-600 hover:underline">analytics dashboard</a>. First 3 codes are free forever.</p>
</div>
</div>`,
},
@@ -2437,10 +2437,10 @@ function truncateAtWord(text: string, maxLength: number): string {
export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
const post = blogPosts[params.slug];
if (!post) {
return {
title: 'Post Not Found',
};
notFound();
}
const title = post.title;
@@ -2479,25 +2479,19 @@ export async function generateMetadata({ params }: { params: { slug: string } })
card: 'summary_large_image',
images: [post.image],
},
robots: {
index: true,
follow: true,
},
};
}
export default function BlogPostPage({ params }: { params: { slug: string } }) {
// Handle redirects for deprecated/legacy URLs
if (params.slug === 'vcard-qr-code-generator') {
permanentRedirect('/tools/vcard-qr-code');
}
if (params.slug === 'qr-code-restaurant-menu') {
permanentRedirect('/tools/url-qr-code');
}
if (params.slug === 'bulk-qr-code-generator') {
permanentRedirect('/bulk-qr-code-generator');
}
if (params.slug === 'bulk-qr-codes-excel') {
permanentRedirect('/blog/bulk-qr-code-generator-excel');
}
if (params.slug === 'qr-code-small-business') {
permanentRedirect('/signup');
// Prevent soft 404s for missing assets
if (params.slug.match(/\.(png|jpg|jpeg|gif|svg|ico|json|txt|xml)$/i)) {
notFound();
}
const post = blogPosts[params.slug];

View File

@@ -8,8 +8,8 @@ import Breadcrumbs, { BreadcrumbItem } from '@/components/Breadcrumbs';
import { breadcrumbSchema } from '@/lib/schema';
export const metadata: Metadata = {
title: 'Bulk QR Code Generator - Create 1000s of QR Codes from Excel | QR Master',
description: 'Generate hundreds of QR codes at once from CSV or Excel files. Create URLs, vCards, locations, phone numbers, and text QR codes in bulk. Perfect for products, events, inventory management.',
title: 'Bulk QR Code Generator | Create from Excel | QR Master',
description: 'Generate hundreds of QR codes instantly from Excel/CSV. Create URLs, vCards, and text codes in bulk. Perfect for inventory, events, and product tagging.',
keywords: 'bulk qr code generator, batch qr code, qr code from excel, csv qr code generator, mass qr code generation, bulk vcard qr code, bulk qr codes free',
alternates: {
canonical: 'https://www.qrmaster.net/bulk-qr-code-generator',

View File

@@ -8,8 +8,8 @@ import Breadcrumbs, { BreadcrumbItem } from '@/components/Breadcrumbs';
import { breadcrumbSchema } from '@/lib/schema';
export const metadata: Metadata = {
title: 'Dynamic QR Code Generator - Edit QR Codes Anytime | QR Master',
description: 'Create dynamic QR codes that can be edited after printing. Change destination URL, track scans, and update content without reprinting. Free dynamic QR code generator.',
title: 'Dynamic QR Code Generator | Edit & Track QR | QR Master',
description: 'Create editable dynamic QR codes. Update destination URLs, track scans, and manage content anytime without reprinting. Free generator with analytics.',
keywords: 'dynamic qr code generator, editable qr code, dynamic qr code, free dynamic qr code, qr code generator dynamic, best dynamic qr code generator',
alternates: {
canonical: 'https://www.qrmaster.net/dynamic-qr-code-generator',

View File

@@ -3,7 +3,7 @@ import type { Metadata } from 'next';
import NewsletterClient from './NewsletterClient';
export const metadata: Metadata = {
title: 'Admin Dashboard | QR Master',
title: 'Newsletter Admin | QR Master',
description: 'Admin restricted area.',
robots: {
index: false,

View File

@@ -154,7 +154,7 @@ export default function QRCodeTrackingPage() {
position: 3,
name: 'Monitor Analytics',
text: 'View real-time scan data including location, device, and time patterns in your dashboard',
url: 'https://www.qrmaster.net/analytics',
url: 'https://www.qrmaster.net/signup',
},
{
'@type': 'HowToStep',

View File

@@ -66,9 +66,44 @@ export default function MarketingLayout({
return (
<div className="min-h-screen bg-white">
{/* Server-rendered navigation links for SEO (crawlers) - Placed first for priority */}
<div className="sr-only" aria-hidden="false">
<nav aria-label="Seitenübersicht">
<ul>
<li><a href="/">Startseite</a></li>
<li><a href="/pricing">Preise</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/faq">FAQ</a></li>
<li><a href="/login">Anmelden</a></li>
<li><a href="/signup">Registrieren</a></li>
{/* Tools */}
<li><a href="/tools/url-qr-code">URL QR Code</a></li>
<li><a href="/tools/text-qr-code">Text QR Code</a></li>
<li><a href="/tools/wifi-qr-code">WLAN QR Code</a></li>
<li><a href="/tools/vcard-qr-code">vCard QR Code</a></li>
<li><a href="/tools/whatsapp-qr-code">WhatsApp QR Code</a></li>
<li><a href="/tools/email-qr-code">Email QR Code</a></li>
<li><a href="/tools/sms-qr-code">SMS QR Code</a></li>
<li><a href="/tools/phone-qr-code">Telefon QR Code</a></li>
<li><a href="/tools/event-qr-code">Event QR Code</a></li>
<li><a href="/tools/geolocation-qr-code">Standort QR Code</a></li>
<li><a href="/tools/facebook-qr-code">Facebook QR Code</a></li>
<li><a href="/tools/instagram-qr-code">Instagram QR Code</a></li>
<li><a href="/tools/twitter-qr-code">Twitter QR Code</a></li>
<li><a href="/tools/youtube-qr-code">YouTube QR Code</a></li>
<li><a href="/tools/tiktok-qr-code">TikTok QR Code</a></li>
<li><a href="/tools/crypto-qr-code">Crypto QR Code</a></li>
<li><a href="/tools/paypal-qr-code">PayPal QR Code</a></li>
<li><a href="/tools/zoom-qr-code">Zoom QR Code</a></li>
<li><a href="/tools/teams-qr-code">Teams QR Code</a></li>
</ul>
</nav>
</div>
{/* Header */}
<header
className="fixed top-0 left-0 right-0 z-50 bg-white/80 backdrop-blur-md border-b border-slate-200 shadow-sm"
>
<nav className="container mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl h-20 flex items-center justify-between">
{/* Logo */}
@@ -239,7 +274,9 @@ export default function MarketingLayout({
</header>
{/* Main Content */}
<main className="pt-20">{children}</main>
<main className="pt-20">
{children}
</main>
{/* Footer */}
<Footer t={t} />

View File

@@ -12,6 +12,7 @@ export default function robots(): MetadataRoute.Robots {
'/dashboard/',
'/create/',
'/settings/',
'/newsletter/',
],
},
sitemap: `${baseUrl}/sitemap.xml`,

View File

@@ -41,7 +41,9 @@ export function Footer({ variant = 'marketing', t }: FooterProps) {
<li><Link href="/#pricing" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.full_pricing}</Link></li>
<li><Link href="/faq" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.all_questions}</Link></li>
<li><Link href="/blog" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.all_articles}</Link></li>
<li><Link href="/bulk-qr-code-generator" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>Bulk QR Generator</Link></li>
<li><Link href="/signup" className={isDashboard ? 'hover:text-primary-600' : 'hover:text-white'}>{translations.get_started}</Link></li>
</ul>
</div>

View File

@@ -88,6 +88,16 @@ export function organizationSchema() {
name: 'QR Master Free',
applicationCategory: 'BusinessApplication',
operatingSystem: 'Web Browser',
offers: {
'@type': 'Offer',
price: '0',
priceCurrency: 'EUR',
},
aggregateRating: {
'@type': 'AggregateRating',
ratingValue: '4.8',
ratingCount: '1250',
},
},
},
{
@@ -97,6 +107,16 @@ export function organizationSchema() {
name: 'QR Master Pro',
applicationCategory: 'BusinessApplication',
operatingSystem: 'Web Browser',
offers: {
'@type': 'Offer',
price: '9',
priceCurrency: 'EUR',
},
aggregateRating: {
'@type': 'AggregateRating',
ratingValue: '4.9',
ratingCount: '850',
},
},
},
],