מדריך זה מכסה הגירת Drupal באמצעות מודול Migrate. דמיינו את התרחיש הבא: אתם מגירים חנות מסחר אלקטרוני עם 80,000 מוצרים, היסטוריית הזמנות ופרופילי משתמשים מ-Drupal 7 ישן ל-Drupal 10. הקטגוריות עוברות מבנה מחדש, התמונות מאוחסנות בנתיבים לא סטנדרטיים, וטבלת התגובות מכילה 300,000 רשומות עם תגובות מקוננות בעומק של עד 10 רמות. ביצוע ידני של משימה זו ייקח חודשים, ושגיאות יהיו בלתי נמנעות. אנו משתמשים במסגרת ה-ETL המובנית של Drupal — מודול Migrate — אשר מחלץ, הופך וטוען נתונים. במשך חמש שנים, השלמנו למעלה מ-50 הגירות, תוך הבטחת שלמות נתונים (99.9%) ועמידה מלאה במבנה החדש. עם תצורה נכונה, Migrate מעבד 10,000 רשומות תוך 15–20 דקות, ומשיג למעלה מ-10,000 רשומות לשעה. עלות ההגירה הטיפוסית שלנו נעה בין $500 ל-$3000 בהתאם למורכבות. צרו קשר לבדיקת פרויקט ותכנית הגירה אופטימלית.
הארכיטקטורה של Migrate
המודול מורכב משלושה רכיבים לוגיים המוגדרים באמצעות קבצי YAML:
- מקור (Source) — מקור נתונים: CSV, SQL, JSON, Drupal 7 ישן, WordPress, כל API.
- עיבוד (Process) — טרנספורמציה: מיפוי שדות, המרת פורמטים, העשרה באמצעות תוספים.
- יעד (Destination) — לאן לכתוב: Node, Term, User, File, Config.
כל הגירה מוגדרת בקובץ config/install/migrate_plus.migration.*.yml. אנו משתמשים ב-Migrate Plus, Migrate Tools ובתוספי מקור נוספים. כל ההגירות יורשות מהמחלקה הבסיסית Migration.
| קריטריון | Migrate | ייבוא ידני |
|---|---|---|
| מהירות | שעות עבור 10,000 רשומות | ימים או שבועות |
| טרנספורמציות | תוספים מובנים | סקריפטים ידניים |
| טיפול בשגיאות | רישום לוג, המשך על כישלון | ללא בקרה |
| שימוש חוזר | תצורות YAML | התחלה מאפס בכל פעם |
Migrate מהיר בדרך כלל פי 10 מהעברה ידנית בהשוואת זמן פיתוח וביצוע.
כיצד להגדיר הגירה ב-Drupal?
התהליך כולל שישה שלבים:
- ניתוח נתוני המקור: מבנה, סוגים, קשרים, נפח. לדוגמה, קביעה שקטגוריות מאוחסנות בטבלה נפרדת ותמונות הן כתובות URL חיצוניות.
- תכנון הגירות: מיפוי שדות, בחירת תוספי מקור, הגדרת תלויות (לדוגמה, קטגוריות תחילה, ולאחר מכן מאמרים).
- יישום: כתיבת YAML, תוספים מותאמים אישית, בדיקה על מדגם של 10–20 רשומות.
- בדיקות: אימות שלמות, רגרסיה, תיקון שגיאות — הרצה על עותק מלא.
- ביצוע: ייבוא בשלבים עם ניטור, גלגול לאחור במידת הצורך.
- תמיכה: התאמות למקורות חדשים, עדכונים לאחר שחרורי Drupal.
אילו מקורות נתונים נתמכים?
על פי תיעוד Migrate של Drupal בdrupal.org, המודול תומך באופן טבעי ב-CSV, JSON, XML, מסדי נתונים של SQL דרך PDO, ובגרסאות Drupal ישנות יותר (6, 7). קיים תוסף מקור מוכן עבור WordPress, ותוספים מותאמים אישית משמשים עבור APIs שרירותיים. השיטות שלנו תואמות גם להגירת Drupal 8. הטבלה שלהלן מציגה אפשרויות פופולריות:
| מקור | תוסף | דוגמת שימוש |
|---|---|---|
| CSV | csv |
ייבוא מייצוא Excel |
| JSON | json |
REST API של שירות צד שלישי |
| WordPress | wordpress |
הגירת WordPress: הגירת בלוג מ-WP |
| Drupal 7 | d7_node |
שדרוג ל-Drupal 10 |
| API מותאם אישית | source מותאם אישית |
אינטגרציה עם CRM |
דוגמה: הגירה מ-CSV
לייבוא CSV ב-Drupal, השתמשו בתוסף ה-csv כפי שמוצג להלן.
הצגת תצורת הגירת CSV
---
id: articles_from_csv
label: 'Статьи из CSV'
migration_group: content_import
source:
plugin: csv
path: 'public://import/articles.csv'
ids:
- external_id
header_row_count: 1
column_names:
- external_id
- title
- body
- category
- publish_date
- image_url
process:
title: title
'body/value': body
'body/format':
plugin: default_value
default_value: full_html
created:
plugin: format_date
source: publish_date
from_format: 'd.m.Y'
to_format: 'U'
status:
plugin: default_value
default_value: 1
field_category:
plugin: migration_lookup
migration: categories_from_csv
source: category
field_image:
plugin: download
source:
- image_url
- '@filename'
destination:
plugin: 'public://images'
rename: true
destination:
plugin: 'entity:node'
default_bundle: article
migration_dependencies:
required:
- categories_from_csv
---פיתוח תוסף מקור מותאם אישית ל-Drupal הוא פשוט. דוגמה לתוסף מקור מותאם אישית עבור API:
<?php
// src/Plugin/migrate/source/ExternalApiSource.php
namespace Drupal\mymodule\Plugin\migrate\source;
use Drupal\migrate\Plugin\migrate\source\SourcePluginBase;
/**
* @MigrateSource(
* id = "external_api",
* source_module = "mymodule"
* )
*/
class ExternalApiSource extends SourcePluginBase {
public function getIds(): array {
return ['id' => ['type' => 'integer']];
}
public function fields(): array {
return [
'id' => 'ID записи',
'title' => 'Заголовок',
'content' => 'Содержимое',
'tags' => 'Теги (через запятую)',
];
}
protected function initializeIterator(): \Iterator {
$page = 0;
do {
$response = \Drupal::httpClient()->get(
'https://api.external.com/posts?page=' . $page,
['headers' => ['Authorization' => 'Bearer ' . $this->configuration['api_key']]]
);
$data = json_decode($response->getBody(), true);
$items = $data['items'];
foreach ($items as $item) {
yield $item;
}
$page++;
} while (!empty($items) && $page < $data['total_pages']);
}
} מניעת כפילויות בעת הרצה חוזרת של הגירה
השתמשו בסימן מים גבוה (highwater mark) או ב-id: articles_from_csv label: 'Статьи из CSV' migration_group: content_import source: plugin: csv path: 'public://import/articles.csv' ids: - external_id header_row_count: 1 column_names: - external_id - title - body - category - publish_date - image_url process: title: title 'body/value': body 'body/format': plugin: default_value default_value: full_html created: plugin: format_date source: publish_date from_format: 'd.m.Y' to_format: 'U' status: plugin: default_value default_value: 1 field_category: plugin: migration_lookup migration: categories_from_csv source: category field_image: plugin: download source: - image_url - '@filename' destination: plugin: 'public://images' rename: true destination: plugin: 'entity:node' default_bundle: article migration_dependencies: required: - categories_from_csv בתצורת המקור. כך רק רשומות חדשות או שונות יוגרו. זה שימושי במיוחד להגירה מצטברת לאחר הייבוא הראשוני. דוגמת תצורה:
highwaterProperty: name: updated_at alias: u הגירת קבצי מדיה וייבוא מצטבר
הגירת קבצי מדיה כוללת תמונות וקבצים המוגרים בקובץ YAML נפרד, ולאחר מכן מקושרים לישויות דרך <?php // src/Plugin/migrate/source/ExternalApiSource.php namespace Drupal\mymodule\Plugin\migrate\source; use Drupal\migrate\Plugin\migrate\source\SourcePluginBase; /** * @MigrateSource( * id = "external_api", * source_module = "mymodule" * ) */ class ExternalApiSource extends SourcePluginBase { public function getIds(): array { return ['id' => ['type' => 'integer']]; } public function fields(): array { return [ 'id' => 'ID записи', 'title' => 'Заголовок', 'content' => 'Содержимое', 'tags' => 'Теги (через запятую)', ]; } protected function initializeIterator(): \Iterator { $page = 0; do { $response = \Drupal::httpClient()->get( 'https://api.external.com/posts?page=' . $page, ['headers' => ['Authorization' => 'Bearer ' . $this->configuration['api_key']]] ); $data = json_decode($response->getBody(), true); $items = $data['items']; foreach ($items as $item) { yield $item; } $page++; } while (!empty($items) && $page < $data['total_pages']); } } . דוגמת הגירת קבצים:
---
id: files_migration
source:
plugin: csv
path: 'public://import/files.csv'
process:
filename:
plugin: callback
callable: basename
source: file_url
uri:
plugin: download
source:
- file_url
- '@filename'
destination:
plugin: 'public://migrated'
destination:
plugin: 'entity:file'
בהגירת הצומת, השדה track_changes: true משתמש ב-highwaterProperty: name: updated_at alias: u כדי להפנות לקובץ שהועלה.
מה כלול בשירותי הגירת התוכן שלנו?
תוצרים: כחלק מפתרון מפתח, אנו מספקים:
- תיעוד מבנה ההגירה
- גישה למאגר עם התצורה
- אופטימיזציית ביצועים: גודל אצווה, סימן מים גבוה, עיבוד מקבילי
- הכשרה למפתחים שלכם על שימוש ב-Migrate
- חודש תמיכה לאחר ההשקה
- אחריות להפעלה רציפה של האתר במהלך ההגירה
- עלות: $500 - $3000 בהתאם למורכבות
לוח זמנים
הגירה פשוטה מ-CSV (500–5000 רשומות) — 2–3 ימים. הגירה מורכבת ממספר מקורות עם תוספים וטרנספורמציות מותאמים אישית — 1–2 שבועות. לוח הזמנים המדויק נקבע במהלך בדיקה.
מדוע הגירה עם Migrate עדיפה על העברה ידנית?
הגירה באמצעות Migrate אינה רק עניין של מהירות אלא גם של הבטחת שלמות. אנו משתמשים בשיטות מומלצות: סימן מים גבוה, migration_lookup, id: files_migration source: plugin: csv path: 'public://import/files.csv' process: filename: plugin: callback callable: basename source: file_url uri: plugin: download source: - file_url - '@filename' destination: plugin: 'public://migrated' destination: plugin: 'entity:file' . המהנדסים שלנו מחזיקים בהסמכות Drupal ויש להם ניסיון עם פרויקטים העולים על 500,000 רשומות תוכן. צרו קשר כדי לדון במשימה שלכם. קבלו ייעוץ הגירה.







