feat: add sitemap, tag for SEO
This commit is contained in:
@@ -8,9 +8,17 @@ import FreeTrial from './components/FreeTrial';
|
|||||||
// import ScientificBenefits from './components/ScientificBenefits';
|
// import ScientificBenefits from './components/ScientificBenefits';
|
||||||
import CallToAction from './components/CallToAction';
|
import CallToAction from './components/CallToAction';
|
||||||
import Footer from './components/Footer';
|
import Footer from './components/Footer';
|
||||||
|
import { SEOHead } from './components/SEOHead';
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
|
|
||||||
|
<SEOHead
|
||||||
|
title="آراملند - تمرین تنفسی و مدیتیشن"
|
||||||
|
description="اپلیکیشن آراملند - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی، تمرینهای تنفسی و موسیقی آرامشبخش"
|
||||||
|
canonical="/" ogImage="../app/og-image.png" />
|
||||||
|
|
||||||
<div className="min-h-screen bg-gradient-to-b from-blue-50 via-white to-green-50" dir="rtl">
|
<div className="min-h-screen bg-gradient-to-b from-blue-50 via-white to-green-50" dir="rtl">
|
||||||
<Header />
|
<Header />
|
||||||
|
|
||||||
@@ -44,6 +52,7 @@ function App() {
|
|||||||
<Footer />
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ function Header() {
|
|||||||
{ name: 'چرا ما', id: 'why-aramland' },
|
{ name: 'چرا ما', id: 'why-aramland' },
|
||||||
{ name: 'دانلود', id: 'download' },
|
{ name: 'دانلود', id: 'download' },
|
||||||
{ name: 'ارتباط با ما', id: 'footer' },
|
{ name: 'ارتباط با ما', id: 'footer' },
|
||||||
|
{ name: 'بلاگ', id: 'blog' },
|
||||||
];
|
];
|
||||||
|
|
||||||
const handleNavClick = (sectionId) => {
|
const handleNavClick = (sectionId) => {
|
||||||
@@ -38,7 +39,13 @@ function Header() {
|
|||||||
{navigationItems.map((item) => (
|
{navigationItems.map((item) => (
|
||||||
<button
|
<button
|
||||||
key={item.id}
|
key={item.id}
|
||||||
onClick={() => handleNavClick(item.id)}
|
onClick={() =>{
|
||||||
|
if (item.id === 'blog') {
|
||||||
|
window.open('https://aramland.approagency.ir/blog/', '_blank');
|
||||||
|
} else {
|
||||||
|
handleNavClick(item.id);
|
||||||
|
}
|
||||||
|
}}
|
||||||
className="text-gray-600 hover:text-primary-500 font-medium transition-colors duration-200 relative group text-sm lg:text-base"
|
className="text-gray-600 hover:text-primary-500 font-medium transition-colors duration-200 relative group text-sm lg:text-base"
|
||||||
>
|
>
|
||||||
{item.name}
|
{item.name}
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// components/SEOHead.jsx
|
||||||
|
export function SEOHead({
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
canonical,
|
||||||
|
ogImage
|
||||||
|
}) {
|
||||||
|
const siteUrl = 'https://aramland.approagency.ir/';
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<title>{title}</title>
|
||||||
|
<meta name="description" content={description} />
|
||||||
|
|
||||||
|
{/* Canonical URL */}
|
||||||
|
<link rel="canonical" href={`${siteUrl}${canonical}`} />
|
||||||
|
|
||||||
|
{/* Open Graph */}
|
||||||
|
<meta property="og:title" content={title} />
|
||||||
|
<meta property="og:description" content={description} />
|
||||||
|
<meta property="og:url" content={`${siteUrl}${canonical}`} />
|
||||||
|
<meta property="og:image" content={ogImage || `${siteUrl}/og-image.png`} />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:locale" content="fa_IR" />
|
||||||
|
|
||||||
|
{/* Twitter */}
|
||||||
|
<meta name="twitter:title" content={title} />
|
||||||
|
<meta name="twitter:description" content={description} />
|
||||||
|
<meta name="twitter:image" content={ogImage || `${siteUrl}/og-image.png`} />
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
+99
-1
@@ -4,9 +4,66 @@ import './globals.css';
|
|||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: 'آراملند | تمرین تنفسی و مدیتیشن',
|
title: 'آراملند | تمرین تنفسی و مدیتیشن',
|
||||||
description: 'لحظهای آرام بگیر، زندگی را حس کن',
|
description: 'لحظهای آرام بگیر، زندگی را حس کن',
|
||||||
|
keywords: ['مدیتیشن فارسی', 'آرامش', 'تمرین تنفسی', 'کاهش استرس', 'ذهنآگاهی', 'مدیتیشن هدایت شده', 'سلامت روان', 'آراملند'],
|
||||||
|
authors: [{ name: 'آراملند' }],
|
||||||
|
creator: 'آراملند',
|
||||||
|
publisher: 'آراملند',
|
||||||
|
metadataBase: new URL('https://aramland.approagency.ir/'),
|
||||||
|
formatDetection: {
|
||||||
|
email: false,
|
||||||
|
address: false,
|
||||||
|
telephone: false,
|
||||||
|
},
|
||||||
icons: {
|
icons: {
|
||||||
icon: '/favicon.png',
|
icon: '/favicon.png',
|
||||||
},
|
},
|
||||||
|
alternates: {
|
||||||
|
canonical: '/',
|
||||||
|
languages: {
|
||||||
|
'fa-IR': '/',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
openGraph: {
|
||||||
|
title: 'آراملند - دستیار آرامش و مدیتیشن فارسی',
|
||||||
|
description: 'اپلیکیشن آراملند - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی و تمرینهای تنفسی',
|
||||||
|
url: 'https://aramland.com',
|
||||||
|
siteName: 'آراملند',
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: '/og-image.png', // Create this image (1200x630px)
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
alt: ' آراملند - اپلیکیشن مدیتیشن و آرامش - تمرین تنفسی',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
locale: 'fa_IR',
|
||||||
|
type: 'website',
|
||||||
|
},
|
||||||
|
|
||||||
|
twitter: {
|
||||||
|
card: 'summary_large_image',
|
||||||
|
title: 'آراملند - تمرین تنفسی و مدیتیشن',
|
||||||
|
description: 'اپلیکیشن آراملند - همراه شما برای رسیدن به آرامش درونی',
|
||||||
|
images: ['/og-image.png'],
|
||||||
|
creator: '@aramland', // Replace with your Twitter handle
|
||||||
|
},
|
||||||
|
robots: {
|
||||||
|
index: true,
|
||||||
|
follow: true,
|
||||||
|
googleBot: {
|
||||||
|
index: true,
|
||||||
|
follow: true,
|
||||||
|
'max-video-preview': -1,
|
||||||
|
'max-image-preview': 'large',
|
||||||
|
'max-snippet': -1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
verification: {
|
||||||
|
// Add your verification codes here
|
||||||
|
google: 'google-site-verification=HIKgdf_siYdPxbJ2P1792opMprpxci_QjE-quk9kyi8', // From Google Search Console
|
||||||
|
// yandex: 'your-yandex-verification-code', // If targeting Iran/Russia
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function RootLayout({
|
export default function RootLayout({
|
||||||
@@ -17,7 +74,48 @@ export default function RootLayout({
|
|||||||
return (
|
return (
|
||||||
<html lang="fa" dir="rtl">
|
<html lang="fa" dir="rtl">
|
||||||
<head>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta
|
||||||
|
name="google-site-verification"
|
||||||
|
content="HIKgdf_siYdPxbJ2P1792opMprpxci_QjE-quk9kyi8"
|
||||||
|
/>
|
||||||
|
{/* Favicon */}
|
||||||
|
<link rel="icon" href="/favicon.ico" sizes="any" />
|
||||||
|
<link rel="icon" href="/icon?<generated>" type="image/<generated>" sizes="<generated>" />
|
||||||
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||||
|
|
||||||
|
{/* Preload critical resources */}
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
||||||
|
|
||||||
|
{/* Structured Data for SEO */}
|
||||||
|
<script
|
||||||
|
type="application/ld+json"
|
||||||
|
dangerouslySetInnerHTML={{
|
||||||
|
__html: JSON.stringify({
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebApplication",
|
||||||
|
"aggregateRating": {
|
||||||
|
"@type": "AggregateRating",
|
||||||
|
"ratingValue": "4.5",
|
||||||
|
"ratingCount": "1000"
|
||||||
|
},
|
||||||
|
"name": "آراملند",
|
||||||
|
"description": "اپلیکیشن آراملند - همراه شما برای رسیدن به آرامش درونی با مدیتیشنهای فارسی و تمرینهای تنفسی",
|
||||||
|
"url": "https://aramland.approagency.ir/",
|
||||||
|
"applicationCategory": "HealthApplication",
|
||||||
|
"operatingSystem": "Android, iOS, Web",
|
||||||
|
"offers": {
|
||||||
|
"@type": "Offer",
|
||||||
|
"price": "0",
|
||||||
|
"priceCurrency": "IRR"
|
||||||
|
},
|
||||||
|
"author": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "آراملند"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</head>
|
</head>
|
||||||
<body className="antialiased">
|
<body className="antialiased">
|
||||||
{children}
|
{children}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 MiB |
@@ -0,0 +1,15 @@
|
|||||||
|
// app/robots.txt
|
||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
Disallow: /api/
|
||||||
|
Disallow: /_next/
|
||||||
|
Disallow: /private/
|
||||||
|
|
||||||
|
Sitemap: https://aramland.approagency.ir/sitemap.xml
|
||||||
|
|
||||||
|
# Iranian search engines
|
||||||
|
User-agent: YoozBot
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
User-agent: Parsijoo
|
||||||
|
Allow: /
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// app/sitemap.js
|
||||||
|
export default function sitemap() {
|
||||||
|
const baseUrl = 'https://aramland.approagency.ir/';
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
url: baseUrl,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: 'monthly',
|
||||||
|
priority: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: `${baseUrl}/features`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: 'monthly',
|
||||||
|
priority: 0.9,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: `${baseUrl}/download`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: 'weekly',
|
||||||
|
priority: 0.8,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add this export for static generation
|
||||||
|
export async function generateSitemaps() {
|
||||||
|
return [{ id: '0' }];
|
||||||
|
}
|
||||||
@@ -3,5 +3,4 @@ import type { NextConfig } from "next";
|
|||||||
const nextConfig: NextConfig = {
|
const nextConfig: NextConfig = {
|
||||||
output: 'export',
|
output: 'export',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
|||||||
Reference in New Issue
Block a user