כל ההחלטות על stack, hosting, rendering, SEO, redirects, וטיימליין — בדף אחד. ללא עמימות, עם נימוקים. המסמך מבוסס על Next.js docs 16.2.6, מיפוי ה-1045 URLs, ו-Sanity schema plan קיים.
הפרקטיקה הסטנדרטית ב-2026 לאתר תוכן של משרד עורכי דין: Next.js עם Static Export על Cloudflare Pages CDN — TTFB מתחת ל-100ms מישראל, אפס עלות hosting, אפס תחזוקת שרת. כל שינוי תוכן מפעיל webhook שמבנה מחדש את האתר (~2 דקות). זה מה שמשרדי עו"ד מובילים בוחרים ב-2025-2026 כשהם עוברים מ-WordPress.
המסמך המלא ב-docs/site-build-master.md
שלוש שאלות Stack שעוררו בלבול — כולן מקבלות תשובה חד-משמעית כאן.
| סוג דף | גישה | נימוק |
|---|---|---|
| דף הבית | SSG | תוכן קבוע — rebuild בכל שינוי Sanity |
| מאמר (123) | SSG | generateStaticParams ב-build time |
| תחום עיסוק (8-10) | SSG | SEO landing page — SSG מושלם |
| קטגוריה / תגית | SSG | רשימת מאמרים — rebuild כשמוסיפים מאמר |
| יצירת קשר | SSG + Client POST | דף סטטי — טופס שולח POST ל-Cloudflare Worker |
| sitemap.xml / robots.txt / llms.txt | SSG Route Handler | מיוצר ב-build time מנתוני Sanity |
| דף 404 | SSG (404.html) | Cloudflare Pages מגיש 404.html אוטומטית |
Cloudflare Pages Deploy Hooknext build שולף תוכן עדכני מ-Sanity GROQ APInext/image עם custom loader — WebP/AVIF אוטומטי, resize לפי sizes propwidth + height + alt — מונע CLS&subset=hebrew,latin — חוסך 200KB+ של glyphs לא-עבריים<style> ב-<head><link rel="preload"> לhero image בדף הבית ובדפי תחום עיסוקfont-display: swap: טקסט נראה מיידית גם לפני טעינת הגופןכלל הברזל: Logical CSS Properties בלבד. margin-inline-start ולא margin-right. padding-inline-end ולא padding-left. RTL מטפל בכיוון אוטומטית — אל תשתמשו ב-direction: ltr אלא כשצריך מפורשות (מספרי טלפון, URLs, קוד).
| CSS ישן (שגוי) | CSS Logical (נכון) |
|---|---|
margin-left: 16px | margin-inline-start: 16px |
padding-right: 24px | padding-inline-end: 24px |
border-left: 2px solid | border-inline-start: 2px solid |
text-align: right | text-align: start |
left: 0 (absolute) | inset-inline-start: 0 |
lang="he" dir="rtl" על <html> — חובה, משפיע על כל דפדפן וקורא מסךtransform: scaleX(-1) או SVG נפרד<span dir="ltr">03-000-0000</span>flex-direction: row הפוך — השתמש ב-row-reverse רק כש-LTR מפורש נדרשהזדמנות היסטורית: האתר הקיים אין בו 0 JSON-LD, 0 meta descriptions, 0 OG tags. כל מה שנוסיף באתר החדש = רווח נטו של 100% — לא שמירה על מצב קיים, אלא קפיצת מדרגה מלאה.
קובץ public/_redirects ב-Cloudflare Pages. עד 2,000 שורות (מספיק ל-1045). כל URL ידוע מקבל יעד — אפס פספוסים.
| סוג URL | כמות | קוד | יעד |
|---|---|---|---|
| מאמרים (posts) | 123 | 301 | כבר ב-URL הנכון — redirect ספציפי לסלאגים שהשתנו |
| דפים סטטיים (pages) | 26 | 301 | URL נשמר / redirect אם שונה |
| 5 דפי זבל | 5 | 410 | /form-test/ /formtest/ /test/ /4234/ /4306/ |
| סדרות (series) | 5 | 301 | URL נשמר /series/<slug>/ |
| קטגוריות | 11 | 301 | שים לב: משפט-ומסחר ≠ משפט-מסחרי — redirect ספציפי |
| תגיות פעילות (30) | 30 | 301 | לקטגוריה מתאימה |
| תגיות לא פעילות (82) | 82 | 301 | ← Homepage (דף הבית) |
| קבצי מדיה (wp-content) | 534 | 301 | URL חדש של Sanity CDN |
_redirects + deploy חדש. אחרי 30 יום יציבות → שקול כיבוי WP.
326MB ארכיון תוכן כבר קיים מקומית ב-content-archive/ — 123 JSON למאמרים, 31 דפים, 5 סדרות, 529 קבצי מדיה. הסקריפט migration/05-wp-to-sanity.py יומר אותם ל-Sanity documents.
| שדה WP | שדה Sanity | הערה |
|---|---|---|
post_title | title | ישיר |
content.rendered (HTML) | content (Portable Text) | דרך @portabletext/html-parser |
post_date | legacy.originalPublishDate | נשמר לצורך SEO תאריך מקורי |
post_name (slug) | slug.current + legacy.legacyUrl | Legacy URL → קובץ _redirects |
_thumbnail_id | featuredImage (asset ref) | העלה ל-Sanity Assets API |
| Elementor postmeta | content.rendered (HTML) | גוגל כבר מרנדר את זה — ה-HTML מוכן |
₪ — rename מחייב + 301/עורך-דין-מסחרי/ + /משפט-מסחרי-יעוץ/)משפט-ומסחר: ה-slug בפועל שגוי — redirect ספציפי חיוניארכיטקטורה: [טופס באתר] → POST → [Cloudflare Worker] → [Resend API] → [מייל לאלון]. ב-MVP: מייל ל-nadavf@gmail.com, אחרי go-live — לכתובת של אלון.
אזהרה: כללי לשכת עורכי הדין בישראל אוסרים מפורשות על מילים ומשפטים שנראים "שיווקיים מדי". עורך דין שמפרסם "מומחה" עלול לקבל תלונה ללשכה. יש לסרוק את כל הטקסט לפני go-live.
| מה אסור לכתוב | מה מותר במקומו |
|---|---|
| "מומחה" / "מומחים" | "בעל ניסיון נרחב" / "25+ שנות ניסיון" |
| "מתמחה ב..." | "עוסק ב..." / "מטפל ב..." |
| "ללא עלות" / "חינם" | לא להזכיר מחירים בכלל |
| "הטוב ביותר" / "הגדול ביותר" | "107 ביקורות 5 כוכבים" (עובדתי) |
| "ערבות להצלחה" | שום הבטחה לתוצאה |
priceRange: "$$" בSchema.org |
השמט את השדה הזה לחלוטין |
<a href="#main">דלג לתוכן הראשי</a><label for> על כל שדה טופס:focus-visible עם outline ברור לכל אלמנט אינטראקטיבי<header>, <main>, <nav>, <footer>| כלי | עלות | מה מקבלים |
|---|---|---|
| Google Search Console | חינם | Coverage, Search Queries, Core Web Vitals, 404s — חובה |
| PageSpeed Insights | חינם | Lighthouse per-URL, CWV — בדיקה לפני כל launch |
| schema.org Validator | חינם | בדיקת תקינות כל JSON-LD type |
| Microsoft Clarity | חינם | Heatmaps + session recordings — אופציונלי |
| Ahrefs / SEMrush | $99-120/חודש | Backlinks, Keyword difficulty — לא חיוני ל-MVP |
הנחה: חומרים (לוגו, פירוט עיצוב, קטגוריות חדשות) התקבלו מאלון.
create-next-app + TypeScript + Tailwind + next.config.ts עם output: 'export'docs/sanity-schema-plan/schemas/next.config.ts לא פועלים עם output: 'export' (מגבלת Next.js). Security headers חייבים להיות ב-public/_headers של Cloudflare Pages — לא ב-next.config.