סקירה כללית — מה זה FinZone?
מה זה FinZone
FinZone (finzone.co.il) הוא אתר חינוך פיננסי ישראלי בעברית, המיועד לקהל רחב — משפחות, משקיעים ואנשי עסקים. האתר משלב כתבות עומק, ניתוחים מקצועיים וכלים פרקטיים בתחומים:
- נדל"ן ומשכנתאות בישראל
- שוק ההון והשקעות
- אפליקציות AI וטכנולוגיה
- ניהול עסקי
- ניהול משפחתי ותקציב
- טכנולוגיה ודיגיטל
מטרות עסקיות
ה-Stack הטכנולוגי
| שכבה | טכנולוגיה | הסבר |
|---|---|---|
| Backend | PHP | שרת cPanel על box.co.il |
| Frontend | HTML + CSS + JS | ללא React/Vue — Plain JS |
| מסד נתונים | articles.json | קובץ JSON פשוט במקום DB |
| AI כתבות | Anthropic Claude API | מודל claude-haiku-4-5 |
| תמונות | Unsplash API | תמונות חינמיות אוטומטיות |
| גופנים | Google Fonts | Heebo + Frank Ruhl Libre |
| ניוזלטר | רב מסר | ניהול רשימות תפוצה |
| ניתוח שוק | TradingView | ויג'ט גרפי שוק חי |
שלב ראשון — ראשית הדרך
נקודת הפתיחה
בתחילה היה אתר סטטי פשוט — HTML קבוע ללא מערכת ניהול תוכן. כל עדכון כתבה דרש עריכה ידנית של קוד. זה לא הסתדר עם הצורך לפרסם כתבות בתדירות גבוהה.
ההחלטה הראשונה הייתה לא ללכת על WordPress — כדי לשמור על מהירות, שליטה מלאה בקוד, ועלויות אחסון נמוכות.
ההחלטות הגדולות מהשלב הראשון
במקום CMS מסורבל, בנינו CMS מותאם אישית עם PHP ו-articles.json כמסד הנתונים. פשוט, מהיר, עלות אחסון אפסית.
האתר הציבורי עובד כ-SPA — עמוד אחד שמציג תצוגות שונות (ראשי / כתבה / קטגוריה) על ידי שינוי ה-URL hash.
נקודה קריטית: localStorage מאחסן נתונים רק בדפדפן של המנהל. אורחים לא ראו כתבות! עברנו ל-PHP + articles.json בשרת.
כל הממשק direction: rtl, כולל פונטים ישראליים (Heebo), כפתורים, טפסים ועיצוב מותאם לשפה העברית.
מבנה הקבצים
מפת הקבצים בשרת
תפקיד כל קובץ
| קובץ | תפקיד | גישה |
|---|---|---|
index.php | האתר הציבורי המלא — SPA שמציג כתבות, קטגוריות, חנות, ניוזלטר, עמודים משפטיים | כולם |
admin.php | פאנל ניהול מלא — CMS, עורך כתבות, מחולל AI, סטטיסטיקות | מנהל בלבד |
ai-generate.php | REST endpoint — מקבל פרמטרים, קורא ל-Claude API + Unsplash, מחזיר JSON | מנהל בלבד (session) |
sitemap.php | יוצר Sitemap XML דינמי עם כל הכתבות המפורסמות | כולם / גוגל |
articles.json | מסד הנתונים — מערך JSON עם כל הכתבות | PHP בלבד (קריאה/כתיבה) |
articles.json הוא מסד הנתונים היחיד של האתר. בכל העלאה של קבצים חדשים לשרת — אסור להחליף אותו. תמיד בדוק שהוא קיים לאחר כל פריסה. אם הוא נדרס — כל הכתבות נמחקות!
האתר הציבורי — index.php
ארכיטקטורה: SPA עם Hash Routing
האתר פועל כ-Single Page Application. כל הניווט מתבצע דרך שינוי ה-URL hash, ללא טעינה מחדש של הדף:
finzone.co.il/ → ראשי (Home)
finzone.co.il/#article/SLUG → קריאת כתבה
finzone.co.il/#category/ai → כתבות לפי קטגוריה
ה-JavaScript מאזין לשינויי hash ומציג את התצוגה המתאימה, תוך עדכון SEO meta tags דינמי.
טעינת כתבות מהשרת
בראש ה-index.php, PHP קורא את articles.json ומכניס אותו ל-JavaScript:
<?php
$articles_file = __DIR__ . '/articles.json';
$articles_json = '[]';
if (file_exists($articles_file)) {
$raw = file_get_contents($articles_file);
$test = json_decode($raw);
if (is_array($test)) $articles_json = $raw;
}
?>
<script>
const serverArts = <?php echo $articles_json; ?>;
allArts = Array.isArray(serverArts) ? serverArts : [];
</script>
כך הכתבות זמינות לכל מבקר, ולא רק לדפדפן של המנהל.
הרכיבים הראשיים של האתר
- Topbar — רצועת ידיעות גוללת אוטומטית בחלק העליון
- Header + Nav — לוגו, ניווט לפי קטגוריות, כפתור "דבר איתנו"
- Hero Section — באנר ראשי עם כתבת הדגשה הכי חדשה
- Categories Bar — 6 קטגוריות עם אייקונים וצבעים ייחודיים
- כרטיסי כתבות — רשת כתבות עם תמונה, קטגוריה, תאריך, תקציר
- תצוגת כתבה מלאה — עמוד כתבה עם שיתוף WhatsApp/Facebook
- TradingView Widget — גרף שוק חי
- חנות ספרים — (בהמתנה לאינטגרציית Cardcom)
- ניוזלטר — טופס הרשמה לרב מסר
- צ'אטבוט לידים — שאלון שמאסף שם, טלפון ותחום עניין ושולח לוואטסאפ
- ויג'ט נגישות — שינוי גודל פונט, ניגודיות, סמן גדול
- עמודים משפטיים — פרטיות, תנאים, כתב ויתור, נגישות, צור קשר
- Cookie Consent — לפי תיקון 13 לחוק הגנת הפרטיות הישראלי
- Footer — קישורים, כתב ויתור, זכויות יוצרים 2026
6 הקטגוריות ומזהיהן
| מזהה | שם בעברית | אייקון |
|---|---|---|
realestate | נדל"ן | 🏠 |
ai | אפליקציות AI | 🤖 |
stocks | שוק ההון | 📈 |
tech | טכנולוגיה | 💻 |
business | ניהול עסקי | 💼 |
family | ניהול משפחתי | 👨👩👧 |
פאנל הניהול — admin.php
כניסה ואבטחה
הפאנל מוגן בסיסמה דרך PHP session. הניסיון לגשת ל-admin.php ללא התחברות מציג מסך login. לאחר כניסה מוצלחת — ה-session נשמר לכל הבקשות.
🔐 סיסמה: FZ#2026@Secure!9k
⚠️ חשוב: שנה את הסיסמה בקובץ admin.php בשורת ה-define לסיסמה חדשה אם תרצה.
הכרטיסיות בפאנל
מציג מספר כתבות פורסמו, טיוטות, סה"כ כתבות, ו-breakdown לפי קטגוריה. כרטיסי סיכום בולטים בחלק העליון.
טבלה עם כל הכתבות, אפשרות פרסום/ביטול פרסום, עריכה, מחיקה, ומיון. חיפוש מיידי לפי כותרת.
עורך HTML מלא עם: שורת כלים צפה/נדבקת, בחירת צבעים, כותרות H1-H6, מצב HTML גולמי, תצוגה מקדימה חיה. כל שדות SEO עם ספירת תווים.
הזן נושא, בחר קטגוריה, סגנון ואורך — AI יוצר כתבה מלאה עם תמונה. כתבה מוכנה להשלמה ופרסום.
עורך הכתבות — פיצ'רים מיוחדים
- שורת כלים צפה (sticky) — נשארת גלויה בזמן גלילה
- בוחר צבעים — לסימון טקסט בצבע
- ספירת תווים Meta — Meta Title: 50-60 תווים, Meta Description: 150-160 תווים
- מצב HTML גולמי — toggle בין עורך ויזואלי לקוד HTML
- תצוגה מקדימה — רואים את הכתבה כפי שתיראה לגולש
- שמירה אוטומטית — AJAX שמירה ל-articles.json ללא רענון
- Slug אוטומטי — נוצר מהכותרת, אפשר לערוך ידנית
מבנה כתבה ב-articles.json
{
"id": "1717000000000",
"title": "כותרת הכתבה",
"metaTitle": "Meta Title (50-60 תווים)",
"metaDescription": "Meta Description (150-160 תווים)",
"keywords": "מילת מפתח1, מילת מפתח2",
"excerpt": "תקציר קצר של הכתבה...",
"content": "<h2>כותרת</h2><p>תוכן...</p>",
"category": "realestate",
"image": "https://images.unsplash.com/...",
"imageAlt": "תיאור תמונה בעברית",
"author": "צוות FinZone",
"slug": "article-slug-here",
"publishDate": "2026-06-08",
"published": true,
"createdAt": 1717000000000,
"updatedAt": 1717000000000
}
מחולל כתבות AI
הרעיון הכללי
במקום לכתוב כתבות ידנית, מזינים נושא ותוך 30-60 שניות מקבלים כתבה מלאה בעברית עם כל שדות SEO, תמונה מ-Unsplash, ועיצוב HTML מוכן לפרסום.
שני קריאות API — הפתרון לבעיית ה-JSON
הבעיה המרכזית: Claude מחזיר HTML ארוך עם שורות חדשות בתוך JSON — זה שובר את ה-JSON parsing לחלוטין.
קריאה אחת שמבקשת JSON עם שדה content של HTML — newlines בתוך ה-HTML שוברים את ה-JSON. json_decode מחזיר null.
שתי קריאות נפרדות: קריאה 1 לשדות META (JSON קצר ונקי), קריאה 2 לתוכן HTML בלבד (לא JSON). מחברים בצד שרת.
קריאה 1: META
// שדות: title, metaTitle, metaDescription,
// keywords, excerpt, slug, imageQuery, imageAlt, author
// דרישה: JSON נקי, כל ערך בשורה אחת (no newlines)
'messages' => [
['role' => 'user', 'content' => $promptMeta],
['role' => 'assistant', 'content' => '{'] // ← force JSON start
]
קריאה 2: CONTENT
// מחזיר HTML גולמי בלבד — לא JSON
// h2/h3/p/ul/li/strong
'messages' => [
['role' => 'user', 'content' => $promptContent]
]
// תוצאה: HTML ישיר, ללא עטיפת JSON
'{', Claude ממשיך את ה-JSON מאותה נקודה — כלומר מובטח שיתחיל ב-{. זה נקרא "prefill" או "assistant turn injection".
תיקוני SEO אוטומטיים בשרת
גם אם Claude מחזיר ערכים לא מדויקים — PHP מתקן אוטומטית:
// Meta Title: חייב 50-60 תווים
if ($mtLen > 60) $article['metaTitle'] = mb_substr($mt, 0, 57) . '...';
elseif ($mtLen < 50) $article['metaTitle'] = $mt . ' | ' . $kw;
// Meta Description: חייב 150-160 תווים
if ($mdLen > 160) $article['metaDescription'] = mb_substr($md, 0, 157) . '...';
elseif ($mdLen < 150) $article['metaDescription'] = $md . ' קרא עוד באתר FinZone.';
// כותרת: חייבת להכיל מילת מפתח ראשית
if (mb_stripos($article['title'], $kw) === false)
$article['title'] = $kw . ' — ' . $article['title'];
Unsplash — תמונה אוטומטית
לאחר קבלת ה-imageQuery מ-Claude (2-3 מילים באנגלית), מתבצעת קריאה ל-Unsplash API:
GET https://api.unsplash.com/photos/random
?query={imageQuery}
&orientation=landscape
&content_filter=high
Authorization: Client-ID {UNSPLASH_KEY}
מוחזרת תמונה אקראית רלוונטית מ-Unsplash (חינמית לשימוש מסחרי).
הגדרות המחולל
| פרמטר | ערכים | ברירת מחדל |
|---|---|---|
| topic | טקסט חופשי | — |
| category | realestate / ai / stocks / tech / business / family | realestate |
| length | short (500) / medium (800) / long (1200) | medium |
| style | professional / journalistic / educational / analytical | professional |
| links | קישורים להטמעה בכתבה (אופציונלי) | ריק |
SEO מלא — ציון 100/100
מה נבנה ברמת עמוד הבית
- Title Tag מותאם ל-60 תווים עם מילות מפתח ראשיות
- Meta Description 150-160 תווים עם CTA
- Meta Keywords — מילות מפתח בעברית
- Open Graph — og:title, og:description, og:image, og:type, og:locale
- Twitter Card — summary_large_image
- Canonical URL — נוצר דינמית לפי ה-hash
- lang="he" dir="rtl" — הצהרת שפה ל-Google
- robots: index, follow
- hreflang — לעברית ישראלית
Schema Markup — Structured Data
בנינו 3 סוגי Schema שמשפרים את הופעת האתר בגוגל:
| Schema Type | מיקום | תועלת |
|---|---|---|
WebSite | כל עמוד | מציג searchbox בגוגל |
Article | כל כתבה | Rich snippet — תמונה, כותרת, תאריך |
BreadcrumbList | כל כתבה | מציג breadcrumb בתוצאות גוגל |
// Article Schema — מתעדכן דינמית בכל כתבה
{
"@context": "https://schema.org",
"@type": "Article",
"headline": art.title,
"description": art.excerpt,
"image": art.image,
"author": {"@type": "Person", "name": art.author},
"publisher": {"@type": "Organization", "name": "FinZone"},
"datePublished": art.publishDate,
"keywords": art.keywords
}
עדכון SEO דינמי בכתבות
כל פתיחת כתבה מעדכנת את כל meta tags בזמן אמת:
function updateSEO(art) {
document.title = art.title + ' | FinZone';
sm('description', art.metaDescription);
sm('keywords', art.keywords);
sm('og:title', art.title);
sm('og:description', art.metaDescription);
sm('og:image', art.image);
sm('og:type', 'article');
sm('twitter:title', art.title);
// canonical URL
document.getElementById('canonical-link').href = window.location.href;
// Schema
ld({...articleSchema...}, 'ld-article');
ld({...breadcrumbSchema...}, 'ld-bc');
}
Google Search Console
הועלה קובץ google7eba1f7ec4ccff9c.html לשורש האתר. Google Search Console אימת את הבעלות.
ב-Search Console הוגש הכתובת: finzone.co.il/sitemap.php. גוגל מאנדקסת כתבות חדשות אוטומטית.
Sitemap דינמי
למה Sitemap דינמי?
Sitemap סטטי מיושן ברגע שמפרסמים כתבה חדשה. sitemap.php קורא ב-runtime את articles.json ובונה XML מעודכן עם כל הכתבות המפורסמות.
הלוגיקה
<?php
header('Content-Type: application/xml; charset=utf-8');
$articles = json_decode(file_get_contents('articles.json'), true);
$published = array_filter($articles, fn($a) => !empty($a['published']));
// עמוד הבית — priority 1.0
echo "<url>
<loc>https://finzone.co.il/</loc>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>";
// כל כתבה מפורסמת — priority 0.8
foreach ($published as $article) {
echo "<url>
<loc>https://finzone.co.il/#article/{$article['slug']}</loc>
<lastmod>{$article['date']}</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>";
}
?>
Priority לפי סוג עמוד
| עמוד | Priority | changefreq |
|---|---|---|
| עמוד הבית | 1.0 | daily |
| כתבות | 0.8 | weekly |
📊 Google Search Console: הוגש ואומת — גוגל סורקת אוטומטית כתבות חדשות.
APIs וכלים חיצוניים
סקירת כל ה-APIs
פרטי ה-API Keys
| שירות | מפתח / פרטים |
|---|---|
| Anthropic API Key | sk-ant-api03-XX7CI68FQ... (ב-ai-generate.php) |
| Unsplash API Key | VFjRr54hVIQCOk4YjCYOQ8Fz413y... |
| אחסון cPanel | cs43.box.co.il:2083 | user: finzone1 | pass: 4B*aoLgK87IDs9 |
| Admin Panel | FZ#2026@Secure!9k |
| WhatsApp עסקי | 0544498302 |
| אימייל | info@finzone.co.il / support@finzone.co.il |
קשיים שהיו ואיך התגברנו
בעיה 1: localStorage לא עבד לאורחים
כתבות שנשמרו ב-localStorage היו גלויות רק לדפדפן שיצר אותן (המנהל). אורחים שנכנסו לאתר ראו אתר ריק ללא כתבות.
מעבר לאחסון שרת: PHP כותב לקובץ articles.json. כל גולש מקבל את אותן כתבות כי הנתונים מגיעים מהשרת.
בעיה 2: JSON Parsing נשבר בגלל HTML
ביקשנו מ-Claude JSON עם שדה content שמכיל HTML ארוך. שורות חדשות (\n) בתוך ה-HTML שברו את ה-JSON — json_decode החזיר null.
פיצול לשתי קריאות API נפרדות: קריאה 1 ל-META (JSON קצר), קריאה 2 ל-CONTENT (HTML ישיר). אין יותר JSON parsing של HTML.
בעיה 3: .htaccess גרם לקריסת האתר
לאחר הוספת כלל ב-.htaccess לניתוב URL יפה, האתר נפל לחלוטין עם שגיאה 500. הייתה תקלה בתחביר הכלל.
ניקוי ה-.htaccess בחזרה לגרסה בסיסית דרך cPanel File Manager. לקח: כל שינוי ב-.htaccess דורש גיבוי לפני כן!
בעיה 4: Meta Title/Description לא בטווח
Claude לא תמיד עמד בדרישה של 50-60 תווים ל-Meta Title ו-150-160 ל-Meta Description. ציון SEO ירד.
הוספנו תיקון אוטומטי בשרת: PHP בודק ומתקן את האורך — קיצור עם "..." אם ארוך מדי, הוספת " | FinZone" אם קצר מדי.
בעיה 5: כותרת ללא מילת מפתח
לפעמים Claude כתב כותרת יפה אבל ללא מילת המפתח הראשית — SEO suffer.
PHP בודק אם מילת המפתח הראשונה (מהרשימה) מופיעה בכותרת. אם לא — מוסיף אותה בתחילת הכותרת.
בעיה 6: טעינת כתבות ב-admin לא עדכנית
לאחר שמירת כתבה חדשה, הרשימה לא התרעננה אוטומטית — הייתה צריכה רענון ידני.
לאחר שמירה מוצלחת — קריאת AJAX שמרעננת את הרשימה בלי רענון הדף כולו.
1. גבה את הקובץ ב-cPanel File Manager (Duplicate)
2. בדוק בגרסה dev לפני production
3. לעולם אל תדרוס articles.json
4. כל שינוי ב-.htaccess — גבה קודם!
אחסון, דומיין וניהול שרת
פרטי האחסון
| פריט | פרטים |
|---|---|
| ספק אחסון | box.co.il |
| שרת cPanel | cs43.box.co.il:2083 |
| שם משתמש | finzone1 |
| סיסמת cPanel | 4B*aoLgK87IDs9 |
| דומיין | finzone.co.il |
| תיקיית שורש | public_html/ |
| PHP Version | 8.x (cPanel) |
העלאת קבצים לשרת
cs43.box.co.il:2083 → שם משתמש + סיסמה
כל קבצי האתר נמצאים בתיקיית public_html/
גרור ושחרר קבצים. לחילופין — לחיצה על קובץ → Edit לעריכה ישירה בדפדפן.
לאחר כל העלאה — ודא שהקובץ articles.json עדיין קיים ולא נדרס.
הגדרות PHP שחשוב לדעת
// בראש ai-generate.php
@set_time_limit(180); // 3 דקות — מספיק לשתי קריאות API
// CURL הגדרות
CURLOPT_TIMEOUT => 120 // 2 דקות לקריאה
CURLOPT_CONNECTTIMEOUT => 30 // 30 שניות לחיבור
כיצד יוצרים כתבה חדשה במהירות
מסלול A: כתבה עם AI (30-60 שניות)
finzone.co.il/admin.php → הכנס סיסמה
בתפריט העליון של הפאנל
נושא: למשל "מדריך מס שבח 2026" / קטגוריה: נדל"ן / אורך: בינוני / סגנון: מקצועי
ממתינים ~30-60 שניות בזמן שה-AI כותב. מופיע spinner.
הכתבה נטענת לעורך. ניתן לשנות כותרת, תוכן, תמונה, ולהוסיף פרטים אישיים.
הכתבה עולה לאתר מיד. Sitemap מתעדכן אוטומטית.
מסלול B: כתבה ידנית
נפתח עורך ריק עם כל שדות SEO
ספירת תווים חיה עוזרת לעמוד בדרישות SEO. Meta Title: 50-60 | Meta Desc: 150-160
URL ישיר לתמונה מ-Unsplash או מקור אחר + ALT text בעברית
כפתור "שמור טיוטה" שומר ללא פרסום, "פרסם" מעלה לאוויר
לפני שמפרסמים כתבה, ודא:
✓ Meta Title: 50-60 תווים עם מילת המפתח הראשית
✓ Meta Description: 150-160 תווים עם CTA
✓ ALT text לתמונה בעברית
✓ כותרות H2/H3 עם מילות מפתח
✓ slug באנגלית, מקפים, ללא רווחים
מה הלאה — הרחבות מתוכננות
סטטוס פיצ'רים
הצעדים הבאים
ברגע שיתקבלו קישורי התשלום מ-Cardcom — נחבר את דף החנות לתשלום אמיתי.
הוספת tracking מעמיק — מה גולשים קוראים, מאיפה הגיעו, אחוז המרה לוואטסאפ.
אפשרות להוסיף תמונה מהמחשב, לבחור תמונה מתוצאות חיפוש, ולהוסיף כתבות קשורות אוטומטיות.
כל פיצ'ר חדש שנבנה ביחד — נוסיף פרק חדש לספר הפיתוח הזה.
כל פיצ'ר חדש שנבנה ביחד — נוסיף אותו כפרק חדש. כך יש לנו תמיד תיעוד עדכני של כל מה שבנינו, למה, ואיך.