Migrace z RS2 na WordPress

Čas se nachýlil, a jelikož jsem uznal, že je RS2 definitivně mrtvý redakční systém bez vyhlídek na nějaký vývoj, rozhodl jsem se tedy celý web převrhnout na něco nového. Požadavky byly veskrze jednoduché, stačí mi systém, kde nebudu muset nic moc řešit (čas na to opravdu nemám), a který bude obstojně vypadat na mobilu, používat nějaký responzivní template, když se náhodou příspěvek vloží třeba na facebook, tak se tam doplní takové ty opengraph věci a tak.

Chvíle které jsem se tak děsil nastala, JAK to proboha převedu se zachováním všech textů a komentářů? Kdybych migroval třeba z Joomly, nebo Drupalu, věřím, že nástroje existují již hotové, ale RS2 rozhodně není světově používaný systém (sorry juneau 🙂 )

Žádný konkrétní step-by-step návod psát nebudu, ale v bodech co jsem řešil a jak jsem to vyřešil.

Začal jsem prostým exportem tabulky web_textyweb_komentáře z databáze RS2. S SQL končím u SELECTu, takže jsem exportoval do CSV, které se dá přeci tak snadno editovat v PSPadu či Excelu a pak ho jednoduše naimportuji pomocí nějakého WP pluginu – ano WP umí pluginy a je jich jen na webu WP asi 50 tisíc.

Texty/Příspěvky

V příspěvku WordPress. Nastavení, tipy a pluginy co jsem použil jsou vypsány plus mínus aktuálně používané pluginy na tomto webu.

Zkoušel jsem WP All ImportWP Ultimate CSV Importer vypadalo to nadějně, ale pořád to nefungovalo, protože 100+1 problém co jsem řešil postupně dále. Import nakonec zvládl Really Simple CSV Importer. Pořád jsem to CSV upravoval ale co nerozbil Excel to rozbil PSPad/Notepad++ při hromadném nahrazování. Navíc si to chce pořád hlídat oddělovač, kódování, obalení uvozovkami atd.

Začal jsem tedy hledat nějaký program na úpravy CSV souborů a z toho co jsem zkoušel vyšel naprosto vítězně CSV Editor Pro! Je to sice jen 30-denní trial, ale to nám stačí. Program umí naprosto zásadní věci jako spojování sloupců, multiline, trim whitespaces, popral se zatím s každým CSV co jsem mu dal, a je otázkou pár kliků pro změnu separátoru, uvozovky, kódování..

Data přímo vyexportovaná z RS2

Data přímo vyexportovaná z RS2

V CSV Editoru Pro jsem tedy začal všechny příspěvky editovat (občas se to neobešlo bez mezikroku s regexy v PSPadu (odmazání zbytků po Texyle, nějaké to nahrazování, ..) přejmenoval jsem názvy sloupců podle sample.csv z Really Simple CSV Importeru, vykosil nepotřebné HTML, znaky.. nahradil nějaký zbytečnosti, provedl zásadní věc a to spojení sloupců perex a text do jednoho (a mezi nimi je vložen tag MORE)

CSV po mnohých úpravách připravené na import do WP

CSV po mnohých úpravách připravené na import do WP

Při importu to pořád padalo na jednom příspěvku, tak jsem z CSV vymazal post_content, a po importu ho ručně vložil jako HTML přímo v administraci WP. Import se povedl, a na první pohled to vypadá výborně! Jsem smířen s tím, že jsem přišel o kategorie, ale stejně jsem je chtěl probrat a tak je vytvořím znovu. Dále budu muset zkontrolovat formátování textu, ale na první pohled to zas tak blbě nevypadá a v neposlední řadě budu muset opravit obrázky (šlo by hromadně změnit url v CSV před importem, ale chtělo by to změnit i to HTML kterým jsou obalené, a tak těch pár obrázků doedituju ručně. Tím pokládám Texty/Příspěvky za vyřešené.

Komentáře

Po Příspěvcích by to chtělo i komentáře, ty jsem chtěl 100% zachovat, protože si pod některými příspěvky dost žijí vlastním životem a je v nich spousta rad a odkazů.

Původní komentáře vyexportované přímo z databáze RS2

Původní komentáře vyexportované přímo z databáze RS2

Jenže ouha, žádný z importních pluginů pro WP co jsem našel neumí importovat komentáře z CSV! Budeme to tedy muset nějak spáchat ručně.

Bylo tedy třeba přejmenovat sloupce dle tabulky WP, doplnit email ke všem komentářům (dobře asi to není úplně nutné, ale u WP je to povinné pole), takže jsem doplnil example@example.com 🙂 z textu komentářů jsem zrušil všechno HTML, v Excelu jsem změnil hodnoty ve sloupci user_id na 1 pokud je autor mikrom jinak 0. comment_datecomment_date_gmt jsem nastavil stejné, funguje to, a jesli bude nějaký deset let starý komentář o hodinu či dvě mimo mi je buřt.

Po pár pokusech a omylech jsem měl CSV přesně odpovídající tabulce v databázi a přes PhpMyAdmin jsem ho naimportoval. Komentáře mám! Jsou všechny, vypadá to funkčně.

Komentáře připravené na import do WP

Komentáře připravené na import do WP

Jenže jsem si všimnul toho, že se mi na titulce webu neukazuje počet komentářů u příspěvků, čím to může být? aha – ono je to uložene v tabulce wp_posts u každého příspěvku ve sloupci comment_count. Jak to tam ale nějak elegantně dosypat.

Vzal jsem si tedy z CSV s komentáři sloupec comment_post_ID, kde se nám vlastně ukazuje vícekrát stejné číslo (příspěvku) přesně tolikrát kolik komentářů daný příspěvek má. Na to se hodí Excelovská funkce COUNTIF(), kdy jsem si udělal sloupec s čísly příspěvků (prostě jsem jen roztáhnul buňku o 1 do 392) a do vedlejšího sloupce jsem si nechal vypsat kolikrát je ve sloupci A hodnota z buňky ve sloupci B. Z výsledných dvou sloupců (comment_post_ID;comment_count) jsem si zase udělal CSV.

CountIf v praxi

CountIf v praxi

Toto CSV jsem poté zpracoval BAT souborem, který z něho udělal sadu SQL příkazů pro update tabulky.

@echo off
(
  for /F "tokens=1-18* delims=;" %%A in (comment_post_ID---comments_count.csv) do (
    echo UPDATE `wp_posts` SET `comment_count` = %%~B WHERE `ID`=%%~A;
  )
) > sql.txt

Výsledkem je něco takového

UPDATE `wp_posts` SET `comment_count` = 0 WHERE `ID`=1;
UPDATE `wp_posts` SET `comment_count` = 0 WHERE `ID`=2;
UPDATE `wp_posts` SET `comment_count` = 0 WHERE `ID`=3;
UPDATE `wp_posts` SET `comment_count` = 0 WHERE `ID`=4;
UPDATE `wp_posts` SET `comment_count` = 10 WHERE `ID`=5;
UPDATE `wp_posts` SET `comment_count` = 10 WHERE `ID`=6;
UPDATE `wp_posts` SET `comment_count` = 0 WHERE `ID`=7;
UPDATE `wp_posts` SET `comment_count` = 2 WHERE `ID`=8;
...

takže, pro rekapitulaci, v tabulce wp_posts doplníme do sloupce comment_count počet komentářů daného příspěvku.

Nyní se již ukazuje v administraci WP kolik má daný příspěvek komentářů a i na té titulce webu se již informace ukazuje.

Pozor si dejte na to aby skutečně odpovídaly všechny komentáře ke všem příspěvkům! asi na dvou místech se mi to posunulo třeba o jeden a to pak bylo správné SQL harakiri porovnat.

Počty přečtení

Zatím jsem neřešil počty přečtení příspěvků, ale RS2 to v databázi má, a určitě byl nebyl problém těmi daty předkrmit nějaký WP plugin, třeba WP-PostViews.

Přesměrování starých adres

To je asi poslední věc co řeším, stále. Nechtělo se mi to řešit zase přes .htaccess, takže jsem se opět poohlédnul po pluginu a našel Redirection. Plugin je opravdu výborný, narozdíl od .htaccess mám přehled kolikrát bylo přesměrováno a také všechny 404ky ze kterých lze rovnou vytvořit další pravidla pro přesměrování.

Pravidla jsou nastavit buď jednoduchá – /tuhle/url/ -> /presmeruj/na/tuhle/, nebo pomocí oblíbených|nenáviděných regulárních výrazů (jedna z nejzásadnějších věcí co mě naučili na VŠ) – \/(tuhle)|(nebo-tuto)\/url\/ -> /presmeruj/sem/.

Pro RS2-WP kompatibilitu musíme pořešit odkazy na texty-příspěvky, články-stránky, obrázky, soubory, .. Takový základ je zde:

zdrojcilregexpopisek
\/(\d{1,3})\-/?p=$1anoVe staré verzi RS2 začínaly texty číslem.
\/text\-([\w-]+)/$1anoV současné verzi RS2 začínají texty slovem „text-„.
\/clanek-19(\/?)/category/geocaching/anoVe staré verzi RS2 jsou články problém, obsahují pouze číslo a tak se musí pro každý článek napsat redirect samostatně. V současné verzi RS2 se to řešit vůbec nemusíme!
(\/55\/)|(\/dokumenty\/55\/)|(\/docs&file=55)|(\/dokumenty\/hausmann\.pdf)|(\/soubory\/dokumenty\/hausmann\.pdf)/wp-content/uploads/2016/10/hausmann.pdfano!Dokumenty jsou taky peklo, během vývoje RS2 se odkazy měnily a různě po netu se povalují různé verze odkazů – tady oceníme regex!
/archiv/kategorie/27//category/kolobezky/neKategorie textů a souborů se musí řešit bohužel také každá zvlášť. Na to se hodí to sledování 404ek, a přesměrovávat to co je třeba.
\/archiv\/\?autor\=\&kategorie\=\&mesic\=(\d{4})(\d{2})$/$1/$2/anoArchivy se dají řešit docela elegantně.
\/archiv\/mesic\/(\d{4})(\d{2})\/$/$1/$2/anoDalší pravidlo pro archivy
\/obrazky\/pc\/bt-in-t23\/(.+\.jpg)/wp-content/uploads/2007/09/$1anoObrázky z příspěvků mi přivádí hodně lidí, je to docela jednoduché, jen se změnila url, obrázky zůstaly stejné. Ale zase se to musí udělat pro každý příspěvek zvlášť.
\/obrazky\/texty-(galerie|doprovodne)\/383\/(.+\.jpg)/wp-content/uploads/2014/08/$2anoTakhle jsou zase obrázky v novější verzi RS2.
/rss.xml/feedneNo a pak už se jen ladí detaily.

Konec?

To je zatím vše co mě napadá, uvidíme co se vyrojí dál..

mikrom

Roman Mikulka aka mikrom. Ajťák, opravář, programátor samouk, elektrotechnik, koloběžkář a geocacher. Více na samostatné stránce O mně.

Mohlo by se vám líbit...