10.1 יסודות SEO פתרון
פתרון - יסודות SEO - SEO Fundamentals¶
פתרון תרגיל 1¶
בעיות ה-SEO שזוהו:
- אין
langו-dirב-<html>- מנוע החיפוש לא יודע באיזו שפה הדף - הכותרת (title) גנרית מדי - "דף מוצר" לא אומר כלום
- אין
meta description - אין
meta viewport- לא responsive - אין
meta charset - שימוש ב-
<div>במקום תגיות סמנטיות (header, main, h1, button) - תמונה ללא
alttext - תיאור המוצר מכיל keyword stuffing
- אין canonical URL
- אין
<h1>- שימוש ב-div עם class במקום
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>אוזניות אלחוטיות Sony WH-1000XM5 | החנות שלנו - ₪1,299</title>
<meta
name="description"
content="אוזניות אלחוטיות Sony WH-1000XM5 עם ביטול רעשים מתקדם. איכות שמע יוצאת דופן, סוללה ל-30 שעות. משלוח חינם."
/>
<link rel="canonical" href="https://store.com/products/sony-wh-1000xm5" />
</head>
<body>
<header>
<a href="/" aria-label="דף הבית">
<img src="logo.png" alt="החנות שלנו - לוגו" />
</a>
</header>
<main>
<article>
<h1>אוזניות אלחוטיות Sony WH-1000XM5</h1>
<img
src="headphones.jpg"
alt="אוזניות Sony WH-1000XM5 בצבע שחור עם ביטול רעשים"
width="600"
height="400"
/>
<p class="price">
<strong>₪1,299</strong>
</p>
<section>
<h2>תיאור המוצר</h2>
<p>
אוזניות אלחוטיות מדגם Sony WH-1000XM5 עם טכנולוגיית ביטול רעשים
מתקדמת. מציעות איכות שמע יוצאת דופן עם דרייברים חדשים בגודל 30 מ"מ,
סוללה שמחזיקה עד 30 שעות, וחיבור Bluetooth 5.2 יציב.
</p>
</section>
<button onclick="addToCart()">הוסף לסל</button>
</article>
</main>
</body>
</html>
פתרון תרגיל 2¶
// app/about/page.tsx
import { Metadata } from 'next';
export const metadata: Metadata = {
title: 'אודות | DevStudio - חברת פיתוח תוכנה',
description:
'DevStudio היא חברת פיתוח תוכנה המתמחה בבניית אפליקציות ווב מודרניות. למדו עלינו, הצוות שלנו, והפרויקטים שביצענו.',
robots: {
index: true,
follow: true,
},
alternates: {
canonical: 'https://devstudio.co.il/about',
},
openGraph: {
title: 'אודות DevStudio',
description: 'חברת פיתוח תוכנה המתמחה באפליקציות ווב מודרניות',
locale: 'he_IL',
type: 'website',
},
};
export default function AboutPage() {
return (
<main>
<h1>אודות DevStudio</h1>
<section>
<h2>מי אנחנו</h2>
<p>
DevStudio היא חברת פיתוח תוכנה שנוסדה ב-2020. אנחנו מתמחים
בבניית אפליקציות ווב מודרניות עם React, Next.js ו-Node.js.
</p>
</section>
<section>
<h2>הצוות שלנו</h2>
<p>צוות של 15 מפתחים מנוסים עם ניסיון בפרויקטים מגוונים.</p>
</section>
</main>
);
}
- ה-layout הראשי של האפליקציה צריך לכלול
lang="he"ו-dir="rtl":
// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="he" dir="rtl">
<body>{children}</body>
</html>
);
}
פתרון תרגיל 3¶
קובץ robots.txt:
# רובוטים של מנועי חיפוש
User-agent: *
Allow: /articles/
Allow: /categories/
Disallow: /premium/
Disallow: /admin/
Disallow: /api/
Disallow: /search
# Sitemap
Sitemap: https://news-site.com/sitemap.xml
יצירת sitemap דינמי ב-Next.js:
// app/sitemap.ts
import { MetadataRoute } from 'next';
interface Article {
slug: string;
updatedAt: string;
}
async function fetchPublicArticles(): Promise<Article[]> {
const res = await fetch('https://news-site.com/api/articles?status=published', {
next: { revalidate: 3600 }, // רענון כל שעה
});
return res.json();
}
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const articles = await fetchPublicArticles();
const articleEntries = articles.map((article) => ({
url: `https://news-site.com/articles/${article.slug}`,
lastModified: new Date(article.updatedAt),
changeFrequency: 'daily' as const,
priority: 0.8,
}));
const staticPages = [
{
url: 'https://news-site.com',
lastModified: new Date(),
changeFrequency: 'hourly' as const,
priority: 1.0,
},
{
url: 'https://news-site.com/categories',
lastModified: new Date(),
changeFrequency: 'weekly' as const,
priority: 0.7,
},
{
url: 'https://news-site.com/about',
lastModified: new Date(),
changeFrequency: 'monthly' as const,
priority: 0.3,
},
];
return [...staticPages, ...articleEntries];
}
פתרון תרגיל 4¶
// app/products/page.tsx
import Image from 'next/image';
import { Metadata } from 'next';
export const metadata: Metadata = {
title: 'המוצרים שלנו | החנות',
description: 'גלו את מגוון המוצרים שלנו. מחירים משתלמים ומשלוח מהיר לכל הארץ.',
openGraph: {
title: 'המוצרים שלנו',
description: 'מגוון מוצרים במחירים משתלמים',
type: 'website',
},
};
interface Product {
id: number;
name: string;
description: string;
price: number;
image: string;
}
async function getProducts(): Promise<Product[]> {
const res = await fetch('https://api.store.com/products', {
next: { revalidate: 60 }, // רענון כל דקה
});
if (!res.ok) {
throw new Error('Failed to fetch products');
}
return res.json();
}
export default async function ProductsPage() {
const products = await getProducts();
return (
<main>
<h1>המוצרים שלנו</h1>
<section aria-label="רשימת מוצרים">
<ul style={{ listStyle: 'none', padding: 0 }}>
{products.map((product) => (
<li key={product.id}>
<article>
<h2>{product.name}</h2>
<Image
src={product.image}
alt={product.name}
width={400}
height={300}
loading="lazy"
/>
<p>{product.description}</p>
<p>
<strong>{product.price} ₪</strong>
</p>
</article>
</li>
))}
</ul>
</section>
</main>
);
}
הסבר השינויים:
- הקוד הפך מ-Client Component ל-Server Component - ה-HTML נוצר בשרת עם כל התוכן
- אין צורך ב-useState ו-useEffect - הנתונים נטענים ישירות בשרת
- נוספה מטא-דאטה סטטית עם title ו-description
- תמונות משתמשות ב-next/image עם lazy loading אוטומטי ואופטימיזציה
- מבנה HTML סמנטי: main, section, article, ul, li
- נוסף aria-label ל-section
פתרון תרגיל 5¶
מאמר 1: מדריך TypeScript
- כותרת: מדריך TypeScript למתחילים - כל מה שצריך לדעת ב-2026
- תיאור: למדו TypeScript מאפס. מדריך מקיף שמכסה טיפוסים, ממשקים, generics ועוד עם דוגמאות קוד מעשיות.
- מילת מפתח ראשית: מדריך TypeScript למתחילים
- מילות מפתח משניות: TypeScript טיפוסים, ללמוד TypeScript, TypeScript לעומת JavaScript
- מבנה:
- H1: מדריך TypeScript למתחילים - כל מה שצריך לדעת
- H2: מה זה TypeScript ולמה כדאי ללמוד
- H2: התקנה והגדרה ראשונית
- H2: טיפוסים בסיסיים ב-TypeScript
- H3: טיפוסים פרימיטיביים
- H3: מערכים וטאפלים
- H2: ממשקים - Interfaces
- H2: גנריקס - Generics
- H2: סיכום ושלבים הבאים
מאמר 2: השוואת React ו-Vue
- כותרת: השוואה בין React ל-Vue ב-2026 - איזה פריימוורק לבחור
- תיאור: השוואה מקיפה בין React ל-Vue.js. ביצועים, קהילה, עקומת למידה ומתי לבחור כל אחד. מדריך עדכני ל-2026.
- מילת מפתח ראשית: React לעומת Vue
- מילות מפתח משניות: השוואה בין React ל-Vue, איזה פריימוורק לבחור, React או Vue 2026
- מבנה:
- H1: השוואה בין React ל-Vue ב-2026
- H2: סקירה קצרה של כל פריימוורק
- H2: תחביר ועקומת למידה
- H2: ביצועים
- H2: אקוסיסטם וקהילה
- H2: מתי לבחור React ומתי Vue
- H2: סיכום
מאמר 3: בניית REST API
- כותרת: בניית REST API עם Node.js ו-Express - מדריך מעשי
- תיאור: למדו לבנות REST API מאפס עם Node.js ו-Express. כולל ראוטינג, middleware, חיבור למסד נתונים וטיפול בשגיאות.
- מילת מפתח ראשית: בניית REST API עם Node.js
- מילות מפתח משניות: Express.js מדריך, Node.js API, REST API בעברית
- מבנה:
- H1: בניית REST API עם Node.js ו-Express
- H2: מה זה REST API
- H2: הקמת פרויקט Express
- H2: הגדרת Routes
- H3: GET, POST, PUT, DELETE
- H2: חיבור למסד נתונים
- H2: טיפול בשגיאות
- H2: סיכום
מאמר 4: מדריך Docker
- כותרת: מה זה Docker ולמה כדאי להשתמש בו - מדריך למתחילים
- תיאור: הכירו את Docker מאפס. למדו מה זה קונטיינרים, Dockerfile, Docker Compose ואיך להשתמש ב-Docker בפרויקטים שלכם.
- מילת מפתח ראשית: מה זה Docker
- מילות מפתח משניות: Docker למתחילים, Docker Compose מדריך, קונטיינרים
- מבנה:
- H1: מה זה Docker ולמה כדאי להשתמש בו
- H2: הבעיה ש-Docker פותר
- H2: מושגים בסיסיים
- H3: תמונות - Images
- H3: קונטיינרים - Containers
- H2: כתיבת Dockerfile ראשון
- H2: עבודה עם Docker Compose
- H2: סיכום
מאמר 5: אבטחת אפליקציות ווב
- כותרת: אבטחת אפליקציות ווב - המדריך המלא למפתחים
- תיאור: למדו להגן על אפליקציות הווב שלכם. XSS, CSRF, SQL Injection, אימות והרשאות. מדריך מקיף עם דוגמאות קוד.
- מילת מפתח ראשית: אבטחת אפליקציות ווב
- מילות מפתח משניות: XSS הגנה, CSRF מניעה, אבטחת מידע באינטרנט
- מבנה:
- H1: אבטחת אפליקציות ווב - המדריך המלא
- H2: למה אבטחה חשובה
- H2: התקפות XSS ואיך למנוע
- H2: הגנה מפני CSRF
- H2: מניעת SQL Injection
- H2: אימות והרשאות
- H3: JWT
- H3: OAuth
- H2: סיכום ורשימת בדיקות
פתרון תרגיל 6¶
בעיה 1: אין meta tags - עדיפות גבוהה
- פגיעה: מנועי חיפוש לא יודעים מה התוכן של הדף, לא יכולים להציג תיאור בתוצאות
- פתרון: להוסיף title ו-description ייחודיים לכל דף
// ב-React עם react-helmet-async
import { Helmet } from 'react-helmet-async';
function ProjectPage({ project }) {
return (
<>
<Helmet>
<title>{project.name} | הפורטפוליו של דני</title>
<meta name="description" content={project.summary} />
</Helmet>
{/* תוכן */}
</>
);
}
בעיה 2: כותרת זהה לכל הדפים - עדיפות גבוהה
- פגיעה: Google רואה את כל הדפים כתוכן כפול ולא יכול להבחין ביניהם
- פתרון: כותרות ייחודיות ותיאוריות לכל דף (כמו בפתרון למעלה)
בעיה 3: תמונות ללא alt - עדיפות בינונית
- פגיעה: מנועי חיפוש לא מבינים את תוכן התמונות, פוגע בנגישות וב-image search
- פתרון: להוסיף alt טקסט תיאורי לכל תמונה
בעיה 4: אין sitemap.xml - עדיפות בינונית
- פגיעה: מנועי חיפוש עלולים לפספס דפים באתר
- פתרון: ליצור sitemap.xml עם כל ה-URL-ים של האתר ולהגיש ל-Search Console
בעיה 5: אין robots.txt - עדיפות נמוכה
- פגיעה: אין הכוונה למנועי חיפוש, אין קישור ל-sitemap
- פתרון: ליצור robots.txt שמאפשר סריקה ומקשר ל-sitemap
בעיה 6: URL-ים עם hash - עדיפות גבוהה
- פגיעה: Google מתעלם מ-hash fragments, כל הדפים נראים כמו אותו URL
- פתרון: לעבור ל-React Router עם BrowserRouter (history API) או למעבר ל-Next.js
// במקום HashRouter
import { BrowserRouter } from 'react-router-dom';
// URL ישתנה מ-/#/projects/1 ל-/projects/1
בעיה 7: זמן טעינה של 8 שניות - עדיפות גבוהה
- פגיעה: מהירות היא גורם דירוג, משתמשים נוטשים אתרים איטיים
- פתרון: אופטימיזציה של תמונות, code splitting, דחיסת קבצים, CDN
בעיה 8: לא responsive - עדיפות גבוהה
- פגיעה: Google משתמש ב-mobile-first indexing, אתר לא responsive יקבל דירוג נמוך
- פתרון: להוסיף viewport meta tag ולעצב עם media queries / CSS Grid / Flexbox
סדר עדיפויות מומלץ לתיקון:
1. (גבוהה) לעבור מ-hash routing ל-browser routing
2. (גבוהה) להוסיף meta tags ייחודיים לכל דף
3. (גבוהה) להפוך ל-responsive
4. (גבוהה) לשפר זמן טעינה
5. (בינונית) להוסיף alt לתמונות
6. (בינונית) ליצור sitemap.xml
7. (נמוכה) ליצור robots.txt
תשובות לשאלות¶
1. שלושת השלבים של מנוע חיפוש:
- סריקה (Crawling) - בוטים סורקים את האינטרנט ומגלים דפים חדשים על ידי מעקב אחר קישורים
- אינדוקס (Indexing) - תוכן הדף מנותח ונשמר במסד נתונים של מנוע החיפוש
- דירוג (Ranking) - כשמשתמש מחפש, האלגוריתם מחזיר תוצאות מדורגות לפי רלוונטיות ואיכות
2. ההבדל בין On-Page SEO ל-Technical SEO:
- On-Page SEO עוסק בתוכן ובמבנה הדף: כותרות H1-H6, meta description, איכות התוכן, מילות מפתח
- Technical SEO עוסק בהיבטים הטכניים: מהירות טעינה, HTTPS, מבנה URL, sitemap, mobile-friendliness
3. בעיית SPA ו-SEO:
- ב-SPA, ה-HTML שנשלח לבוט הוא ריק - רק div ריק וקובץ JavaScript. הבוט צריך להריץ JS כדי לראות תוכן, מה שלא תמיד קורה בצורה תקינה. ב-SSR, ה-HTML נוצר בשרת ונשלח מלא עם כל התוכן והמטא-תגיות, כך שהבוט רואה הכל מיד.
4. Keyword stuffing:
- דחיסת מילות מפתח היא חזרה מוגזמת ולא טבעית על אותן מילות מפתח בטקסט. Google מזהה את זה ומוריד דירוג כי זה פוגע בחווית המשתמש ומסמן תוכן לא איכותי.
5. שלושה דברים לבדוק ב-Search Console לאחר השקה:
- בדיקת כיסוי אינדקס - לוודא שדפים חשובים עברו אינדוקס ואין שגיאות סריקה
- שליחת sitemap - להגיש את ה-sitemap ולוודא שהתקבל ללא שגיאות
- בדיקת Core Web Vitals - לוודא שהביצועים תקינים ואין בעיות חווית משתמש