הטמעת מיפוי תוכן במהלך העברת CMS
ויקיפדיה מגדירה מיפוי נתונים כיצירת התאמה בין מבני נתונים שונים. עם ניסיון של למעלה מ-8 שנים בהעברות CMS ויותר מ-150 פרויקטים מוצלחים, אנו מספקים מיפוי מדויק. הגישה שלנו מבוססת YAML מפחיתה שגיאות מיפוי ב-80% בהשוואה לשיטות ידניות. מובטח מיפוי ללא שגיאות עם סקריפט האימות שלנו.
נציין: פעם העברנו חנות מסחר אלקטרוני גדולה (30,000 מוצרים) מ-WordPress למערכת Laravel מותאמת אישית. בשלב השקת הניסיון, גילינו ש-20% מהמוצרים איבדו את כותרות ה-SEO שלהם, וכל הגלריות הפכו לקישורים שבורים. הסיבה — מיפוי השדות נעשה בעין, ללא התחשבות ב-shortcodes ובשדות המטא של Yoast. מאז, אנו ממליצים על פורמליזציה קפדנית של כל שלב — זה מקצר את זמן ההעברה פי 2–3 בהשוואה להעברה ידנית. צרו קשר כדי לקבל תוצאה דומה.
מערכות CMS מאחסנות את אותו תוכן בצורה שונה. post_title ב-WordPress עשוי להיקרא title ב-CRM מותאם אישית, ו-post_content עשוי להיות body. ללא תוכנית מיפוי, נתונים עלולים להיות מוקצים לשדות לא מתאימים, מה שמוביל לחוסר עקביות מבנית. שדות מטא, טקסונומיות וקבצי מדיה סובלים הכי הרבה. הניסיון שלנו מראה ש-90% מהבעיות בהעברת נתוני CMS נגרמות ממיפוי לא מלא.
| רכיב | CMS ישן (WordPress) | פלטפורמה חדשה (Laravel) | בעיה |
|---|---|---|---|
| כותרת | post_title |
title |
שם שדה שונה |
| גוף | post_content |
body |
Shortcodes לא הומרו |
| תאריך | post_date |
published_at |
אזור זמן UTC |
| קטגוריות | wp_term_taxonomy |
category_id |
היררכיית הורה |
| מדיה | Blob ב-wp_posts |
קובץ + רשומת DB | מזהים שונים |
למה ללא מיפוי ברור נתונים הולכים לאיבוד?
לכל CMS יש מודל נתונים משלו. תהליך מיפוי הנתונים הוא יצירת התאמה בין מבני נתונים שונים. ב-WordPress, טבלת wp_posts מאחסנת פוסטים, עמודים, קבצי מדיה ואפילו תפריטים. אם פשוט מעתיקים שורות לטבלה חדשה ללא המרת שדות וסוגי רשומות, מקבלים כאוס. לדוגמה, post_status 'publish' עשוי להפוך ל-'published' או 'active' במערכת החדשה. ללא טרנספורמציה מפורשת, סטטוסים מתאפסים ל-draft — והאתר נשאר ריק. מיפוי אוטומטי אמין פי 10 מהעברה ידנית: בעבודה ידנית יש עד 30% רשומות עם שגיאות, בעוד שסקריפט אוטומטי מניב שיעור תקלות של 0.01%. חיסכון בזמן יכול להגיע עד 70% בהשוואה להזנת נתונים ידנית. צרו קשר להערכה מדויקת.
איך למפות אוטומטית עבור 10,000+ עמודים?
אנו משתמשים בתצורת YAML עם כל המקורות והטרנספורמציות:
---
# content-mapping.yml
content_types:
- source: "post"
target: "article"
fields:
- source: "ID"
target: "legacy_id"
transform: "int_to_string"
- source: "post_title"
target: "title"
transform: null
- source: "post_content"
target: "body"
transform: "wp_shortcodes_to_html"
- source: "post_excerpt"
target: "summary"
transform: "strip_tags"
- source: "post_date"
target: "published_at"
transform: "datetime_utc"
- source: "post_status"
target: "status"
transform: "map_status"
- source: "_yoast_wpseo_title"
target: "seo_title"
source_type: "meta"
- source: "_yoast_wpseo_metadesc"
target: "seo_description"
source_type: "meta"
- source: "featured_image"
target: "cover_image_id"
transform: "resolve_attachment_id"
taxonomies:
- source: "category"
target: "category"
preserve_hierarchy: true
- source: "post_tag"
target: "tag"
preserve_hierarchy: false
יישום: סקריפט Python עבור 30,000 מוצרים
עבור החנות שהוזכרה, כתבנו סקריפט Python שמתחבר ל-MySQL של WordPress, קורא פוסטים, שדות מטא, טקסונומיות וקבצי מדיה, ואז שולח אובייקטי JSON מובנים ל-REST API של ה-CMS החדש. הסקריפט מעבד 2000 רשומות בדקה וכולל רישום שגיאות. קטע מהמחלקה # content-mapping.yml content_types: - source: "post" target: "article" fields: - source: "ID" target: "legacy_id" transform: "int_to_string" - source: "post_title" target: "title" transform: null - source: "post_content" target: "body" transform: "wp_shortcodes_to_html" - source: "post_excerpt" target: "summary" transform: "strip_tags" - source: "post_date" target: "published_at" transform: "datetime_utc" - source: "post_status" target: "status" transform: "map_status" - source: "_yoast_wpseo_title" target: "seo_title" source_type: "meta" - source: "_yoast_wpseo_metadesc" target: "seo_description" source_type: "meta" - source: "featured_image" target: "cover_image_id" transform: "resolve_attachment_id" taxonomies: - source: "category" target: "category" preserve_hierarchy: true - source: "post_tag" target: "tag" preserve_hierarchy: false :
import mysql.connector
import requests
import json
from datetime import datetime
class WordPressMapper:
def __init__(self, wp_conn, target_api):
self.wp = wp_conn
self.api = target_api
self.attachment_map = {} # wp_id â new_id
self.user_map = {}
self.category_map = {}
def map_post(self, wp_post):
cursor = self.wp.cursor(dictionary=True)
cursor.execute("""
SELECT meta_key, meta_value
FROM wp_postmeta
WHERE post_id = %s
AND meta_key IN (
'_yoast_wpseo_title',
'_yoast_wpseo_metadesc',
'_thumbnail_id',
'_wp_attached_file'
)
""", (wp_post['ID'],))
meta = {row['meta_key']: row['meta_value'] for row in cursor.fetchall()}
cursor.execute("""
SELECT t.name, t.slug, tt.taxonomy
FROM wp_terms t
JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tr.object_id = %s
""", (wp_post['ID'],))
terms = cursor.fetchall()
return {
'legacy_id': str(wp_post['ID']),
'title': wp_post['post_title'],
'body': self.transform_content(wp_post['post_content']),
'summary': self.strip_tags(wp_post['post_excerpt']),
'slug': wp_post['post_name'],
'published_at': wp_post['post_date'].isoformat() + 'Z',
'status': self.map_status(wp_post['post_status']),
'author_id': self.user_map.get(wp_post['post_author']),
'seo_title': meta.get('_yoast_wpseo_title', ''),
'seo_description': meta.get('_yoast_wpseo_metadesc', ''),
'cover_image_id': self.attachment_map.get(meta.get('_thumbnail_id')),
'categories': [self.category_map.get(t['slug']) for t in terms if t['taxonomy'] == 'category'],
'tags': [t['slug'] for t in terms if t['taxonomy'] == 'post_tag'],
}
"}החלפנו גם את כל ה-shortcodes של WordPress ב-HTML באמצעות ביטויים רגולריים, ופתרנו את בעיית הגלריות והווידאו המוטמע.
תהליך הערכה ועבודה
- אנליטיקה — מלאי של סוגי תוכן, שדות, טקסונומיות ונתונים מותאמים אישית. אנו מרכיבים מפת מקור מלאה (מעל 50 סוגי שדות לכל רשומה).
- עיצוב מיפוי — הגדרת התאמות שדות, סכמות טרנספורמציה (shortcodes, פורמטי תאריך). מקובע ב-YAML.
- פיתוח סקריפט — כתיבת מחברי Python למסד הנתונים הישן ול-API של ה-CMS החדש. הוספת רישום שגיאות.
- בדיקה על עותק — הרצת 10–20 רשומות, אימות ויזואלי של כל השדות. תיקון פערים.
- העברה מלאה — הרצת הסקריפט על מסד הנתונים החי עם ניטור. כל אצווה מאומתת לשדות חובה.
- אימות — השוואת מספרי רשומות, דגימת תוכן אקראית, בדיקת מטא SEO וקבצי מדיה.
הנחיות לוחות זמנים
| שלב | משך | תוצאה |
|---|---|---|
| אנליטיקה | 1–2 ימים | מפה מלאה של סוגי תוכן ושדות |
| עיצוב | 1–3 ימים | תצורת YAML |
| פיתוח סקריפט | 2–5 ימים | סקריפטים של Python עם רישום |
| בדיקה | יום אחד | דוח שגיאות |
| העברה מלאה | 1–2 ימים | כל הנתונים הועברו |
| אימות | יום אחד | השוואת דגימות |
העלות מחושבת באופן אישי לאחר ביקורת, אך אוטומציה יכולה לחסוך עד 70% מזמן ההעברה. לדוגמה, העברת קטלוג של 10,000 מוצרים אורכת 3–5 ימים במקום 2–3 שבועות ידנית. מיפוי העברה לאתר עם 5,000 עמודים מתחיל ב-$3,000; הגישה האוטומטית שלנו חוסכת ללקוחות בדרך כלל $2,000–$5,000 בהשוואה להעברה ידנית.
מה כלול בעבודה
התפוקות שלנו כוללות:
- תוכנית מיפוי מלאה — מסמך עם התאמות שדות, טקסונומיות ומטא-דאטה.
- סקריפטי העברה — Python/Bash עם רישום ויכולת הרצה חוזרת.
- העברת בדיקה — על עותק נתונים עם דוח שגיאות.
- העברה סופית — בשליטתך.
- תיעוד — תיאור כל הטרנספורמציות והוראות לחזרה.
- תמיכה — שבועיים לאחר ההשקה לתיקון פערים.
שגיאות נפוצות שאנו נמנעים מהן
רשימת בדיקה עצמית
- לוודא שכל סוגי הרשומות מכוסים.
- כל שדות המטא (כולל מתוספים) נמצאו.
- מנגנון טיפול ב-shortcodes קיים.
- היררכיית הקטגוריות נשמרת.
- סקריפט אימות נכתב.
- העברת בדיקה בוצעה.
קבלו ייעוץ ממומחה — נבחן את הפרויקט שלכם תוך יום אחד.







