import React from 'react'; import type { Metadata } from 'next'; import Link from 'next/link'; import Image from 'next/image'; import SeoJsonLd from '@/components/SeoJsonLd'; import { websiteSchema, breadcrumbSchema } from '@/lib/schema'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import Breadcrumbs, { BreadcrumbItem } from '@/components/Breadcrumbs'; import { blogPosts } from '@/lib/blog-data'; import { REDIRECTED_BLOG_SLUGS } from "@/lib/content"; // Enable Incremental Static Regeneration (ISR) // Revalidate every hour export const revalidate = 3600; function truncateAtWord(text: string, maxLength: number): string { if (text.length <= maxLength) return text; const truncated = text.slice(0, maxLength); const lastSpace = truncated.lastIndexOf(' '); return lastSpace > 0 ? truncated.slice(0, lastSpace) : truncated; } export async function generateMetadata(): Promise { const title = truncateAtWord('QR Insights: Latest QR Strategies', 60); const description = truncateAtWord( 'Expert guides on QR code strategies, marketing campaigns, tracking analytics, and best practices for small businesses and enterprises.', 160 ); return { title, description, alternates: { canonical: 'https://www.qrmaster.net/blog', languages: { 'x-default': 'https://www.qrmaster.net/blog', en: 'https://www.qrmaster.net/blog', }, }, openGraph: { title, description, url: 'https://www.qrmaster.net/blog', type: 'website', images: ['/og-image.png'], }, twitter: { title, description, }, }; } export default function BlogPage() { const breadcrumbItems: BreadcrumbItem[] = [ { name: 'Home', url: '/' }, { name: 'Blog', url: '/blog' }, ]; // Filter posts to only show those published in the past or today // sort by date descending (newest first) const currentDate = new Date(); const publishedPosts = blogPosts .filter(post => { if (REDIRECTED_BLOG_SLUGS.has(post.slug)) return false; const publishDate = post.datePublished ? new Date(post.datePublished) : new Date(post.date); return publishDate <= currentDate; }) .sort((a, b) => { const dateA = a.datePublished ? new Date(a.datePublished) : new Date(a.date); const dateB = b.datePublished ? new Date(b.datePublished) : new Date(b.date); return dateB.getTime() - dateA.getTime(); }); return ( <>

QR Code Insights

Expert guides on dynamic QR codes, campaign tracking, UTM analytics, and smart marketing use cases. Discover how-to tutorials and best practices for QR code analytics.

{publishedPosts.map((post) => (
{post.imageAlt
{post.category} {post.readTime} read
{post.title}

{post.excerpt}

{post.date}

Read more →
))}
); }