Back to notes
mastery-seo
Featured

Programmatic SEO with Next.js: สร้าง 1,000 หน้า Landing Page ในพริบตาเดียว

เทคนิคระดับ God-Tier ของ Startup ระดับโลก (TripAdvisor, Zapier): วิธีใช้ Next.js Dynamic Routes สร้างหน้าเว็บมหาศาลเพื่อดัก Long-tail Keyword แบบอัตโนมัติ

February 5, 20262 min read readNNexis by Seereen

🚀 SEO ไม่ใช่แค่การเขียนบทความ... แต่มันคือการเขียน "โค้ด"

คุณเคยสงสัยไหมทำไมเวลาค้นหา "Bangkok to Tokyo flight" หรือ "USD to THB" เราจะเจอเว็บอย่าง Skyscanner หรือ xe.com เสมอ? พวกเขาไม่ได้จ้างคนมานั่งเขียนหน้าเว็บทีละคู่ประเทศนะครับ... แต่เขาใช้เทคนิคที่เรียกว่า Programmatic SEO

Programmatic SEO คือการสร้างหน้าเว็บจำนวนมหาศาล (Landing Pages) แบบอัตโนมัติ โดยใช้ Template เดียว + ฐานข้อมูล (Database/API)

และข่าวดีคือ Next.js (App Router) คืออาวุธที่ทรงพลังที่สุดสำหรับการทำสิ่งนี้ครับ!


🛠 Case Study: เว็บเปรียบเทียบ Tech Stacks

สมมติเราอยากทำเว็บเปรียบเทียบ Framework เพื่อดัก Keyword เช่น:

  • "React vs Vue"
  • "Vue vs Svelte"
  • "Angular vs React"
  • ...และอีก 100 คู่

ถ้าทำมือ... ตายแน่นอนครับ แต่ด้วย Programmatic SEO เราเขียนโค้ดแค่ ไฟล์เดียว จบ!

1. The Data Source

ก่อนอื่นเราต้องมีข้อมูลดิบ (Dataset) ครับ

HLJS TYPESCRIPT/lib/data.ts
export const frameworks = ['react', 'vue', 'angular', 'svelte', 'solid'];

export const comparisons = [
  { id: 'react-vs-vue', tools: ['React', 'Vue'], winner: 'It depends...' },
  { id: 'vue-vs-svelte', tools: ['Vue', 'Svelte'], winner: 'Svelte is lighter' },
  // ... ลองจินตนาการว่ามีข้อมูลตรงนี้อีก 1,000 แถว
];

2. The Dynamic Page ([compare])

เราจะสร้างหน้า app/compare/[slug]/page.tsx ที่รองรับทุกคู่เปรียบเทียบ

HLJS TSX/app/compare/[slug]/page.tsx
import { notFound } from 'next/navigation';
import { comparisons } from '@/lib/data';

// 1. generateStaticParams: หัวใจสำคัญ!
// บอก Next.js ว่า "ช่วย Build หน้าพวกนี้รอไว้เลยนะ (SSG)"
export async function generateStaticParams() {
  return comparisons.map((comp) => ({
    slug: comp.id,
  }));
}

// 2. Metadata: สร้าง Title/Desc แบบ Dynamic ตามคู่เปรียบเทียบ
export async function generateMetadata({ params }) {
  const comp = comparisons.find(c => c.id === params.slug);
  if (!comp) return {};

  const [techA, techB] = comp.tools;
  return {
    title: `${techA} vs ${techB}: อันไหนดีกว่ากันในปี 2026?`,
    description: `เจาะลึกข้อดีข้อเสียระหว่าง ${techA} และ ${techB} พร้อมคำแนะนำสำหรับโปรเจกต์ของคุณ`
  };
}

// 3. The Page Template: เขียนครั้งเดียว ใช้ได้พันหน้า
export default function ComparisonPage({ params }) {
  const comp = comparisons.find(c => c.id === params.slug);
  if (!comp) return notFound();

  const [techA, techB] = comp.tools;

  return (
    <article className="max-w-3xl mx-auto py-10">
      <h1 className="text-4xl font-bold mb-6">
        ศึกช้างชนช้าง: {techA} ⚔️ {techB}
      </h1>

      <div className="grid grid-cols-2 gap-8 my-10">
        <div className="p-6 border rounded-xl bg-blue-50 dark:bg-blue-900/20">
          <h2 className="text-2xl font-bold mb-4 text-blue-600">{techA}</h2>
          <p>ข้อดีของ {techA} คือ...</p>
        </div>
        <div className="p-6 border rounded-xl bg-green-50 dark:bg-green-900/20">
           <h2 className="text-2xl font-bold mb-4 text-green-600">{techB}</h2>
           <p>ข้อดีของ {techB} คือ...</p>
        </div>
      </div>

      {/* ... เนื้อหา Dynamic อื่นๆ ... */}
    </article>
  );
}

🧠 3. สรุป Concept: Write Once, Rank Everywhere

สูตรสำเร็จคือ:

  1. Dataset ที่ดี: ข้อมูลต้องมีคุณภาพ ไม่ใช่แค่สุ่มคำ
  2. Template ที่ยืดหยุ่น: รองรับข้อมูลที่หลากหลาย
  3. Internal Linking: สร้างหน้า Index (เช่น /compare) ที่ลิงก์ไปหาทั้ง 1,000 หน้า ไม่งั้น Bot จะหาไม่เจอ

นี่คือพลังของ Engineer ครับ เราไม่ได้ทำงานหนัก (Work Hard) แต่เราทำงานฉลาด (Work Smart) ด้วยโค้ด

ใครอยากลองทำโปรเจกต์ Programmatic SEO บ้าง? เริ่มจาก Data ง่ายๆ ใกล้ตัวคุณดูสิครับ! ยอด Traffic หลักแสนรอคุณอยู่ 🚀

Share this note

© 2026 My Notes by Seereen