thelaw.co.il דאשבורד פרויקט הגירה
מתווה הבנייה הסופי

תכנית בנייה — Next.js + Sanity + Cloudflare Pages

כל ההחלטות על stack, hosting, rendering, SEO, redirects, וטיימליין — בדף אחד. ללא עמימות, עם נימוקים. המסמך מבוסס על Next.js docs 16.2.6, מיפוי ה-1045 URLs, ו-Sanity schema plan קיים.

עודכן: 9 במאי 2026
מבוסס על מחקר Next.js 16.x + Cloudflare Pages
12 סקשנים · מסמך מלא ב-docs/site-build-master.md
SSG
מודל הרינדור הנבחר
~2m
זמן build + deploy
20
ימי עבודה לgo-live

הפרקטיקה הסטנדרטית ב-2026 לאתר תוכן של משרד עורכי דין: Next.js עם Static Export על Cloudflare Pages CDN — TTFB מתחת ל-100ms מישראל, אפס עלות hosting, אפס תחזוקת שרת. כל שינוי תוכן מפעיל webhook שמבנה מחדש את האתר (~2 דקות). זה מה שמשרדי עו"ד מובילים בוחרים ב-2025-2026 כשהם עוברים מ-WordPress.

המסמך המלא ב-docs/site-build-master.md

סקשן 1 · סטאק — ההכרעה הסופית
Next.js vs Nuxt vs Astro · Cloudflare Pages vs Vercel · Sanity

שלוש שאלות Stack שעוררו בלבול — כולן מקבלות תשובה חד-משמעית כאן.

נפסל · Nuxt 4
Vue.js Framework
Sanity ecosystem קטן בהרבה — פחות integrations
Vue stack שונה לחלוטין מ-React
Nuxt בוחרים כשיש Vue dev — אין כאן
נפסל · Vercel
Vercel (מפתחי Next.js)
ISR מלא ו-PPR — תמיכה מושלמת
Hobby: 100 builds/חודש, 4.5GB bandwidth
חיוב מדורג — יכול לעלות $20-40/חודש בהמשך
חשבון אלון לא קיים שם
הכרעה: Next.js 15 (App Router) + Sanity v3 + Cloudflare Pages — כפי שנקבע בהתחלה ב-STATUS.md. המחקר מאשש את הבחירה. Nuxt ו-Astro נפסלו. Vercel נפסל לטובת Cloudflare Pages בגלל מחיר ותשתית קיימת.
# תרשים זרימה: WP הקיים → הגירה → Production
[WordPress הקיים] → read-only ← לא נוגעים
     סקריפט הגירה חד-פעמי
[content-archive/ — 326MB] ← כבר קיים
     migration/05-wp-to-sanity.py
[Sanity CMS — ikgypq2f] ← אלון מוסיף תוכן עתידי
     Sanity Webhook: "document.publish"
[Cloudflare Pages Deploy Hook]
     next build (output: export) ~90 שניות
[Cloudflare Pages CDN — PoP TLV1]
     <100ms TTFB
[משתמש בישראל]
סקשן 2 · ארכיטקטורת רינדור
SSG vs ISR vs SSR — ההכרעה הסופית לכל סוג דף
נפסל · ISR מסורתי
Incremental Static Regeneration
ISR דורש Node.js runtime — לא עובד ב-Static Export
Cloudflare Workers adapter לא verified עדיין
מוסיף מורכבות ללא יתרון ל-123 מאמרים
נפסל · SSR
Server Side Rendering
דורש Node.js server — מנוגד לארכיטקטורת CDN
עלות גבוהה יותר, cold starts, תחזוקה
אין צורך — התוכן לא משתנה real-time
הבחירה לכל סוג דף
סוג דףגישהנימוק
דף הבית 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 אוטומטית
Webhook flow: Sanity → Cloudflare Pages
1. אלון מפרסם מאמר ב-Sanity Studio
2. Sanity שולח POST ל-Cloudflare Pages Deploy Hook
3. Cloudflare Pages מתחיל build חדש
4. next build שולף תוכן עדכני מ-Sanity GROQ API
5. deploy אטומי — האתר עם המאמר החדש פעיל תוך ~2 דקות
כלל: SSG לכל דף. ISR ו-SSR לא נדרשים ולא אפשריים ב-Cloudflare Pages Static Export. הפתרון לתוכן חדש: webhook rebuild (2 דקות — מהיר מספיק לאתר של משרד עו"ד שמפרסם מאמר פעם בשבוע).
סקשן 3 · ביצועים — יעדי 2026
Core Web Vitals + Image Pipeline + Font Optimization
LCP
<1.5s
Largest Contentful Paint
INP
<100ms
Interaction to Next Paint
CLS
<0.05
Cumulative Layout Shift
TTFB
<100ms
Time to First Byte
Lighthouse
95+
כל 4 קטגוריות
Image Pipeline — Sanity CDN (נבחר)
  • Sanity Image CDN + next/image עם custom loader — WebP/AVIF אוטומטי, resize לפי sizes prop
  • Sanity CDN כבר כולל PoP גלובלי — לא נדרש Cloudflare Images ($5/חודש)
  • 534 קבצי מדיה יועלו ל-Sanity Assets API בזמן ההגירה
  • כל תמונה חייבת width + height + alt — מונע CLS
אופטימיזציות קריטיות
  • Font subsetting עברי: Heebo + Frank Ruhl Libre עם &subset=hebrew,latin — חוסך 200KB+ של glyphs לא-עבריים
  • Critical CSS inline: רק CSS above-the-fold נכנס ל-<style> ב-<head>
  • <link rel="preload"> לhero image בדף הבית ובדפי תחום עיסוק
  • React Server Components: header, footer, article body = 0 JS client-side
  • font-display: swap: טקסט נראה מיידית גם לפני טעינת הגופן
סקשן 4 · Hebrew RTL
Gotchas ידועים + פתרונות + Logical CSS

כלל הברזל: Logical CSS Properties בלבד. margin-inline-start ולא margin-right. padding-inline-end ולא padding-left. RTL מטפל בכיוון אוטומטית — אל תשתמשו ב-direction: ltr אלא כשצריך מפורשות (מספרי טלפון, URLs, קוד).

CSS ישן (שגוי)CSS Logical (נכון)
margin-left: 16pxmargin-inline-start: 16px
padding-right: 24pxpadding-inline-end: 24px
border-left: 2px solidborder-inline-start: 2px solid
text-align: righttext-align: start
left: 0 (absolute)inset-inline-start: 0
5 Gotchas קריטיים
  1. lang="he" dir="rtl" על <html> — חובה, משפיע על כל דפדפן וקורא מסך
  2. חיצים (→ ←) ב-RTL חייבים להפוך — transform: scaleX(-1) או SVG נפרד
  3. מספרי טלפון: תמיד <span dir="ltr">03-000-0000</span>
  4. Flexbox ב-RTL: flex-direction: row הפוך — השתמש ב-row-reverse רק כש-LTR מפורש נדרש
  5. גופנים: Heebo לUI + ניווט; Frank Ruhl Libre לכותרות H1/H2 אדיטוריאליות
סקשן 5 · תשתית SEO
sitemap + robots + llms.txt + Schema.org + Meta + OG — הכל אוטומטי

הזדמנות היסטורית: האתר הקיים אין בו 0 JSON-LD, 0 meta descriptions, 0 OG tags. כל מה שנוסיף באתר החדש = רווח נטו של 100% — לא שמירה על מצב קיים, אלא קפיצת מדרגה מלאה.

Schema.org JSON-LD לכל דף
7 סוגי markup
LegalService + LocalBusiness — גלובלי ב-layout
Article + Person — לכל מאמר
FAQPage — לדפי תחום עיסוק עם שאלות
BreadcrumbList — לכל דף עם היררכיה
AggregateRating — 107 ביקורות Google (עובדתי, מותר)
תבנית llms.txt לאלון לב (תוכן)
# Alon Lev Law Office — משרד עורכי דין אלון לב ושות' > משרד עורכי דין בוטיק ברמת גן. עו"ד אלון לב — בוגר ת"א, נוטריון, 25+ שנות ניסיון. ## תחומי עיסוק - משפט מסחרי · ליטיגציה · גבייה · מקרקעין · פטור ממס ## מסמכים לאינדוקס - /articles/ — 123 מאמרים משפטיים (2021-2026) - /series/ — 5 סדרות ממוקדות ## אמינות - 107 ביקורות 5 כוכבים Google (2026) - רשום לשכת עורכי הדין בישראל
סקשן 6 · Redirects — 1045 URLs
מבנה _redirects · 301 vs 410 · דף 404 חכם · מעקב 30 יום

קובץ 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
מבנה הקובץ (דוגמה)
# public/_redirects — Cloudflare Pages # פורמט: [old-path] [new-path] [status] # URLs עבריים חייבים להיות percent-encoded! # מאמרים — slug שהשתנה /2024/01/15/%D7%A2%D7%95%D7%A8%D7%9A-%D7%93%D7%99%D7%9F/ /2024/01/15/commercial-lawyer/ 301 # קטגוריה — שם שגוי בWP /category/%D7%9E%D7%A9%D7%A4%D7%98-%D7%95%D7%9E%D7%A1%D7%97%D7%A8/ /category/commercial/ 301 # 5 דפי זבל — 410 Gone /form-test/ / 410 /formtest/ / 410 /test/ / 410 /4234/ / 410 /4306/ / 410 # מדיה → Sanity CDN /wp-content/uploads/2024/01/image.jpg https://cdn.sanity.io/images/... 301
מעקב 30 יום post-launch: GSC > Coverage > "Not found (404)" — כל שבוע. כל URL שמופיע כ-404 → בדיקה + הוספה ל-_redirects + deploy חדש. אחרי 30 יום יציבות → שקול כיבוי WP.
סקשן 7 · הגירת תוכן
WP REST → Sanity Portable Text · Elementor Blobs · בעיות ידועות

326MB ארכיון תוכן כבר קיים מקומית ב-content-archive/ — 123 JSON למאמרים, 31 דפים, 5 סדרות, 529 קבצי מדיה. הסקריפט migration/05-wp-to-sanity.py יומר אותם ל-Sanity documents.

שדה WPשדה Sanityהערה
post_titletitleישיר
content.rendered (HTML)content (Portable Text)דרך @portabletext/html-parser
post_datelegacy.originalPublishDateנשמר לצורך SEO תאריך מקורי
post_name (slug)slug.current + legacy.legacyUrlLegacy URL → קובץ _redirects
_thumbnail_idfeaturedImage (asset ref)העלה ל-Sanity Assets API
Elementor postmetacontent.rendered (HTML)גוגל כבר מרנדר את זה — ה-HTML מוכן
בעיות ידועות לתיקון בהגירה
  • ~30 פוסטים עם slug קטוע ב-50 תווים — בדיקה ידנית + rename + 301
  • id=5109: slug עם — rename מחייב + 301
  • 3 כפילויות תוכן: מיזוג ידני לפני הגירה (/עורך-דין-מסחרי/ + /משפט-מסחרי-יעוץ/)
  • קטגוריה משפט-ומסחר: ה-slug בפועל שגוי — redirect ספציפי חיוני
סקשן 8 · Forms ו-Leads
Resend vs Cloudflare Email Workers vs Formspree — ההכרעה
נפסל
Formspree
$8-25/חודש — יקר ללא הצדקה
תלות בצד שלישי נוסף

ארכיטקטורה: [טופס באתר] → POST → [Cloudflare Worker] → [Resend API] → [מייל לאלון]. ב-MVP: מייל ל-nadavf@gmail.com, אחרי go-live — לכתובת של אלון.

סקשן 9 · תאימות לחוק — אתיקה
כללי לשכת עורכי הדין · תקנות נגישות 2013 WCAG 2.2 AA

אזהרה: כללי לשכת עורכי הדין בישראל אוסרים מפורשות על מילים ומשפטים שנראים "שיווקיים מדי". עורך דין שמפרסם "מומחה" עלול לקבל תלונה ללשכה. יש לסרוק את כל הטקסט לפני go-live.

מה אסור לכתובמה מותר במקומו
"מומחה" / "מומחים" "בעל ניסיון נרחב" / "25+ שנות ניסיון"
"מתמחה ב..." "עוסק ב..." / "מטפל ב..."
"ללא עלות" / "חינם" לא להזכיר מחירים בכלל
"הטוב ביותר" / "הגדול ביותר" "107 ביקורות 5 כוכבים" (עובדתי)
"ערבות להצלחה" שום הבטחה לתוצאה
priceRange: "$$" בSchema.org השמט את השדה הזה לחלוטין
נגישות — WCAG 2.2 AA (חובה בחוק ישראלי)
  • Contrast ratio 4.5:1 — הפלטה הנוכחית עוברת (בורדו + cream)
  • Alt text לכל 534 קבצי מדיה — כבר קיים ב-metadata JSON
  • Skip link: <a href="#main">דלג לתוכן הראשי</a>
  • <label for> על כל שדה טופס
  • :focus-visible עם outline ברור לכל אלמנט אינטראקטיבי
  • ARIA landmarks: <header>, <main>, <nav>, <footer>
סקשן 10 · פערי SEO ידועים
מה עוד נדרש לפני ואחרי go-live — חינמי vs בתשלום
קריטי לפני go-live
GSC Access
חינמי · אלון צריך לאשר
אלון מוסיף נדב כ-Viewer ב-Google Search Console → Coverage report + Backlinks חינמיים
לוגו SVG רשמי
חינמי · נדרש מאלון
קובץ וקטור של הלוגו — נחוץ לbuild favicon, OG image, Schema.org logo
OG Image לכל דף
חינמי · נדב מעצב
תמונה 1200×630 ייצוגית לכל סוג דף — מחזקת CTR בשיתוף ברשתות חברתיות
Bing Webmaster Tools
חינמי · 5 דקות הגדרה
הגשת sitemap ל-Bing ו-DuckDuckGo — Bing = 5-8% מהחיפושים בישראל
כלי monitoring חינמיים — לאחר go-live
כליעלותמה מקבלים
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
סקשן 11 · Timeline בנייה
20 ימי עבודה לgo-live — 6 שלבים

הנחה: חומרים (לוגו, פירוט עיצוב, קטגוריות חדשות) התקבלו מאלון.

שלב 1
ימים 1-3
Bootstrap + Schema Setup
יום 1: create-next-app + TypeScript + Tailwind + next.config.ts עם output: 'export'
יום 2: Sanity Studio + schemas מ-docs/sanity-schema-plan/schemas/
יום 3: next-sanity client + GROQ queries + ENV vars
שלב 2
ימים 4-8
דפים סטטיים
יום 4: Layout — header, footer, navigation (RTL מלא, Heebo + Frank Ruhl Libre)
יום 5: Homepage — hero, תחומי עיסוק, מאמרים אחרונים, 107 ביקורות
יום 6: דף תחום עיסוק + JSON-LD LegalService
יום 7: דף "אודות" + דף "צור קשר" + Cloudflare Worker לטופס
יום 8: 404 חכם + robots.txt + sitemap.xml + llms.txt
שלב 3
ימים 9-12
תבניות מאמר/תחום
יום 9: Article template — Portable Text renderer, breadcrumbs, author bio
יום 10: JSON-LD Article + FAQPage schema. OG tags דינמיים
יום 11: Series template + category + tag listing pages
יום 12: Mobile QA — RTL, images, forms
שלב 4
ימים 13-15
הגירת תוכן
יום 13: כתיבת migration/05-wp-to-sanity.py + בדיקה על 10 מאמרים
יום 14: ריצה מלאה — 123 מאמרים + 31 דפים + 5 סדרות + media
יום 15: בדיקת תוכן ידנית (20 דפים מרכזיים) + תיקון Elementor blobs
שלב 5
ימים 16-17
Redirects + סופי
יום 16: בניית public/_redirects מלא (1045 URLs — script אוטומטי)
יום 17: בדיקת _redirects על staging URL ב-CF Pages Preview
שלב 6
ימים 18-20
QA + Go-Live
יום 18: Lighthouse audit (95+ כל קטגוריה) + schema.org validation
יום 19: Accessibility audit (axe-core) + cross-browser (Safari, Chrome, Firefox)
יום 20: Go-Live — TTL DNS ל-300s → A record → CF Pages custom domain → ניטור 30 יום
סקשן 12 · נספח — קוד דוגמה
next.config.ts · app/layout.tsx · sanity.config.ts · public/_headers
next.config.ts
import type { NextConfig } from "next" const nextConfig: NextConfig = { output: "export", // SSG טהור ל-Cloudflare Pages trailingSlash: true, // /about/ כמו WP המקורי images: { loader: "custom", loaderFile: "./lib/sanity-image-loader.ts", }, } export default nextConfig
public/_headers (security headers ל-Cloudflare)
/* X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN Referrer-Policy: origin-when-cross-origin Strict-Transport-Security: max-age=63072000; includeSubDomains; preload /sitemap.xml Content-Type: application/xml; charset=utf-8 /llms.txt Content-Type: text/plain; charset=utf-8
app/layout.tsx — RTL + JSON-LD גלובלי (מבנה)
export default function RootLayout({ children }) { return ( <html lang="he" dir="rtl"> <head> {/* גופנים עם subset עברי */} <link href="https://fonts.googleapis.com/css2?family=Heebo..." /> {/* Schema.org JSON-LD גלובלי */} <script type="application/ld+json">{JSON.stringify(orgSchema)}</script> </head> <body> <a href="#main" className="skip-link">דלג לתוכן</a> <header>...</header> <main id="main">{children}</main> <footer>...</footer> </body> </html> ) }
הערה חשובה: Headers ב-next.config.ts לא פועלים עם output: 'export' (מגבלת Next.js). Security headers חייבים להיות ב-public/_headers של Cloudflare Pages — לא ב-next.config.