Proprio l’altro giorno mi sono imbattuto nel fatidico trasferimento di CMS, da Xoops a WordPress. E’ un casino, ma grazie a questo post potrete farlo in… un’oretta… o due se va storto qualcosa 🙂

Partiamo da fatto che avete un sito in Xoops e che l’abbiate aggiornato all’ultima versione (2.4.4). Bene.
Do’ per certo che abbiate già installato WordPress (2.9.2) da zero.
In poche parole avete un sito in Xoops pieno e uno in WordPress vuoto. E fin qui ci siamo.

Iniziamo con l’estrarre dal DB di xoops la tabella delle news, “formattandola” con la stessa struttura della tabella che wordpress si aspetta.

– Entriamo nell’hosting dove abbiamo Xoops, accediamo a phpMyAdmin (o un altro client che utilizzate per collegarvi al DB) ed entriamo nel DB dove abbiamo l’installazione di Xoops.

– Passiamo nella modalità SQL e lanciamo il seguente comando che non fara’ altro che creare una nuova tabella formattando tutti i campi della struttura con le attuali voci della tabella di wordpress 2.9.2

Ho creato l’SQL in modo che in tutti gli articoli siano abilitati i commenti (altrimenti cambiate comment_status, ‘open’ in comment_status, ‘closed’).

Noterete che ho usato il CONCAT(hometext, ‘ ‘,bodytext) poiche’ Xoops utilizza 2 box per le news (anteprima e notizia completa) quindi il CONCAT non fa altro che unirle e creare una news singola.

Per i permalinks credo che non ci sia nulla da fare… come noterete nell’SQL ho impostato”storyid AS post_name” che assegna l’ID news come nome della news. In altre parole la vostra nuova news (con id=7263) sarà raggiungibile con questa naming convention: vostrosito.xyz/2010/03/7263/ e non con il titolo della news vostrosito.xyz/2010/03/hello-world/

Prima di lanciare l’SQL è ovvio che dovete cambiare (se necessario) il nome delle tabelle “xoops_stories” e “wordpress_posts” a seconda dei nomi che avete impostato nel momento dell’installazione del CMS.

CREATE TABLE wordpress_posts AS SELECT storyid AS ID, 1 AS post_author, FROM_UNIXTIME( published ) AS post_date, FROM_UNIXTIME( published +43200 ) AS post_date_gmt, CONCAT(bodytext, ‘ ‘,hometext) AS post_content, title AS post_title, ” AS post_excerpt, ‘publish’ AS post_status, ‘open’ AS comment_status, ‘open’ AS ping_status, ” AS post_password, storyid AS post_name, ” AS to_ping, ” AS pinged, FROM_UNIXTIME( published ) AS post_modified, FROM_UNIXTIME( published +43200 ) AS post_modified_gmt, ” AS post_content_filtered, “” AS post_parent, ” AS guid, ‘0’ AS menu_order, “post” AS post_type, ” AS post_mime_type, 0 AS comment_count FROM `xoops_stories`

Ora che avete lanciato l’SQL vedrete comparire la nuova tabella wordpress_posts nella lista delle tabelle presenti sulla destra in phpMyAdmin.

Quindi ora la esportiamo usando la funzione ESPORTA di phpMyAdmin, possiamo esportarla in formato SQL spuntando magari la compressione gzip nel caso aveste molti record (nel mio caso circa 8000).

Bene. Siete quasi a metà dell’opera. Ora avete sul vostro pc la tabella compatibile per wordpress quindi non vi resta che accedere al DB del sito in WordPress e importarla.

E’ caldamente consigliato crearsi un backup della tabella wordpress_posts o di tutto il DB prima dell’importazione.
E’ altrettando consigliato non avere record esistenti nell’attuale tabella wordpress_posts.

L’operazione di IMPORT è banale quanto l’EXPORT, utilizzando la funzione IMPORTA di phpMyAdmin selezionate il file wordpress_posts.gzip e phpMyAdmin eseguira’ alla lettera l’SQL facendo le INSERT di tutti i record.

Ora siete a metà.

Come ben sapete le news di Xoops come quelle di WordPress sono collegate alle categorie che i due CMS gestiscono in maniera differente. Xoops memorizza l’ID categoria nella stessa tabella delle news, mentre WordPress in una tabella a parte. Quindi servirà esportarsi dal DB di Xoops tutte le associazioni di ID news con ID categoria.

Questo e’ possibile tramite questo SQL che lanceremo chiaramente sul DB di Xoops. Come l’altro SQL creerà un’altra tabella (da 3 campi) che andrete ad importare sul DB di WordPress:

CREATE TABLE wordpress_term_relationships AS SELECT storyid AS object_id, topicid AS term_taxonomy_id, ‘0’ AS term_order FROM `xoops_stories`

Ora che abbiamo importato anche questa tabella su WordPress non ci resta che allineare gli ID categoria con quelli che avevamo su Xoops. Quindi se la categoria “Foto” su Xoops aveva ID=4 e su WordPress ha ID=10 dovete portare l’ID di wordpress da 10 a 4. (questa operazione mi ha fatto perdere piu’ tempo di tutte perchè l’ID è univoco, ciò presuppone che non si possono avere due ID uguali, di conseguenza se devi cambiare l’ID da 10 a 4 devi anche cambiare l’attuale ID=4 a ID=XX).

Sicuramente questa operazione farebbe perdere molto meno tempo se si creassero le categorie di pari passo con il cambio degli ID.

Una volta allineati gli ID potrete loggarvi in WordPress e vedere tutte le news a loro posto nelle categorie giuste.

Ora però non è finita. Provate a creare una news da WordPress. Se non dovesse funzionare è perchè nell’INSERT che abbiamo fatto nella tabella wordpress_posts si è persa sia la chiave primaria che l’AUTO_INCREMENT assegnati in precedenza al campo ID. In questo caso se così fosse dovete settarglieli nuovamente e riprovare a creare la news.

Se nel vostro sito in Xoops avevate inserito anche delle immagini nelle news, sarà sufficiente spostare la directory /uploads di Xoops sotto la root di WordPress (quindi nella stessa dir dove si trovano wp-admin, wp-content…)

Se avete domande chiedete pure.