Migracja bloga   WordPress → Jekyll

Czemu postanowiłem zmienić silnik bloga? Głównie z powodu mojej niecierpliwości. Czas oczekiwania ~10 sekund (a czasem dłużej) na stronę zachodzi za skórę. Rozwiązanie nr. 1 - plugin cache’ujący. Rozwiązanie nr. 2 - Jekyll. Wybrałem Jekyll.

Aby dodać trochę kontekstu, dodam, że postawiłem stronę na Azurze (AppService) wraz z maszyną wirtualną do bazy danych. Możliwe, że takie ułożenie również przyczyniło się do spowolnienia strony. Wraz ze zmianą silnika na Jekyll, robię migrację bloga na GitHub, ponieważ jest taniej ($7/miesiąc), a jako student mam to za darmo.

Jakie kroki musiałem przejść aby zakończyć migrację?

WP Jekyll Exporter

Żeby nie męczyć się nadto, postanowiłem poszukać gotowego rozwiązania, które zczyta wszystkie dane z mojego bloga i wyprodukuje jego wersję w formacie czytanym przez Jekyll. Znaleźć odpowiedni plugin nie było trudno. Już po chwili byłem na GitHubie projektu benbalter/wordpress-to-jekyll-exporter. Następnym krokiem było wejście do panelu administracyjnego bloga, wyszukanie wtyczki i jej zainstalowanie. Prosto.

No i wchodzę w Narzędzia > Export to Jekyll. Otwiera mi się nowa karta. I dostaję “500 Internal Server Error”. No ładnie. Ale nie zniechęcam się i zaczynam przeglądać zakładkę Issues na stronie projektu. Pierwsza rzecz: wymagana wersja PHP >= 5.3. Więc wchodzę do portalu Azure’a w opcje mojej strony i sprawdzam: PHP 5.5, czyli to nie to. Ponieważ twórca pluginu dostarczył również wersję do linii poleceń to postanowiłem jej spróbować. Wszystkie strony na Azurze mają automatycznie instalowaną wtyczkę Kudu, czyli taki panel administracyjny, dostępny pod adresem strona.scm.azurewebsites.net. W nim m.in. można znaleźć konsolę (CMD/Powershell) pozwalającą manipulować/zarządzać naszą stroną. Więc wchodzę w konsolę, przechodzę do odpowiedniego katalogu i uruchamiam php jekyll-exporter-cli.php > blog.zip. Chwila czekania…. Jest. Patrzę do środka wygenerowanego pliku… i jest on pusty. Ale co jest nie tak?

W PHP automatycznie błędy pokazywane nie są. I widać, że ludzie mają z tym problem, bo powstała strona phpshowerrors.com, której jedynym celem jest podanie ci dwóch linijek kodu, które włączają pokazywanie błędów. Szybka edycja pliku pozwoliła mi na uzyskanie błędu:

Uncaught exception 'Alchemy\Zippy\Exception\InvalidArgumentException' with message 
'The stream or file "D:\local\Temp/wp-jekyll-7151f534932ad8d2a94686a534d60a1c/" could not be opened.

Zacząłem chwilę się zastanawiać czy brnąć dalej tą drogą i stwierdziłem, że nie ma to większego sensu. Jest wiele możliwości, dlaczego to nie działa i nie dla mnie jest rozwiązywanie problemu maszyny, systemu, którego nie administruję. Otworzyłem FileZillę, ściągnąłem całą stronę i uruchomiłem to samo lokalnie. I poszło bez problemów.

jekyll-import

Twórcy Jekylla również dostarczyli możliwość importu bloga z WordPressa. Byłem ciekawy jak to pójdzie, bo może będzie lepiej niż przez wyżej opisaną wtyczkę. Postępując zgodnie z instrukcjami na tej stronie otrzymałem potrzebne mi foldery. Nie byłem jednak zachwycony ich zawartością, a dokładniej nie przekonwertowaniem postów do Markdownu. Także ta opcja odpada.

Konfiguracja bloga

Jestem wdzięczny wtyczce do WP, że nie musiałem ręcznie eksportować każdego posta. Mimo to muszę wejść w każdy post, usunąć niepotrzebne zmienne, utworzone przez exporter, i ustawić właściwą konfigurację. Najważniejszym ustawnieniem na początek jest obsługa permalinków. Ponieważ udostępniałem linki do moich postów, to chciałbym aby nadal działały po zmianie bloga. Stąd do pliku _config.yml dodałem następującą linijkę:

permalink: /:year/:month/:title/

Dodatkowo, aby domyślny layout strony był taki jak dla pojedyńczego posta

defaults:
  -
    scope:
	path: "" #any file
    values:
	layout: post

Aby wykorzystać wbudowany w WordPress system dzielenia postów przez <!--more--> trzeba również dodać

excerpt_separator: <!--more-->

Dodatkowo aby podzielić listę moich postów na stronie głównej, użyłem wtyczki paginate, którą musiałem doinstalować

gems: [jekyll-paginate]

paginate: 10
paginate_path: "/blog/page/:num/"

Wygląd

Postanowiłem nie zmianiać (zbytnio) wyglądu bloga. Aby mieć jakieś pojęcie jak sobie taki layout utworzyć, po chwili szukania, znalazłem prostą stronę micahcowell.com oraz jej kod źródłowy. I wygląda to mniej więcej tak: tworzymy main.html, który zawiera to co potrzebne jest każdej stronie, post.html, który określa rzeczy specyficzne dla postów, i page.html, dla stron.

Teraz czas na tą ciężką robotę, czyli zgarnięcie htmlu z istniejące bloga, wyrzucenie śmieci i rozłożenie go na powyższe 3 strony. Nie będę się o tym rozpisywał, ale trochę mi to zajęło.

Komentarze

Ponieważ wszystkie posty są statyczne, nie mam silnika komentarzy na serwerze, na którym stoi strona. Zamiast tego założyłem darmowe konto w serwisie Disqus, który za pomocą kilku linijek JavaScriptu generuje na mojej stronie okno komentarzy. W dodatku jeśli kiedykolwiek stwierdzę, że chcę przenieść bloga na inną platformę, moje komentarze pójdą ze mną.

Analityka

Na WordPressie miałem wtyczkę Jetpack, który zapewniała mi statystyki wejść na poszczególne posty. Ponieważ słyszałem dużo pozytywnych opinii o Google Analytics, postanowiłem spróbować i zobaczymy co z tego wyjdzie.

Lista mailingowa

Postanowiłem również utworzyć listę mailingową za pośrednictwem MailChimp, która będzie analizowała mój kanał RSS i wysyłała wiadomości o nowych blogpostach.

Ogólnie rzecz biorąc bardzo się cieszę wynikiem migracji i mam nadzieję, że nie będę miał problemów z blogiem w przyszłości.