یکی از کارهای طاقتفرسایی که وقتم رو برای مدت زیادی گرفت، مهاجرت کردن از تارنمای مبتنی بر SPIP بود. سادهترین دلیل آن این است که اسپیپ توسط یک تیم فرانسوی نوشته شده است و با تاکید زیاد فرانسویها بر زبانشان به سختی میتوان جوابی برای پرسشها متعدد پیدا کرد. اینها را به عنوان کسی مینویسم که در سال ۱۳۸۵ عضو تیم توسعهی اسپیپ در ایران بودم و پروژهی «شهروند خبرنگاری» را با استفاده از اسپیپ در ایران در دستور کار داشتیم.
چندی پیش تارنمایی مبتنی بر اسپیپ با چند-ده-هزار مقاله را به وردپرس منتقل کردم. انتقال نوشتهها سخت نیست به ویژه اگر کسی منطق پایگاه دادهی اسپیپ به عنوان پایگاه دادهی مبدا و وردپرس، جوملا، دروپال یا … را به عنوان پایگاه دادهی مقصد به درستی درک کند. مشکل بزرگ من در آن پروژه این بود که چه طور نوشتهها را نمایش بدهم که هیچ خطای ۴۰۴ دریافت نکنم. اگر این مسئله برای شما مشکلی ایجاد نمیکند میتوانید از یکی از افزونههای وردپرس برای انتقال دادهها کمک بگیرید.
مسئله ساده است: وقتی هستهی یک تارنما (اینجا اسپیپ) به هستهای دیگر تغییر پیدا میکند (اینجا وردپرس) شکل نمایش دادهها در خروجی نیز تغییر میکند. برای مثال پیوند زیر، خروجی است از یک نوشته در اسپیپ بدون فعال بودن SEF برای پیوندها. در این پیوند ۱۱۰ شناسهی مقاله است.
http://www.site.com/spip.php?article110
و پیوندهای زیر میتوانند مربوط به صفحه (Page) یا نوشتهای (Post) در وردپرس باشند که شناسهی آن ۱۱۰ است. دقت کنید که در وردپرس شناسههای نوشته و صفحه از یک ترتیب استفاده میکنند و از نظر ساختاری در پایگاه دادهها تفاوتی بین آنها وجود ندارد.
http://www.site.com/?page_id=110 http://www.site.com/?p=110
پس متوجه شدیم که برای ایجاد ارتباط بین نوشتههای اسپیپ و وردپرس بهتر است که ربط بین شناسهی نوشتهها در هر دو پایگاه دادهها حفظ شود. پیش از ادامهی بحث در مورد ساختار پیوند و شیوهی حل آن به مسئلهی انتقال نوشتهها بپردازیم.
برای این کار لازم است که ستونهای یکسان در هر دو پایگاه دادهها را پیدا کنیم و موقع انتقال دادهها، ستونهای نظیر را مشخص کنیم و دادهها را از ستون نظیر در پایگاه دادهی مبدا به ستون نظیر در پایگاه دادهی مقصد منتقل کنیم.
جدول زیر ارتباط جدولها و فیلدهای هر جدول در پایگاه دادهی اسپیپ و وردپرس نشان میدهد:
WordPress | SPIP | توضیح | ||
Table | Field | Table | Field | |
wp_terms | term_id | spip_rubriques | id_rubrique | شناسهی بخش |
name | titre | عنوان بخش | ||
wp_posts | ID | spip_articles | id_article | شناسهی نوشته |
post_title | titre | عنوان نوشته | ||
-N/A- | surtitre | این مقاله را بخوانید | ||
-N/A- | soustitre | این مقاله را بخوانید | ||
post_content | texte | محتوای نوشته | ||
post_date | date | تاریخ نوشته | ||
post_type | -N/A- | باید بین دو حالت post یا page باشد | ||
wp_users | ID | spip_auteurs | id_auteur | شناسهی کاربر |
user_email | رایانامهی کاربر | |||
user_login | login | آخرین ورود کاربر | ||
user_pass | pass | رمز کاربر | ||
wp_posts | post_author | spip_auteurs_articles | post_author | نویسندهی هر نوشته |
wp_term_relationships | term_taxonomy_id | spip_articles | id_rubrique | باید object_id که شناسهی نوشته یا دسته یا غیره است را به term_taxonomy_id وصل کرد |
wp_term_taxonomy | parent | spip_rubriques | id_parent | بخش بالا-دستی |
حالا باید دنبال راه حلی باشیم که بتوان دادهها را به این ترتیب وارد کرد. برای این کار من از پایگاه دادهی اسپیپ چهار جدول spip_rubriques و spip_articles و spip_auteurs_articles و spip_auteurs را export میکنم و در پایگاه دادهی وردپرس import میکنم.
حال وقت آن است که دادهها را از اسپیپ به وردپرس منتقل کنیم. من این کار را به ترتیب زیر انجام میدهم اما پیش از آن باید به خاطر داشته که ممکن است پیشوند پایگاهدادهی وردپرس و اسپیپ با آنچه در این نوشته آمده است متفاوت باشد. من در این نوشته از پیشوندهای پیشفرض استفاده کردهام.
۱- انتقال کاربران:
برای انتقال کاربران باید از دستور زیر استفاده کرد. توجه داشته باشید که کاربر پیشفرض وردپرس شناسهی یک دارد (wp_users.ID=1) به همین خاطر نمیتوان از شناسهی یکم شروع کرد، برای همین در از شرط WHERE id_auteur < 1 استفاده شده است.
INSERT INTO wp_users (ID, user_email, user_login, user_pass) SELECT id_auteur, email, login, pass FROM spip_auteurs WHERE id_auteur < 1
۲- انتقال دستهها:
برای انتقال دستهها (بخشها) از دستورهای زیر استفاده میکنیم. نکتهی مهم این است که در وردپرس دستهی با شناسهی یک (term_id=1) مربوط به بخش «دستهبندی نشده» است و باید یک دستهی جدید برای دستهی متناظر در اسپیپ تعریف کرد. اگر به هر دلیلی بخشهای متفاوتی را مد نظر دارید از این قسمت صرف نظر کنید و پس از ساختن دستهها (به از قسمت مدیریت وردپرس) به بخش ۳ بروید.
INSERT INTO wp_terms (term_id, name) SELECT id_rubrique, titre FROM spip_rubriques WHERE id_rubrique > 1; INSERT INTO wp_term_taxonomy (term_id, taxonomy, parent, count) SELECT wp_terms.term_id, "category", 0, 0 FROM wp_terms WHERE wp_terms.term_id > 1; UPDATE wp_term_relationships INNER JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_id SET wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
۳- انتقال نوشتهها:
حال که انتقال دستهها و کاربران انجام شد میتوان به انتقال نوشتهها پرداخت. پیش از شروع لازم است که نوشتههای فعلی در وردپرس خالی شوند. برای این کار من جدولهای wp_posts و wp_postmeta را خالی کردم (برای اطلاعات بیشتر از بخش منابع پیوند ۳ را بخوانید). در دستور زیر برای post_type از مقدار post استفاده میکنیم چرا که بنا داریم آنها را در دستههای مختلف جایگذاری کنیم، مقدار دیگری که برای post_type وجود دارد page است.
INSERT INTO wp_posts(ID, post_title, post_content, post_date, post_type) SELECT id_article, titre, texte, date, 'post' FROM spip_articles;
تا اینجا محتوای اصلی نوشتهها منتقل شدند، حال نیاز است که نویسندهها را نیز منتقل کنیم؛ دستور زیر برای این کار است:
UPDATE wp_posts INNER JOIN spip_auteurs_liens ON wp_posts.ID = spip_auteurs_liens.id_objet SET wp_posts.post_author = spip_auteurs_liens.id_auteur;
اکنون میتوان روتیتر و زیرتیتر را نیز منتقل کرد. از آنجایی که وردپرس این امکان را به صورت پیشفرض ندارد با یک هک کوچک این کار را انجام میدهیم. دستور زیر برای انتقال روتیتر و زیرتیتر است:
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT id_article, 'Subtitle', soustitre FROM spip_articles WHERE soustitre != ""; INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT id_article, 'Ticker', surtitle FROM spip_articles WHERE surtitle != "";
آخرین کاری که باید در بخش انتقال نوشتهها انجام دهیم، تخصیص آنها به بخشهای مربوط است. برای این کار دو حالت وجود دارد: اگر بخش ۲ این نوشته را انجام دادهاید کافی است که دستور زیر را اجرا کنید:
INSERT INTO wp_term_relationships(object_id, term_taxonomy_id, term_order) SELECT id_article, id_rubrique, '0' FROM spip_articles
اگر دستهها (Category) را به صورت دستی ساختهاید باید کمی حوصله به خرج دهید و کارهای زیر را انجام دهید. کافی است در دستور زیر به جای A در خط دوم شناسهی دسته که در جدول wp_term_taxonomy آمده بگذارید و به جای B شناسهی بخش اسپیپ را بگذارید.
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order) SELECT id_article, 'A' , '0' FROM spip_articles WHERE spip_articles.id_rubrique = 'B'
در حال حاضر نوشتهها منتقل شدهاند، حال مسئلهی بعدی درست کردن عکسهای نوشته است. برای این کار پوشهی IMG مربوط به اسپیپ را به پوشهی root مربوط به وردپرس منتقل کنید.
مرحلهی بعدی درست کردن پیوند عکسهاست.
در آخر باید پیوندها را به شکلی درست کرد که خطای ۴۰۴ نشان داده نشود. برای این کار از htaccess کمک میگیریم. کافی است دستورهای زیر را در آن وراد کنیم:
RewriteEngine On RewriteCond %{QUERY_STRING} ^article(.*)$ RewriteRule ^spip.php?$ /index.php?p=%1 [R=301,L]
پیام