fix(armaflex): rename misspelled 'armflex' slug to 'armaflex' everywhere

- Route /armflex -> /armaflex (page file + nav/listing links)
- Image folder public/images/armflex/ -> public/images/armaflex/
- Fix gallery alt-text 'Armflex' -> 'Armaflex'
- Add nginx 301 redirect so old /armflex URL still works (SEO-safe)
- Update engineering log + handoff

Verified: npm run build (44 pages), tsc --noEmit, nginx -t,
live probe /armaflex/ 200, zero stale 'armflex' refs.
This commit is contained in:
Kunthawat Greethong
2026-09-08 17:52:12 +07:00
parent b86542114f
commit 52030b7d46
21 changed files with 82 additions and 27 deletions

View File

@@ -1,6 +1,6 @@
--- ---
title: Deal Plus Tech Engineering Handoff title: Deal Plus Tech Engineering Handoff
updated: 2026-08-30 updated: 2026-09-08
--- ---
# Engineering Handoff # Engineering Handoff
@@ -8,13 +8,14 @@ updated: 2026-08-30
- Repository: `/Users/kunthawat/Gitea/dealplustech-astroreal` - Repository: `/Users/kunthawat/Gitea/dealplustech-astroreal`
- Branch: `main` - Branch: `main`
- Code commit: `c0d8cacfbeb328424138b26e22cb31e82db453b6` (pushed and verified at `origin/main` before this handoff update) - Code commit: `c0d8cacfbeb328424138b26e22cb31e82db453b6` (last pushed to `origin/main` on 2026-08-30); Armaflex rename changes staged and pending this handoff commit
- HEAD: current branch tip of `main`; verify with `git rev-parse HEAD` after the handoff update - HEAD: current branch tip of `main`; verify with `git rev-parse HEAD` after the handoff update
- Remote target: `origin/main` - Remote target: `origin/main`
- Working tree: clean after the verified code commit; this handoff metadata update is the only pending change - Working tree: Armaflex slug/image rename + nginx 301 staged; handoff/log metadata is the only other pending change
## Completed ## Completed
- **Armaflex slug rename** — `armflex``armaflex` (route, image folder, nav/listing links, gallery alt-text) + nginx 301 for the old URL
- CcooL product page: `/ฉนวนหุ้มท่อ-ccool/` - CcooL product page: `/ฉนวนหุ้มท่อ-ccool/`
- CcooL images and pricing PDF added under `public/` - CcooL images and pricing PDF added under `public/`
- Navigation, product listing, breadcrumb, metadata, FAQ, Product JSON-LD, and CTA tracking updated - Navigation, product listing, breadcrumb, metadata, FAQ, Product JSON-LD, and CTA tracking updated
@@ -25,12 +26,13 @@ updated: 2026-08-30
## Verification ## Verification
- `npm run build`**pass**, 44 pages - `npm run build`**pass**, 44 pages (Armaflex rename)
- `npx tsc --noEmit`**pass** - `npx tsc --noEmit`**pass** (no errors)
- `git diff --cached --check`**pass** - `git diff --check`**pass**
- Independent reviewer → **pass**, no security concerns or logic errors - `nginx -t` on the edited config → **syntax ok** (301 `armflex → armaflex`)
- Static output → 44 HTML pages, JSON-LD parses, Umami attributes are well-formed, images have `alt`; baseline-only duplicate SVG ID and blank-target links remain - Live static probe on `dist/``GET /armaflex/` 200, `GET /images/armaflex/gallery-1.jpg` 200, old `/armflex/` 404 at static layer (nginx 301 intercepts at deploy)
- Assets → five 1024×768 images; five-page A4 PDF; no PDF JavaScript/encryption - Source/output scan → zero `armflex` references remain (all `armaflex`)
- Independent reviewer (prior CcooL/SEO work) → **pass**, no security concerns or logic errors
## Known Limitations / Blockers ## Known Limitations / Blockers
@@ -49,5 +51,6 @@ updated: 2026-08-30
## Evidence Index ## Evidence Index
- [[2026-09-08-armaflex-slug-rename]]
- [[2026-08-30-seo-audit-fixes]] - [[2026-08-30-seo-audit-fixes]]
- [[../test-evidence/2026-08-30-ccool-seo]] - [[../test-evidence/2026-08-30-ccool-seo]]

View File

@@ -1,6 +1,6 @@
--- ---
title: Deal Plus Tech Engineering Log title: Deal Plus Tech Engineering Log
updated: 2026-08-30 updated: 2026-09-08
--- ---
# Engineering Log # Engineering Log
@@ -10,6 +10,7 @@ Latest verified code commit: `c0d8cacfbeb328424138b26e22cb31e82db453b6` pushed t
| Milestone | Status | Last verified | Evidence | Next action | | Milestone | Status | Last verified | Evidence | Next action |
|---|---|---|---|---| |---|---|---|---|---|
| Armaflex slug rename (armflex → armaflex) | complete | 2026-09-08 | `npm run build` 44 pages, `tsc --noEmit` clean, live probe `/armaflex/` 200, old slug 301 in nginx.conf | Push + EasyPanel rebuild; verify live 301 on production |
| CcooL product page and navigation | complete | 2026-08-30 | `npm run build` produced 44 static pages, including `/ฉนวนหุ้มท่อ-ccool/` | Confirm production domain before the next deploy/SEO change | | CcooL product page and navigation | complete | 2026-08-30 | `npm run build` produced 44 static pages, including `/ฉนวนหุ้มท่อ-ccool/` | Confirm production domain before the next deploy/SEO change |
| SEO trust-layer fixes | complete | 2026-08-30 | robots/sitemap, internal links, metadata, legal-page headings, and claim wording checked in built output | Fix production soft-404 routing at the server layer | | SEO trust-layer fixes | complete | 2026-08-30 | robots/sitemap, internal links, metadata, legal-page headings, and claim wording checked in built output | Fix production soft-404 routing at the server layer |
| Umami event convention | complete | 2026-08-30 | Source/output scan found no malformed `data-umami-event` attributes | Review event reports after real traffic arrives | | Umami event convention | complete | 2026-08-30 | Source/output scan found no malformed `data-umami-event` attributes | Review event reports after real traffic arrives |
@@ -24,6 +25,7 @@ Latest verified code commit: `c0d8cacfbeb328424138b26e22cb31e82db453b6` pushed t
## Entry Index ## Entry Index
- [[2026-09-08-armaflex-slug-rename]] — armflex → armaflex slug/image rename + nginx 301, verification, and push handoff.
- [[2026-08-30-seo-audit-fixes]] — CcooL page, SEO trust layer, Umami tracking, verification, and push handoff. - [[2026-08-30-seo-audit-fixes]] — CcooL page, SEO trust layer, Umami tracking, verification, and push handoff.
## Plan Synchronization ## Plan Synchronization

View File

@@ -0,0 +1,46 @@
---
title: Armaflex product slug rename (armflex → armaflex)
status: complete
verified: 2026-09-08
---
# Armaflex Product Slug Rename (armflex → armaflex)
## Plan Status
**complete** — the misspelled `armflex` product slug was renamed to `armaflex` (the correct Armaflex/Armacell brand spelling) across route, image folder, navigation, and alt-text, with an nginx 301 redirect added so the old URL does not break.
**Code commit:** (to be filled after commit) on `main`.
## Changed Scope
- Renamed page `src/pages/armflex.astro``src/pages/armaflex.astro` (route `/armflex``/armaflex`) via `git mv` (history preserved).
- Renamed image folder `public/images/armflex/``public/images/armaflex/` (all 12 assets) via `git mv`.
- Updated all route/image references: `src/components/common/Header.astro`, `src/layouts/BaseLayout.astro` (category slug + Armaflex subcategory slug), `src/pages/all-products.astro`, `src/pages/404.astro`, and the page's own image paths.
- Corrected gallery `alt="Armflex …"``alt="Armaflex …"` (5 images) in `src/pages/armaflex.astro`.
- Added a 301 redirect in `nginx.conf` for the old misspelled paths:
- `location = /armflex { return 301 /armaflex; }`
- `location = /armflex/ { return 301 /armaflex; }`
## Verification Evidence
- `npm run build`**pass**, 44 static pages; `dist/armaflex/index.html` generated (70.8 KB); `dist/armflex/index.html` gone; `dist/images/armaflex/` populated; `dist/images/armflex/` gone.
- `npx tsc --noEmit`**pass** (no errors).
- `git diff --check`**pass**.
- Source scan — `grep -rn 'armflex' src | grep -v armaflex` returns nothing (clean); all 5 nav/listing links now point to `/armaflex`.
- Built output scan — no stale `/armflex` hrefs or `images/armflex/` paths; gallery alt-text reads "Armaflex ภาพที่ 15"; H1 reads "Armaflex Class 1 ชนิดม้วน".
- Live static probe (`python3 -m http.server` on `dist/`): `GET /armaflex/` → 200, `GET /images/armaflex/gallery-1.jpg` → 200, old `GET /armflex/` → 404 at the static layer (the nginx 301 intercepts it at deploy time).
- `nginx -t` on the edited config (wrapped in the required `events{}`/`http{}` blocks) — **syntax is ok / test is successful**.
## Tooling Limitations
- `npm test` unavailable (no `test` script in `package.json`).
- The nginx 301 was validated for syntax locally and by logic; it is served by EasyPanel's nginx container at deploy time, so the live `armflex → armaflex` redirect was not exercised against the production endpoint in this session.
## Risks and Remaining Work
1. After deploy, confirm the production `armflex``armaflex` 301 actually fires (EasyPanel must rebuild with the new `nginx.conf`).
2. Confirm the real production domain before any domain-dependent SEO action (existing known limitation, unchanged).
## Exact Next Action
Commit this change on `main`, then push and rebuild via EasyPanel; verify the `/armflex``/armaflex` 301 and the `/armaflex` page on the production domain.

View File

@@ -35,6 +35,10 @@ server {
try_files $uri =404; try_files $uri =404;
} }
# 301 redirect: old misspelled product slug (armflex -> armaflex)
location = /armflex { return 301 /armaflex; }
location = /armflex/ { return 301 /armaflex; }
# Don't cache HTML # Don't cache HTML
location ~* \.html$ { location ~* \.html$ {
expires -1; expires -1;

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 476 KiB

After

Width:  |  Height:  |  Size: 476 KiB

View File

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 187 KiB

View File

Before

Width:  |  Height:  |  Size: 195 KiB

After

Width:  |  Height:  |  Size: 195 KiB

View File

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

View File

@@ -55,7 +55,7 @@ const productCategories = [
{ {
title: "ฉนวนและรั้ว", title: "ฉนวนและรั้ว",
items: [ items: [
{ label: "Armaflex", href: "/armflex" }, { label: "Armaflex", href: "/armaflex" },
{ label: "Aeroflex", href: "/aeroflex" }, { label: "Aeroflex", href: "/aeroflex" },
{ label: "Maxflex", href: "/maxflex" }, { label: "Maxflex", href: "/maxflex" },
{ label: "Thermobreak", href: "/เทอร์โมเบรค-thermobreak" }, { label: "Thermobreak", href: "/เทอร์โมเบรค-thermobreak" },

View File

@@ -136,9 +136,9 @@ const categories = [
}, },
{ {
name: 'ฉนวนหุ้มท่อ', name: 'ฉนวนหุ้มท่อ',
slug: '/armflex', slug: '/armaflex',
subcategories: [ subcategories: [
{ name: 'Armaflex', slug: '/armflex' }, { name: 'Armaflex', slug: '/armaflex' },
{ name: 'Aeroflex', slug: '/aeroflex' }, { name: 'Aeroflex', slug: '/aeroflex' },
{ name: 'Maxflex', slug: '/maxflex' }, { name: 'Maxflex', slug: '/maxflex' },
{ name: 'CcooL ฉนวนซีคูล', slug: '/ฉนวนหุ้มท่อ-ccool' }, { name: 'CcooL ฉนวนซีคูล', slug: '/ฉนวนหุ้มท่อ-ccool' },

View File

@@ -10,7 +10,7 @@ const popularLinks = [
{ name: 'ปั๊มน้ำ', slug: '/water-pump' }, { name: 'ปั๊มน้ำ', slug: '/water-pump' },
{ name: 'กริลแอร์', slug: '/grilles' }, { name: 'กริลแอร์', slug: '/grilles' },
{ name: 'ตู้ดับเพลิง', slug: '/ตู้ดับเพลิง' }, { name: 'ตู้ดับเพลิง', slug: '/ตู้ดับเพลิง' },
{ name: 'Armaflex', slug: '/armflex' }, { name: 'Armaflex', slug: '/armaflex' },
]; ];
--- ---

View File

@@ -32,7 +32,7 @@ const products = [
{ name: "Realflex", href: "/realflex", image: "/images/products-cropped/realflex_000C.jpg", category: "อุปกรณ์ดับเพลิง" }, { name: "Realflex", href: "/realflex", image: "/images/products-cropped/realflex_000C.jpg", category: "อุปกรณ์ดับเพลิง" },
// ฉนวนหุ้มท่อ (4 items) // ฉนวนหุ้มท่อ (4 items)
{ name: "Armaflex", href: "/armflex", image: "/images/armflex/armaflex-sheet-roll.jpg", category: "ฉนวนหุ้มท่อ" }, { name: "Armaflex", href: "/armaflex", image: "/images/armaflex/armaflex-sheet-roll.jpg", category: "ฉนวนหุ้มท่อ" },
{ name: "Aeroflex", href: "/aeroflex", image: "/images/aeroflex/aerocel-d-al-real.jpg", category: "ฉนวนหุ้มท่อ" }, { name: "Aeroflex", href: "/aeroflex", image: "/images/aeroflex/aerocel-d-al-real.jpg", category: "ฉนวนหุ้มท่อ" },
{ name: "Maxflex", href: "/maxflex", image: "/images/maxflex/maxflex-fsk-foil.jpg", category: "ฉนวนหุ้มท่อ" }, { name: "Maxflex", href: "/maxflex", image: "/images/maxflex/maxflex-fsk-foil.jpg", category: "ฉนวนหุ้มท่อ" },
{ name: "CcooL ฉนวนซีคูล", href: "/ฉนวนหุ้มท่อ-ccool", image: "/images/ccool/ccool-application-hvac.jpg", category: "ฉนวนหุ้มท่อ" }, { name: "CcooL ฉนวนซีคูล", href: "/ฉนวนหุ้มท่อ-ccool", image: "/images/ccool/ccool-application-hvac.jpg", category: "ฉนวนหุ้มท่อ" },

View File

@@ -5,7 +5,7 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
<BaseLayout title="Armaflex Class Roll ฉนวนยางดำแบบม้วน | ดีล พลัส เทค" description="Armaflex Class 1 ฉนวนยางดำแบบม้วน (Sheet/Roll) สำหรับงานเครื่องเย็น ระบบปรับอากาศ อุณหภูมิใช้งาน -50°C ถึง 105°C มาตรฐาน FM Approved" <BaseLayout title="Armaflex Class Roll ฉนวนยางดำแบบม้วน | ดีล พลัส เทค" description="Armaflex Class 1 ฉนวนยางดำแบบม้วน (Sheet/Roll) สำหรับงานเครื่องเย็น ระบบปรับอากาศ อุณหภูมิใช้งาน -50°C ถึง 105°C มาตรฐาน FM Approved"
product={{ product={{
name: 'Armaflex Class Roll ฉนวนยางดำแบบม้วน | ดีล พลัส เทค', name: 'Armaflex Class Roll ฉนวนยางดำแบบม้วน | ดีล พลัส เทค',
image: '/images/armflex/armaflex-sheet-roll.jpg', image: '/images/armaflex/armaflex-sheet-roll.jpg',
brand: 'Armacell', brand: 'Armacell',
}}> <main class="bg-white min-h-screen"> }}> <main class="bg-white min-h-screen">
<!-- Hero Section --> <!-- Hero Section -->
@@ -96,7 +96,7 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
</div> </div>
<div class="lg:sticky lg:top-24"> <div class="lg:sticky lg:top-24">
<div class="rounded-2xl overflow-hidden bg-white/10 p-2 max-w-md mx-auto lg:max-w-none"> <div class="rounded-2xl overflow-hidden bg-white/10 p-2 max-w-md mx-auto lg:max-w-none">
<img src="/images/armflex/armaflex-sheet-roll.jpg" alt="Armaflex Class 1 ชนิดม้วน" class="w-full max-w-md mx-auto lg:max-w-none" loading="eager" /> <img src="/images/armaflex/armaflex-sheet-roll.jpg" alt="Armaflex Class 1 ชนิดม้วน" class="w-full max-w-md mx-auto lg:max-w-none" loading="eager" />
</div> </div>
</div> </div>
</div> </div>
@@ -296,20 +296,20 @@ import BaseLayout from '@/layouts/BaseLayout.astro';
<p class="text-neutral-600">ภาพสินค้าจริงจากงานติดตั้ง — คลิกเพื่อดูภาพขนาดเต็ม</p> <p class="text-neutral-600">ภาพสินค้าจริงจากงานติดตั้ง — คลิกเพื่อดูภาพขนาดเต็ม</p>
</div> </div>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4"> <div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
<a href="/images/armflex/gallery-1.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-1" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow"> <a href="/images/armaflex/gallery-1.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-1" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
<img src="/images/armflex/gallery-1.jpg" alt="Armflex ภาพที่ 1" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" /> <img src="/images/armaflex/gallery-1.jpg" alt="Armaflex ภาพที่ 1" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
</a> </a>
<a href="/images/armflex/gallery-2.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-2" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow"> <a href="/images/armaflex/gallery-2.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-2" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
<img src="/images/armflex/gallery-2.jpg" alt="Armflex ภาพที่ 2" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" /> <img src="/images/armaflex/gallery-2.jpg" alt="Armaflex ภาพที่ 2" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
</a> </a>
<a href="/images/armflex/gallery-3.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-3" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow"> <a href="/images/armaflex/gallery-3.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-3" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
<img src="/images/armflex/gallery-3.jpg" alt="Armflex ภาพที่ 3" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" /> <img src="/images/armaflex/gallery-3.jpg" alt="Armaflex ภาพที่ 3" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
</a> </a>
<a href="/images/armflex/gallery-4.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-4" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow"> <a href="/images/armaflex/gallery-4.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-4" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
<img src="/images/armflex/gallery-4.jpg" alt="Armflex ภาพที่ 4" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" /> <img src="/images/armaflex/gallery-4.jpg" alt="Armaflex ภาพที่ 4" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
</a> </a>
<a href="/images/armflex/gallery-5.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-5" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow"> <a href="/images/armaflex/gallery-5.jpg" target="_blank" rel="noopener" data-umami-event="product-gallery-5" class="group block overflow-hidden rounded-xl shadow-md hover:shadow-xl transition-shadow">
<img src="/images/armflex/gallery-5.jpg" alt="Armflex ภาพที่ 5" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" /> <img src="/images/armaflex/gallery-5.jpg" alt="Armaflex ภาพที่ 5" class="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300" loading="lazy" />
</a> </a>
</div> </div>
</div> </div>