feat: implement programmatic SEO for solutions pages

- Add 10 oil-for-concern solution pages with localized slugs
- Support 4 languages: sr, en, de, fr with proper canonical URLs
- Add solutions hub, by-concern, and by-oil directory pages
- Filter bundle products from solutions pages
- Add hideLangSwitcher prop to Header component
- Update translations for all languages
- Fix canonical URLs to include locale prefix
This commit is contained in:
Unchained
2026-04-08 13:29:42 +02:00
parent cca6f44139
commit 9d07a60d3f
26 changed files with 3120 additions and 1046 deletions

View File

@@ -0,0 +1,378 @@
# Programmatic SEO Implementation Plan
## ManoonOils Serbian Market - Phase 1
**Branch:** `feature/programmatic-seo`
**Scope:** Create 10 priority "Oil for Concern" pages in Serbian
**Estimated Time:** 2-3 days
---
## Executive Summary
Create 10 high-priority programmatic SEO pages targeting Serbian market with Serbian-language URLs and content. Pages will focus on top oil/concern combinations based on search volume and product alignment.
---
## Deliverables
### 1. Data Schema (JSON Files)
**Location:** `data/oil-for-concern/`
**10 Priority Pages:**
| # | Slug (Serbian) | Oil | Concern | Priority |
|---|----------------|-----|---------|----------|
| 1 | `najbolje-ulje-divlje-ruze-za-bore` | Ulje divlje ruže | Bore | ⭐⭐⭐ |
| 2 | `najbolje-arganovo-ulje-za-suvu-kozu` | Arganovo ulje | Suva koža | ⭐⭐⭐ |
| 3 | `najbolje-jojoba-ulje-za-akne` | Jojoba ulje | Akne | ⭐⭐⭐ |
| 4 | `najbolje-ulje-divlje-ruze-za-tamne-pjege` | Ulje divlje ruže | Tamne pjege | ⭐⭐⭐ |
| 5 | `najbolje-arganovo-ulje-za-bore` | Arganovo ulje | Bore | ⭐⭐ |
| 6 | `najbolje-ulje-pasjeg-trna-za-hiperpigmentaciju` | Ulje pasjeg trna | Hiperpigmentacija | ⭐⭐ |
| 7 | `najbolje-jojoba-ulje-za-masnu-kozu` | Jojoba ulje | Masna koža | ⭐⭐ |
| 8 | `najbolje-ulje-slatkog-badema-za-osetljivu-kozu` | Ulje slatkog badema | Osetljiva koža | ⭐⭐ |
| 9 | `najbolje-ulje-divlje-ruze-za-oziljke-od-akni` | Ulje divlje ruže | Ožiljci od akni | ⭐⭐ |
| 10 | `najbolje-arganovo-ulje-za-podocnjake` | Arganovo ulje | Podočnjaci | ⭐⭐ |
---
## JSON Schema Structure
Each file must follow this exact structure:
```json
{
"slug": "serbian-slug-here",
"oilSlug": "oil-identifier",
"concernSlug": "concern-identifier",
"pageTitle": {
"sr": "Serbian title",
"en": "English title",
"de": "German title",
"fr": "French title"
},
"metaTitle": {
"sr": "Serbian meta title | ManoonOils",
"en": "English meta title | ManoonOils",
"de": "German meta title | ManoonOils",
"fr": "French meta title | ManoonOils"
},
"metaDescription": {
"sr": "Serbian meta description",
"en": "English meta description",
"de": "German meta description",
"fr": "French meta description"
},
"oilName": {
"sr": "Serbian oil name",
"en": "English oil name",
"de": "German oil name",
"fr": "French oil name"
},
"concernName": {
"sr": "Serbian concern name",
"en": "English concern name",
"de": "German concern name",
"fr": "French concern name"
},
"whyThisWorks": {
"sr": "Detailed explanation in Serbian (200+ words)",
"en": "English translation",
"de": "German translation",
"fr": "French translation"
},
"keyBenefits": {
"sr": ["6 benefits in Serbian"],
"en": ["6 benefits in English"],
"de": ["6 benefits in German"],
"fr": ["6 benefits in French"]
},
"howToApply": {
"sr": ["6 steps in Serbian"],
"en": ["6 steps in English"],
"de": ["6 steps in German"],
"fr": ["6 steps in French"]
},
"expectedResults": {
"sr": "Timeline explanation in Serbian",
"en": "English translation",
"de": "German translation",
"fr": "French translation"
},
"timeframe": {
"sr": "Short timeframe summary in Serbian",
"en": "English translation",
"de": "German translation",
"fr": "French translation"
},
"complementaryIngredients": [
"vitamin-c",
"panthenol",
"sandalwood",
"sweet-almond-oil"
],
"productsToShow": [
"manoon-anti-age-serum"
],
"customerResults": [
{
"quote": {
"sr": "Serbian testimonial",
"en": "English translation",
"de": "German translation",
"fr": "French translation"
},
"name": "Name",
"age": 45,
"skinType": "Serbian skin type",
"timeframe": "Serbian timeframe"
}
],
"faqs": [
{
"question": {
"sr": "Question in Serbian",
"en": "English translation",
"de": "German translation",
"fr": "French translation"
},
"answer": {
"sr": "Answer in Serbian",
"en": "English translation",
"de": "German translation",
"fr": "French translation"
}
}
],
"seoKeywords": {
"sr": {
"primary": ["3-5 primary keywords"],
"secondary": ["3-5 secondary keywords"],
"longTail": ["3-5 long-tail keywords"]
},
"en": {
"primary": ["3-5 primary keywords"],
"secondary": ["3-5 secondary keywords"],
"longTail": ["3-5 long-tail keywords"]
},
"de": {
"primary": ["3-5 primary keywords"],
"secondary": ["3-5 secondary keywords"],
"longTail": ["3-5 long-tail keywords"]
},
"fr": {
"primary": ["3-5 primary keywords"],
"secondary": ["3-5 secondary keywords"],
"longTail": ["3-5 long-tail keywords"]
}
},
"relatedPages": {
"otherOilsForSameConcern": [
"serbian-slug-1",
"serbian-slug-2"
],
"sameOilForOtherConcerns": [
"serbian-slug-3",
"serbian-slug-4"
]
}
}
```
---
## Content Guidelines
### whyThisWorks Section (200+ words)
- Scientific explanation of mechanism
- Reference to specific compounds (vitamin A, fatty acids, etc.)
- Comparison to synthetic alternatives
- Why this oil specifically helps this concern
### keyBenefits (6 items)
- Specific, measurable benefits
- Focus on the target concern
- Include both immediate and long-term benefits
### howToApply (6 steps)
- Specific dosage (2-3 kapi)
- Application technique
- Frequency
- Best time of day
- Areas to focus on
- Tips for better absorption
### expectedResults
- Week 1-2: Initial improvements
- Week 4-6: Visible changes
- Week 8-12: Significant results
- Long-term maintenance
### customerResults (2 testimonials)
- Realistic names (Serbian)
- Ages 35-55
- Specific skin types
- Realistic timeframes
- Authentic language
### FAQs (3 questions)
- Common concerns about usage
- Safety/side effects
- Timeline expectations
---
## Manoon Product Ingredients Reference
**Use these ingredients in content:**
- Sweet almond oil (ulje slatkog badema)
- Panthenol
- Vitamin C
- Sandalwood (sandalovina)
- Apple oil (jabukovo ulje)
---
## URL Structure
```
/sr/resenja/najbolje-ulje-divlje-ruze-za-bore
/sr/resenja/najbolje-arganovo-ulje-za-suvu-kozu
...
```
Note: Keep existing `/solutions/` routing but create Serbian slugs for new pages.
---
## Translation Requirements
**Primary Language:** Serbian (native, authentic)
**Secondary Languages:** English, German, French (professional translation quality)
**Tone:**
- Informative but approachable
- Scientific but not clinical
- Encouraging but not hyped
- Trustworthy, expert advice
---
## SEO Keywords Strategy
### Primary Keywords Pattern:
- `[oil] za [concern]`
- `najbolje [oil] za [concern]`
- `prirodno rešenje za [concern]`
### Secondary Keywords:
- `serum za [concern]`
- `[oil] protiv [concern]`
- `prirodna nega za [concern]`
### Long-Tail Keywords:
- `kako ukloniti [concern] prirodnim putem`
- `[oil] iskustva`
- `najbolji serum za [concern] posle 40`
---
## Page Template Components
**Using existing:**
- `OilForConcernPageTemplate` component
- Header with logo and navigation
- Footer
- ProductReviews section
- BeforeAfterGallery (existing from homepage)
- ProductsGrid
- FAQSchema
**Tracking:**
- Rybbit (already configured)
- Mautic (already configured)
---
## Implementation Steps
### Step 1: Create JSON Data Files (Day 1)
- [ ] Create all 10 JSON files in `data/oil-for-concern/`
- [ ] Verify valid JSON structure
- [ ] Test with dataLoader
### Step 2: Verify Routing (Day 1)
- [ ] Test `/sr/resenja/{serbian-slug}` works
- [ ] Verify canonical URLs correct
- [ ] Check hreflang tags
### Step 3: Content Review (Day 2)
- [ ] Review Serbian content for authenticity
- [ ] Verify translations for other languages
- [ ] Check all internal links work
### Step 4: Testing (Day 2)
- [ ] Test all 10 pages render correctly
- [ ] Verify product grids display
- [ ] Check mobile responsiveness
- [ ] Validate schema markup
### Step 5: Polish (Day 3)
- [ ] Optimize images if needed
- [ ] Add any missing related pages links
- [ ] Final SEO review
---
## Success Criteria
- [ ] 10 pages created with Serbian slugs
- [ ] All pages render correctly at `/sr/resenja/{slug}`
- [ ] Header/Footer/Tracking all present
- [ ] Product grids display correctly
- [ ] Before/After gallery shows
- [ ] Schema markup validates
- [ ] No console errors
- [ ] Mobile responsive
---
## Next Steps After Completion
1. Deploy to production
2. Submit sitemap to Google
3. Monitor indexing
4. Track rankings for target keywords
5. Plan Phase 2 (next 20 pages)
---
## Appendix: Existing Infrastructure
**Components already built:**
- `OilForConcernPageTemplate` - Main page template
- `ProductsGrid` - Product display with add-to-cart
- `FAQSchema` - Schema markup component
- `dataLoader.ts` - Data fetching utilities
- `types.ts` - TypeScript interfaces
- `/[locale]/solutions/[slug]/page.tsx` - Route handler
**Components reused from site:**
- `Header` - With logo, nav, hamburger menu
- `Footer` - Full footer with links
- `ProductReviews` - Testimonial section
- `BeforeAfterGallery` - Before/after slider
**Tracking already configured:**
- Rybbit script in layout
- Mautic tracking in layout
---
## Notes
- Use existing page template - no new component development needed
- Focus on high-quality content in Serbian
- Ensure ingredients match actual Manoon products
- Keep URLs in Serbian for better local SEO
- All translations should be professional quality