Sia WordPress che Drupal sono CMS che permettono una gestione, tra le altre cose, di Blog.
Entrambi sono altamente personalizzabili e potenti, abbastanza flessibili da concedere ampio spazio ai piu' esigenti.
Di seguito verra' fornita una breve descrizione delle due piattaforme, seguita dalle istruzioni per la migrazione, sia automatizzata che manuale.
WordPress
WordPress (http://wordpress.org) e' inteso come piattaforma per la gesione di un singolo Blog, con piu' utenti dotati di permessi diversi a seconda del loro livello.
Permette una gestione di piu' Template e una completa personalizzazione degli stessi, permettendo quindi all'utente di integrare WordPress in un sito o portale gia' esistente per gestirne una parte tramite questa piattaforma.
Vantaggi
E' leggero e molto personalizzabile.
Il Database e' molto chiaro, di semplice comprensione quasi per chiunque, e la creazione di moduli esterni e Plugin e' relativamente semplice.
Gli utenti hanno creato un'infinita' di Template, per cui solo i piu' esigenti hanno la necessita' di creare un Template personalizzato, potendo gli altri affidarsi a quanto gia' creato da altre persone.
Svantaggi
La gestione dei pacchetti aggiuntivi (Plugin e Template) non e' centralizzata, benche' ci si provi.
Infatti molto spesso i realizzatori di questi pacchetti non li mettono a disposizione nei Repository centralizzati, mantenendoli solo sul proprio sito.
Per questa ragione, la ricerca di Template e di Plugin puo' essere difficoltosa, e non sempre si rendono disponibili aggiornamenti di Plugin in tempo utile quando nuove versioni della piattaforma vengono pubblicate.
Lo sviluppo di nuove versioni e' d'altronde molto rapido, se si considera che la versione 1.5 e' nata solo un anno dopo la versione 1.2, e lo stesso e' valso per il passaggio dalla versione 1.5 alla versione 2.0.
Drupal
Drupal, a confronto con WordPress, risulta essere quasi un pachiderma.
Permette infatti non solamente la gestione di Blog, ma anche di gallerie fotografiche e news da parte degli utenti registrati, creando cosi' un vero portale.
Vantaggi
E' possibile aprire il proprio sito a registrazioni di utenti esterni, concedendo loro la possibilita' di crearsi un proprio Blog, inserire immagini e scrivere in un Forum.
Tutto gestito dalla stessa piattaforma, che integra anche un News Aggregator e un pannello di amministrazione integrato nelle pagine di base, in modo da non obbligare gli amministratori ad aprire altre pagine per approvare storie e commenti, piuttosto che per inserire contenuti.
Il Template e' personalizzabile, e si puo' permettere agli utenti registrati di scegliere un differente Template per la visualizzazione.
Svantaggi
I Plugin (qui chiamati "moduli") disponibili sono in numero decisamente inferiore a quelli disponibili per WordPress, ma sono tutti indicati sul sito ufficiale della piattaforma.
Anche i Template disponibili sono in numero inferiore, e la personalizzazione di Template e' decisamente ostica e inadatta ad utenti inesperti.
Migrazione da WordPress 1.5 a Drupal 4.6
Puo' capitare, come e' capitato alla sottoscritta, di avere la necessita' (vedere questo post (http://www.delymyth.net/node/2342)) di migrare da WordPress a Drupal.
Purtroppo, la presenza di oltre 2000 articoli ha reso necessaria la conservazione degli ID dei post, in modo da poter ricreare, tramite file .htaccess, la vecchia struttura dei Permalink, o quantomeno di fare in modo che, attraverso i vecchi indirizzi, le nuove pagine fossero raggiungibili.
E' possibile eseguire la migrazione completa di utenti, articoli, commenti e categorie, in due modi, uno automatizzato tramite script, e uno manuale.
Entrambi i metodi vengono qui presentati ed analizzati con una delineazione dei vantaggi e degli svantaggi.
Primi Passi
Il primo passo per eseguire la migrazione consiste nell'installare Drupal da qualche parte.
Si puo' utilizzare una Sottodirectory nel proprio sito, dove modificare tranquillamente i file, per poi spostarli, ad importazione del db e configurazione della piattaforma avvenuta, nella directory base del server.
E' necessario creare il Database di Drupal, che non viene creato da un programma di installazione, ma necessita dell'esecuzione manuale di uno script SQL, che si puo' tranquillamente copiare e incollare dentro PhpMyAdmin.
Migrazione Automatizzata
I pigri, o coloro che non hanno esigenza di mantenere i link ai vecchi articoli, ma solamente i contenuti, possono affidarsi con sicurezza ad uno script messo a disposizione dagli utenti di Drupal (qui (http://lsb.blogdns.net/pages/wordpress-migration-utility)).
Questo script necessita dell'installazione del Driver adodb, disponibile qui (http://adodb.sourceforge.net) e, una volta configurato ed avviato, e' in grado di importare tutti i vecchi articoli e commenti all'interno del Database di Drupal in meno di un minuto.
Pur funzionando egragiamente, ha l'enorme svantaggio di non permettere, salvo pesante editing dello script, la conservazione degli ID degli articoli, non permettendo quindi la manutenzione dei vecchi Permalink, cosa scomoda per chi avesse numerosi articoli referenziati anche da siti esterni.
Migrazione Manuale
La migrazione manuale prevede l'uso di 6 Query SQL, piu' una in caso si vogliano migrare anche gli utenti (aggiustare le Query che seguono, che non tengono conto degli utenti).
E' fattibile in pochi minuti e ha l'innegabile vantaggio di permettere la conservazione dei vecchi Permalink.
Purtroppo questo metodo richiede l'esecuzione manuale delle Query (benche' sia possibile creare uno Script Php che faccia tutto il lavoro), ma permette anche una migliore gestione della procedura di importazione.
Utenti
In caso si utilizzino piu' utenti sul Blog, e' necessario importare anche gli utenti (in lavorazione), ma e' anche possibile ricrearli a mano da Drupal, e tenere a mente gli id degli utenti mentre si esegue la migrazione degli articoli.
Categorie
La prima cosa da importare sono le categorie.
E' necessario predisporre Drupal all'utilizzo delle medesime, tramite la taxonomy.
Per prima cosa bisogna aggiungere un vocabolario, chiamato ad esempio Categorie, e poi aggiungere i vari termini (le categorie vere e proprie).
Tralasciando la creazione di categorie (termini), dal momento che li importeremo, e' sufficiente creare il vocabolario, avendo cura di associarlo, come tipologia di articoli, quantomeno a story e blog (in dipendenza da cosa si intende fare).
A questo punto, e' necessario conoscere l'ID del vocabolario, che da Database puo' essere scoperto eseguendo la seguente Query:
Dato che i vocabolari su una fresca installazione sono pochini, e' sufficiente trovare quello creato precedentemente per scovarne l'id e trascriverselo su un foglietto a parte.
E siamo pronti per importare le Categorie del nostro vecchio Blog, mantenendone gli id.
Le Tabella impattate per la corretta importazione delle categorie sono due: term_data, che raccoglie le singole categorie con descrizioni e quant'altro, e term_hierarchy, che contiene l'indicazione delle relazioni di parentela tra le singole categorie (insomma, permette di definire sottocategorie).
Le due Query da eseguire, in ordine, sono le seguenti, dove wpdb e' il vecchio Database di WordPress. Se avete utilizzato un prefisso nella creazione delle Tabelle di WordPress, ricordate di modificare la Query in modo opportuno:
- INSERT INTO term_data (SELECT cat_ID, 5, cat_name, category_description, 0 FROM wpdb.categories)
- INSERT INTO term_hierarchy (SELECT cat_ID, category_parent FROM wpdb.categories)
WordPress infatti manteneva le informazioni di gerarchia delle categorie nella Tabella delle stesse, mentre Drupal ha una Tabella apposita solo per la gerarchia (in questo modo una categoria puo' essere figlia di due o piu' categorie).
Articoli
Una volta importate con successo (contatele per verificare) le categorie, e' il momento di passare agli articoli, che sono forse la parte piu' importante.
La Query e' in questo caso molto piu' complessa, dal momento che deve effettuare delle operazioni sul contenuto per "tagliarlo" opportunamente.
Nell'esempio che segue, gli orari degli articoli vengono portati indietro di 5 ore a causa della gestione delle ore delle due piattaforme, e del Fuso Orario del Server e del Blog.
Ci sono varie opzioni per l'importazione, in dipendenza da come volete eseguirla.
- Parametri di Importazione:
- tipo - puo' essere 'blog' o 'story' (minuscolo e con gli apicini), indica se volete che siano post in un Blog personale, consigliato, oppure storie globali per l'installazione di Drupal).
- drid - Lo User-Id dell'utente di Drupal a cui volete che siano associati gli articoli importati.
- wpid - Lo User-Id di WordPress di cui volete prelevare gli articoli.
- fuso - La differenza in ore tra il Fuso Orario di WordPress e quello di Drupal, puo' essere sia positivo che negativo.
La Query e' differente a seconda dell'uso o meno dell'excerpt su WordPress (teaser su Drupal:
- Utilizzo di Excerpt:
- INSERT INTO node (SELECT ID, tipo, post_title, drid, 1, UNIX_TIMESTAMP( DATE_ADD( post_date, INTERVAL fuso HOUR ) ) , UNIX_TIMESTAMP( DATE_ADD( post_date, INTERVAL fuso HOUR ) ) , 2, 1, 0, post_excerpt, post_content, , 0, 3 FROM wpdb.posts)
- Utilizzo di <!--more-->:
- INSERT INTO node (SELECT ID, tipo, post_title, drid, 1, UNIX_TIMESTAMP( DATE_ADD( post_date, INTERVAL fuso HOUR ) ) , UNIX_TIMESTAMP( DATE_ADD( post_date, INTERVAL fuso HOUR ) ) , 2, 1, 0, LEFT(post_content, LOCATE('<!--more-->', post_content) -1), REPLACE(post_content, '<!--more-->', '<!--break-->'), , 0, 3 FROM wpdb.posts)
- Personalizzazioni:
- Se volete importare solo gli articoli, e non le pagine statiche, potete aggiungere una clausola Where:
- WHERE post_status = 'publish'
- Se volete importare gli articoli appartenenti ad uno specifico utente (ad esempio in Blog a piu' utenti), aggiungete una clausola Where di questo tipo:
Questa Query e' un po' macchinosa, ma svolge il suo lavoro molto meglio della routine di importazione automatica, e permette all'utente di importare gli articoli in modo molto piu' flessibile, inserendo e modificando le clausole Where a seconda delle proprie necessita' e permettendo una migliore gestione del Fuso Orario di importazione.
Collegare Articoli a Categorie
Importare gli articoli non e' sufficiente, bisogna anche associarli alle rispettive categorie.
La Tabella che gestisce le associazioni su WordPress e' la post2cat, mentre su Drupal, in maniera assolutamente analoga, e' la term_node.
La Query e', in sostanza, banalissima:
- INSERT INTO term_node (SELECT <DISTINCT> post_id, category_id FROM wpdb.post2cat)
L'opzione DISTINCT permette di evitare l'eventuale importazione di dati doppi, che su WordPress viene gestita tramite id di associazione, assente su Drupal.
Usatela in caso l'importazione senza di essa vi dia errori, oppure usatela e basta che funziona di sicuro.
Commenti
L'importazione dei commenti e' analoga a quella degli articoli, e anche in questo caso e' necessario aggiustare il Fuso Orario in modo analogo.
Rispetto alla Query per gli articoli, questa e' quasi banale:
- INSERTI INTO comments (SELECT comment_ID, 0, comment_post_ID, 0, comment_content, comment_content, comment_author_IP, UNIX_TIMESTAMP( DATE_ADD( comment_date, INTERVAL fuso HOUR ) ) , 0, 0, 1, , NULL , comment_author, comment_author_email, comment_author_url FROM wpdb.comments WHERE comment_approved = '1')
E' necessario specificare il comment_approved = '1' dal momento che WordPres mantiene nel Database anche i commenti giudicati Spam dalla Blacklist.
L'alternativa e' rimuovere i commenti classificati come Spam prima di eseguire l'importazione, pregando che non ne vengano inseriti di nuovi durante la fase di importazione.
node_comment_statistics
La tabella piu' complessa, per certi versi.
Su Drupal riassume le statistiche di commenti per articolo, indicando quanti commenti ha ogni singolo articolo, quale sia l'ultimo commento e chi l'abbia inviato.
Per eseguire il passaggio in sole due Query, e' necessario l'utilizzo di una Tabella Temporanea sul Database di WordPress, che semplicemente inverte l'ordine dei commenti, mettendoli dal piu' nuovo al piu' vecchio invece che dal piu' vecchio al piu' nuovo:
- CREATE TABLE tmp_commenti as (SELECT * FROM comments ORDER BY comment_ID DESC)
A questo punto, la Tabella tmp_commenti sara' identica alla Tabella comments, a parte il fatto di avere i commenti in ordine inverso.
La Query per il popolamento della Tabella node_comment_statistics e' la seguente:
- INSERT INTO node_comment_statistics (SELECT comment_post_id, comment_date, comment_author, comment_id, count( comment_id ) FROM wpdb.tmp_commenti GROUP BY comment_post_id)
Sequences
Da non dimenticare, la Tabella sequences di Drupal, aggiornabile tramite Query o a mano:
- Query
- UPDATE sequences SET node_nid = MAX(node.nid) +1
- UPDATE sequences SET term_data_tid = MAX(term_data.tid) +1
- UPDATE sequences SET comments_cid = MAX(comments.cid) +1
- Manualmente
- Modificare i valori a manina, mettendoli a maggiori del maggiore id di articoli, commenti e categorie.
Verifica
Prima di procedere, e' il caso di verificare che tutto funzioni a dovere (un giretto sul Blog in Drupal e' sufficiente).
Benche' macchinosa, questa procedura manuale risulta piu' efficiente e personalizzabile di quella automatizzata, anche se richiede piu' tempo.
Rewrite Rules
Per prima cosa, e' necessario inserire le Rewrite Rules necessarie a Drupal, nel file .htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Per mantenere l'associazione dei vecchi permalink ai nuovi articoli, e' sufficiente aggiungere questa semplice RewriteRule al proprio .htaccess:
RewriteCond %{REQUEST_URI}?%{QUERY_STRING} (.*)p=([0-9]+) [NC]
RewriteRule ^index.php$ /index.php?q=node/%2 [R=301,L,NC]
Conclusioni
La procedura di importazione manuale funziona, ma un po' per grazia ricevuta.
E' nata da una necessita' quasi impellente ed e' stata studiata sul campo, cioe' eseguendola.
Per qualunque commento, contattare DElyMyth (http://www.delymyth.net).
Riferimenti