مهاجرت از دروپال 6 به hexo

24 فوریه 2016 میلادی ( 5 اسفند 1393 خورشیدی) دروپال6 به پایان راه خود رسید و تیم توسعه دهنده بطور رسمی اتمام پروژه دروپال6 رو اعلام کرد.1
این دلیلی شد تا بخوام بلاگم رو از دروپال 6 منتقل کنم به جای دیگه، خب در نهایت Hexo رو انتخاب کردم، یک سایت‌ساز ایستا که با nodejs نوشته شده. اسباب کشی به Hexo کمی چالش برانگیز و جذاب بود. اینجا قصد دارم این اسباب کشی رو شرح بدم.

قبل اینکه برم سراغ جزییات بنظرم بهتره چالش‌هایی که وجود داشتن رو عنوان کنم و یکی یکی نحوه رویارویی باهاشون رو باهم ببینم.

راه اندازی Hexo و طراحی قالب

قبل از اینکه بخواید Hexo رو نصب کنید باید npm رو نصب داشته باشید، اگه ندارید سری به https://nodejs.org بزنید و نصبش کنید. بعد از اون برای نصب hexo دستور زیر رو اجرا کنید

1
npm install hexo-cli -g

بعد از نصب hexo برای راه اندازی بلاگ دستورهای زیر رو اجرا کنید.

1
2
3
hexo init blog
cd blog
npm install

همینجا کار نصب تمومه و میتونید برای نمایش بلاگ دستور زیر رو وارد کرده و به آدرس http://localhost:4000 برید

1
hexo server

اگه سری به داخل دایرکتوری blog که hexo اونو ساخته بزنید می‌بینید که دایرکتوری به نام themes وجود داره که درحال حاضر فقط قالب پیش‌فرض landscape توی اون وجود داره، من برای ساخت قالب از قالب آماده و آزاد again استفاده کردم و اونو برای خودم شخصی سازی کردم.
نصب قالب توی hexo خیلی ساده است، فقط کافیه دایرکتوری قالب رو درون دایرکتوری themes قرار بدید و درون فایل _config.yml مقدار theme رو برابر نام قالب خودتون (نام دایرکتوری قالب) قرار بدید.
الان میتونید سرور رو دوباره اجرا کنید و قالب جدید خودتون رو ببینید. ( هرتغییری در فایل _config.yml نیازمند اجرای دوباره سرور hexo است)
چند نکته درمورد hexo:

  • گفتیم که hexo یک سایت‌ساز استاتیک است ولی تا اینجا برای دیدن سایت از سروری که خود hexo میسازه استفاده کردیم، در صورتی که میخواید صفحات استاتیک داشته باشید دستور زیر رو اجرا کنید. بعد از اجرای این دستور درون فولدر blog دایرکتوری ایجاد میشه به نام public که تمامی صفحات سایت درون اون قرار داره.
    1
    hexo generate
  • سورس اصلی تمامی پست‌ها و صفحات درون دایرکتوری source قرار می‌گیره، پست‌ها درون زیر دایرکتوری _posts و صفحات هریک درون دایرکتوری‌ای به نام خود صفحه

  • برای ایجاد پست جدید می‌تونید از دستور زیر استفاده کنید. خروجی این دستور آدرس فایل مارک‌داونی است که متن پست رو باید درون اون بنویسید

    1
    hexo new post POST_TITLE

انتقال پست‌های موجود در دروپال به Hexo به همراه تگ‌ها و بقیه فیلد‌های ایجاد شده توی دروپال

برای این‌کار احتمالا نیاز دارید کمی از معماری دروپال 6 سر دربیارید، چون راستش چندان رمقی برای گفتنش ندارم، هرچند هم که چیز چندان خاصی نیست و فقط کافیه بدونید دروپال پست‌هارو چجوری و توی چه جداولی نگهداری می‌کنه. بعد یک تکه کد بنویسید که پست هارو از پایگاه داده دروپال بخونه و برای هر پست یک فایل در فولدر source سایت جدید بسازه.
کدی که من با nodejs نوشتم کمی کثیف و غیر اصولیه، چون فقط میخواستم کار خودم رو راه بندازم و بعدش هم درگیر کارای دیگه شدم نشد تمیزش کنم و تو گیت‌هاب بذارمش ( تا این لحظه که نشده) اگه وقت و حوصله جور شد حتما این کار رو میکنم.

[چند روز بعد]

خب الان دیگه کدم رو کمی مرتب کردم پلاگینی برای Hexo درست کردم که می‌تونید توی ریپوزیتوری گیت‌ها ببینیدش.
بعد از نصب پلاگین براحتی میتونید دروپال 6 خودتون رو به hexo منتقل کنید.

1
hexo migrate druapal-6

تنظیم nginx و اطمینان از اینکه لینک‌هایی که تو اینترنت share شدن همچنان به پست‌ها اشاره دارند و فعال هستند

کار دیگه‌ای که باید انجام بشه تنظیم nginx برای لود فایل‌های استاتیک و البته نکته مهم این که لینک‌هایی که تابحال توی شبکه‌های اجتماعی شیر شده بود رو حفظ بشن.
تنظیم nginx برای لود نمایش فایل‌های استاتیک کار راحتیه و تنها با ایجاد فایل تنظیماتی شبیه فایل زیر انجام میشه.

1
2
3
4
5
6
server {
listen 80 farnabaz.ir;
root /var/www/hexo;
index index.html index.htm;
}

برای اینکه بتونید آدرس‌های قبلی رو به آدرس‌های جدید منتفل کنید چند راه وجود داره که استفاده از map توی انجین‌ایکس راه مناسبی برای اینکاره، توی این روش متغییر جدید توی nginx ایجاد می‌کنیم که درصورتی که آدرس درخواستی یکی از آدرس‌های قدیمی باشه مقدار این متغییر برابر آدرسی خواهد بود که قراره بهش ریدایرکت کنیم. چیزی شبیه این:

1
2
3
4
5
6
7
8
map $request_uri $new_uri {
default "";
/rss /rss.xml;
/node/1 /content/سرآغاز/;
/node/10 /content/xml-چیست/;
/node/100 /content/ساده-و-مطمئن-برای-افزودن-سطر-جدید-به-پایگاه-داده-sqlit$
/node/101 /content/اندروید-نمایش-دائمی-overflow-menu/;
}

دقت داشته باشد که map باید بیرون server نوشته بشه و درون server باید از متغییر جدید که ایجاد شده استفاده کرد، اینجا برای ریدایرکت به آدرس‌های جدید اینجوری میشه نوشت

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
map $request_uri $new_uri {
default "";
/rss /rss.xml;
/node/1 /content/سرآغاز/;
/node/10 /content/xml-چیست/;
/node/100 /content/ساده-و-مطمئن-برای-افزودن-سطر-جدید-به-پایگاه-داده-sqlit$
/node/101 /content/اندروید-نمایش-دائمی-overflow-menu/;
}
server {
...
if ($new_uri != "") {
rewrite ^(.*)$ $new_uri permanent;
}
...
}

حالا تنها کافیه داخل بلاک map آدرس‌های قبلی رو به آدرس‌های جدید مپ کنید.
بعد از ریستارت nginx می‌تونید با کمک کدی که میتونید اینجا پیداش کنید چک کنید که آیا لینک‌ها بدرستی ریدایرکت شدند یا نه

انتقال کامنت پست‌های دروپال به disqus

وقتی پای سایت‌های استاتیک به میان میاد، دیگه خبری از کامنت‌های درون سایت وجود نداره، برای اینکه سایت بتونه سیستم کامنت‌گذاری داشته باشه باید از سرویس‌هایی شبیه disqus استفاده کنید. معروف‌ترین این‌ها هم همین disqus هست که امکانات مناسبی هم داره، یکی از ویژگی‌های خوبش امکان import از طریق فایل xml است که برای انتقال کامنت‌ها از دروپال به disqus بدرد بخور هست.

برای انتقال کامنت‌ها ابتدا باید فایل xmlای از کامنت‌های دروپال بسازید، برای اینکار ماژول disqus برای دروپال دقیقا همون چیزی هست که لازمه، منتهی باید نسخه dev این ماژول رو نصب کنید که میتونید از این آدرس اون رو دانلود کنید.

بعد از نصب این ماژول لازمه کمی تغییرات توش اعمال کنیم تا خروجی بهتری داشته باشیم.
توی فایل disqus_migrate.export.inc در سطر 335 آرگمان 'alias' => TRUE رو از تابع url() پاک کنید. نتیجه مثل کد زیر خواهد بود

1
2
3
4
5
6
7
$thread_data[$nid] = array(
'title' => $node_data->title,
'link' => url("node/" . $nid, array('absolute' => TRUE)),
'identifier' => 'node/' . $nid,
'post_date_gmt' => date("Y-m-d H:i:s", $node_data->created),
'post_date_gmt_unix' => $node_data->created,
);

در همین فایل سطر 256 را کامنت کنید

1
2
3
4
5
6
7
$output .= '<item>';
$output .= '<title>' . _disqus_migrate_cleanse_xml($thread['title']) . '</title>';
$output .= '<link>' . $thread['link'] . '</link>';
$output .= '<content:encoded></content:encoded>';
//$output .= '<dsq:identifier>' . $thread['identifier'] . '</dsq:identifier>';
$output .= '<wp:post_date_gmt>' . $thread['post_date_gmt'] . '</wp:post_date_gmt>';
$output .= '<wp:comment_status>open</wp:comment_status>';

در فایل disqus.module سطر 431 را کامنت کنید

1
2
3
4
5
6
$settings = array(
'url' => $options['url'],
'title' => $options['title'],
//'identifier' => $options['identifier'],
'shortname' => $domain,
);

اکنون از مسیر admin/content/comment/disqus_export کامنت‌های خود را بصورت xml خروجی گرفته و به حساب disqus خود را در مسیر disqus.com/admin/discussions/import/platform/generic/ منتقل کنید. چند دقیقه‌ای طول می‌کشد تا دیسکاس بطور کامل اطلاعات ورودی را تحلیل کند، پس از آن شما تمامی کامنت‌ها در دیسکاس نمایش داده خواهد شد.

References: