כל הפרויקטים

קבוצת לסרי - אתר חדש ומערכת ניהול תפעול

מעבר מ-WordPress לאתר Nuxt 4 עם SEO/GEO/AEO, וממשק ניהול שמעביר את ה-Google Sheets של החברה למערכת אחת.

המטרה

החברה הפעילה את האתר על WordPress + Elementor בלי title ו-meta description לעמודים, ואת התפעול (פרויקטים, קבלנים, לקוחות, עובדים, טבלאות כמו ההסתדרות) ב-Google Sheets מפוזרים. המטרה: אתר עברי חדש בקוד, בעיצוב מחודש, שמנועי חיפוש ומנועי AI יודעים לקרוא, וממשק ניהול שמהווה תשתית למערכת ניהול רחבה יותר לחברה.

הפתרון

קוד אחד ב-Nuxt 4 + TypeScript: אתר ציבורי עברי RTL ב-SSR, ממשק ניהול SPA תחת /admin ו-API ב-Nitro מעל MongoDB, בפריסה ל-Vercel. סקריפט מיגרציה מושך את העמודים, הפוסטים והמדיה מ-WordPress דרך ה-WP REST API, מנקה את עטיפות ה-Elementor לבלוקים של תוכן ושומר כל נתיב עברי זהה 1:1, כדי שמעבר הדומיין יעבור בלי אובדן SEO. ממשק הניהול כולל עמודי CMS, לידים, לקוחות, קבלנים, פרויקטים, דיווחי עבודה, יומני עובדים, טבלאות מותאמות בלי קוד, ייבוא מ-Google Sheets עם dry-run ו-rollback, תזכורות, תפקידים והרשאות, יומן פעולות עם שחזור ויומן שגיאות.

עיקרי הדברים

  • קוד אחד מחליף גם את אתר ה-WordPress וגם את ה-Google Sheets התפעוליים
  • הנתיבים העבריים הישנים נשמרים 1:1 למעבר דומיין בלי אובדן SEO
  • כל שינוי נרשם וניתן לשחזור מתוך ממשק הניהול
  • 0 הפרות axe ברמות WCAG A/AA ב-50 תצוגות עמוד בבדיקת הנגישות הפנימית
  • ה-CI מריץ lint, typecheck, בדיקות יחידה ובדיקות API מול ה-build של הפרודקשן

האתגר

לעבור מ-WordPress בלי לאבד דירוגים בגוגל, כשאתר ה-WordPress החי ממשיך לרוץ על הדומיין.

המיגרציה שומרת כל נתיב עברי מקונן זהה, ורושמת הפניה לכל מה שמשתנה. הגרסה החדשה רצה בפריסה נפרדת עם מתג noindex גלובלי (SITE_INDEXABLE=false), כדי שלא תתחרה באתר החי כתוכן כפול עד מעבר הדומיין.

להכניס Google Sheets לא אחידים לבסיס נתונים, בלי ייבוא חד-כיווני של הכל או כלום.

כל רשומה מיובאת נושאת את המקור שלה (גיליון, טאב, מפתח שורה, ריצת ייבוא). הכלי מציג תצוגה מקדימה, ממפה עמודות למודול קיים או לטבלה מותאמת חדשה, מדווח שגיאות לכל שורה ב-dry-run, מבצע upsert ב-commit ויכול לבטל ריצה שלמה, כך שאפשר להריץ אותו שוב ולהישאר מסונכרנים עד המעבר. הוא גם מזהה תאריכים שנכתבו בתוך טקסט חופשי.

מערכת אחת מחזיקה מידע אישי של לקוחות, קבלנים ועובדים, ומשתמשים בה אנשים בתפקידים שונים.

השרת הוא מקור האמת: כל handler בניהול בודק הרשאת resource:action שנטענת מחדש מבסיס הנתונים, תפקיד יכול להעניק רק הרשאות שיש למי שיוצר אותו, הצפייה ביומני העובדים מוגבלת לפי תפקיד ומשתמש, וכל יצירה, עדכון, מחיקה וכניסה נרשמים ביומן פעולות שמאפשר שחזור. הכניסה כוללת קוד אימות במייל ונעילה שנשמרת ב-MongoDB, כדי שתעבוד גם ב-serverless.

תזכורות צריכות לצאת באמינות על שרת serverless שבו ה-cron יכול לרוץ פעם ביום או כל שעה.

כל ריצה תופסת את זמן הריצה הבא של כלל באמצעות compare-and-set, זמנים שהוחמצו מתאחדים לאחרון, ויומן משלוחים מונע מאותו פריט להגיע לאותו נמען פעמיים באותה תקופה. לוגיקת התזמון והניתוב טהורה ומכוסה בבדיקות יחידה.

מה נמסר

  • אתר ציבורי חדש ב-Nuxt 4 (SSR, עברית RTL)
  • מערכת ניהול עם CMS ומודולי תפעול
  • סקריפט מיגרציה מ-WordPress עם dry-run
  • ייבוא מ-Google Sheets עם rollback
  • חבילות בדיקות אוטומטיות (יחידה, API, דפדפן) ו-CI ב-GitHub Actions
  • תפריט נגישות, סקריפט להצהרת נגישות ודוח בדיקה
  • README עם התקנה, מודל אבטחה ונהלי תפעול

תוצאות

15+

מודולי ניהול

40

עמודים שנבדקו לנגישות

0

הפרות axe WCAG A/AA

Hebrew RTL

שפה ראשית

מה זה לימד אותי

  • סימון כל שורה מיובאת במקור שלה הוא מה שהופך מיגרציה מגיליונות להפיכה וניתנת להרצה חוזרת
  • השארת האתר החדש ב-noindex בפריסה נפרדת מאפשרת לבנות הכל מחדש בלי שום סיכון לדירוגים של האתר החי