SEO
This commit is contained in:
33
greenlns-landing/app/blumen-scanner/page.tsx
Normal file
33
greenlns-landing/app/blumen-scanner/page.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
const profile = getSeoPageBySlug('blumen-scanner')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
33
greenlns-landing/app/flower-scanner/page.tsx
Normal file
33
greenlns-landing/app/flower-scanner/page.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
const profile = getSeoPageBySlug('flower-scanner')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
33
greenlns-landing/app/identify-plant-photo/page.tsx
Normal file
33
greenlns-landing/app/identify-plant-photo/page.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
const profile = getSeoPageBySlug('identify-plant-photo')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
@@ -7,25 +7,25 @@ import { siteConfig, hasIosStoreUrl } from '@/lib/site'
|
||||
export const metadata: Metadata = {
|
||||
metadataBase: new URL(siteConfig.domain),
|
||||
title: {
|
||||
default: 'GreenLens - Plant Identifier and Care Planner',
|
||||
default: 'GreenLens – Pflanzen erkennen & Pflege-App',
|
||||
template: '%s | GreenLens',
|
||||
},
|
||||
description:
|
||||
'GreenLens helps you identify plants, organize your collection, and keep up with care routines in one app.',
|
||||
'GreenLens erkennt Pflanzen per Foto in Sekunden und liefert sofort Pflegeplan, Gießerinnerungen und Gesundheitscheck — alles in einer App.',
|
||||
keywords: [
|
||||
'plant identifier by picture',
|
||||
'Pflanzen erkennen App',
|
||||
'Pflanzen bestimmen per Foto',
|
||||
'Blumen Scanner',
|
||||
'Pflanzen erkennen per Foto',
|
||||
'plant identifier app',
|
||||
'plant care app',
|
||||
'watering reminders',
|
||||
'houseplant tracker',
|
||||
'plant identification',
|
||||
'plant health check',
|
||||
'Pflanzen App',
|
||||
'GreenLens',
|
||||
],
|
||||
authors: [{ name: siteConfig.name }],
|
||||
openGraph: {
|
||||
title: 'GreenLens - Plant Identifier and Care Planner',
|
||||
description: 'Identify plants, get care guidance, and manage your collection with GreenLens.',
|
||||
title: 'GreenLens – Pflanzen erkennen & Pflege-App',
|
||||
description: 'Pflanzen per Foto erkennen, Pflegeplan erhalten und Gesundheitsprobleme diagnostizieren — alles in einer App.',
|
||||
type: 'website',
|
||||
url: siteConfig.domain,
|
||||
},
|
||||
@@ -35,8 +35,8 @@ export const metadata: Metadata = {
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: 'GreenLens - Plant Identifier and Care Planner',
|
||||
description: 'Identify plants, get care guidance, and manage your collection with GreenLens.',
|
||||
title: 'GreenLens – Pflanzen erkennen & Pflege-App',
|
||||
description: 'Pflanzen per Foto erkennen, Pflegeplan erhalten und Gesundheitsprobleme diagnostizieren — alles in einer App.',
|
||||
},
|
||||
}
|
||||
|
||||
@@ -56,6 +56,13 @@ export default async function RootLayout({ children }: { children: React.ReactNo
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: JSON.stringify([
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'WebSite',
|
||||
name: siteConfig.name,
|
||||
url: siteConfig.domain,
|
||||
inLanguage: ['de', 'en', 'es'],
|
||||
},
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'SoftwareApplication',
|
||||
@@ -63,7 +70,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo
|
||||
operatingSystem: 'iOS, Android',
|
||||
applicationCategory: 'LifestyleApplication',
|
||||
description:
|
||||
'Identify plants, track care schedules, and manage your collection with AI-powered scans.',
|
||||
'Pflanzen per Foto erkennen, Pflegeplan erhalten und Gesundheitsprobleme diagnostizieren.',
|
||||
inLanguage: ['de', 'en', 'es'],
|
||||
...(hasIosStoreUrl && { downloadUrl: siteConfig.iosAppStoreUrl }),
|
||||
offers: {
|
||||
@@ -78,7 +85,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo
|
||||
name: siteConfig.name,
|
||||
url: siteConfig.domain,
|
||||
description:
|
||||
'GreenLens is a plant identification and care planning app for iOS and Android.',
|
||||
'GreenLens ist eine App zur Pflanzenerkennung und Pflegeplanung für iOS und Android.',
|
||||
contactPoint: {
|
||||
'@type': 'ContactPoint',
|
||||
contactType: 'customer support',
|
||||
|
||||
33
greenlns-landing/app/pflanzen-bestimmen/page.tsx
Normal file
33
greenlns-landing/app/pflanzen-bestimmen/page.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
const profile = getSeoPageBySlug('pflanzen-bestimmen')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
33
greenlns-landing/app/pflanzen-krankheiten-erkennen/page.tsx
Normal file
33
greenlns-landing/app/pflanzen-krankheiten-erkennen/page.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
const profile = getSeoPageBySlug('pflanzen-krankheiten-erkennen')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
33
greenlns-landing/app/pflanzen-pflege-app/page.tsx
Normal file
33
greenlns-landing/app/pflanzen-pflege-app/page.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
const profile = getSeoPageBySlug('pflanzen-pflege-app')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
@@ -6,7 +6,7 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
return [
|
||||
{
|
||||
url: baseUrl,
|
||||
lastModified: new Date('2026-04-08'),
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 1,
|
||||
},
|
||||
@@ -18,46 +18,76 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/plant-identifier-app`,
|
||||
lastModified: new Date('2026-04-12'),
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/plant-disease-identifier`,
|
||||
lastModified: new Date('2026-04-12'),
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.75,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/plant-care-app`,
|
||||
lastModified: new Date('2026-04-12'),
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.75,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/pflanzen-erkennen-app`,
|
||||
lastModified: new Date('2026-04-12'),
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.75,
|
||||
priority: 0.85,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/blumen-scanner`,
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/pflanzen-bestimmen`,
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/vs/picturethis`,
|
||||
lastModified: new Date('2026-04-10'),
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.65,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/vs/plantum`,
|
||||
lastModified: new Date('2026-04-10'),
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.65,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/vs/inaturalist`,
|
||||
lastModified: new Date('2026-04-12'),
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.65,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/vs/google-lens`,
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.75,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/flower-scanner`,
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/identify-plant-photo`,
|
||||
lastModified: new Date('2026-04-27'),
|
||||
changeFrequency: 'monthly',
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/imprint`,
|
||||
lastModified: new Date('2026-04-08'),
|
||||
|
||||
33
greenlns-landing/app/zimmerpflanzen-bestimmen/page.tsx
Normal file
33
greenlns-landing/app/zimmerpflanzen-bestimmen/page.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
const profile = getSeoPageBySlug('zimmerpflanzen-bestimmen')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
Reference in New Issue
Block a user