Ce script WordPress genère un fichier WXR (Wordpress eXtended RSS (WXR))  qui est partiellement documenté sur http://doc.tiki.org/Wordpress+Importer

De plus amples informations sont également disponibles sur
http://ipggi.wordpress.com/2011/03/16/the-wordpress-extended-rss-wxr-exportimport-xml-document-format-decoded-and-explained/
et un exemple sur
http://code.google.com/p/google-blog-converters-appengine/source/browse/trunk/samples/wordpress-sample.wxr

Au lieu d’écrire une page implémentant ce format ou de traduire pour DotClear le script officiel (http://phpcrossref.com/wordpress/wp-admin/export.php.html), j’ai cherché une solution plus facile à mettre en place. DotClear permet également la génération de fichiers de type XML notamment pour le flux RSS – à l’adresse <votre site>index.php?feed/rss2.

La structure de ce fichier XML est assez proche de celle du format WXR et de cet exemple: http://code.google.com/p/google-blog-converters-appengine/source/browse/trunk/samples/wordpress-sample.wxr. Si l’on copie le contenu de ce fichier et le colle dans une requête interceptée dans Burp Proxy, ça marche!

L’idée est la suivante:

  1. Créer un second template XML semblable à celui de RSS2 mais dédié à WXR
  2. Définir un point d’entrée dans DotClear pour cette URL
  3. Adapter le template WXR pour contenir toutes les informations nécessaires à Blurb pour son export.

Dans DotClear 2.3, il suffit de faire une copie du fichier inc/public/default-templates/rss2.xml et de le renommer wxr.xml

Le reste est une comparaison des champs entre le fichier RSS2 et l’exemple WXR mentionné plus haut. Pour restituer tous les champs nécessaires, la documentation des tags de DotClear est d’une grande aide, notamment:

Voici mon fichier wxr.xml une fois les modifications terminées – à noter que l’export des commentaires n’est pas supporté mais ne nécessiterai que quelques tags supplémentaires:

<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="DotClearHack" -->
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="http://wordpress.org/export/1.0/"
>
<channel>
<title><![CDATA[{{tpl:BlogName encode_xml="1"}}{{tpl:SysFeedSubtitle encode_xml="1"}}]]></title>
<link>{{tpl:BlogURL}}</link>
<description>{{tpl:BlogDescription encode_xml="1"}}</description>
<language>{{tpl:BlogLanguage}}</language>
<pubDate>{{tpl:BlogUpdateDate rfc822="1"}}</pubDate>
<copyright>{{tpl:BlogCopyrightNotice encode_xml="1"}}</copyright>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>Dotclear</generator>
<tpl:Entries lastn="1000">
<item>
<title>{{tpl:EntryTitle encode_xml="1"}}</title>
<link>{{tpl:EntryURL}}</link>
<guid isPermaLink="false">{{tpl:EntryFeedID}}</guid>
<pubDate>{{tpl:EntryDate rfc822="1"}}</pubDate>
<dc:creator>{{tpl:EntryAuthorCommonName encode_xml="1"}}</dc:creator>
<tpl:EntryIf has_category="1">
<category>{{tpl:EntryCategory encode_html="1"}}</category>
</tpl:EntryIf>
<description></description>
<!-- WP specific stuff -->
<content:encoded>{{tpl:EntryExcerpt absolute_urls="1" encode_xml="1"}} {{tpl:EntryContent absolute_urls="1" encode_html="1"}}</content:encoded>
<wp:post_id>{{tpl:EntryID}}</wp:post_id>
<wp:post_date>{{tpl:EntryDate format="%Y-%m-%d %T"}}</wp:post_date>
<wp:post_date_gmt>{{tpl:EntryDate format="%Y-%m-%d %T"}}</wp:post_date_gmt>
<wp:comment_status>open</wp:comment_status>
<wp:ping_status>open</wp:ping_status>
<wp:post_name>post-name-value</wp:post_name>
<wp:status>publish</wp:status>
<wp:post_parent>0</wp:post_parent>
<wp:menu_order>0</wp:menu_order>
<wp:post_type>post</wp:post_type>
<wp:post_password></wp:post_password>
</item>
</tpl:Entries>
</channel>
</rss>

Finalement, il a encore fallu ajouter le code suivant en rouge dans /inc/public/lib.urlhandlers.php pour que l’URL soit reconnue et mappée vers le bon fichier de ressource que nous venons de créer:

// dans la fonction feed

if (preg_match('#^rss2/xslt$#',$args,$m))
{
# RSS XSLT stylesheet
self::serveDocument('rss2.xsl','text/xml');
return;
}
if (preg_match('#^wxr$#',$args,$m))
{
# RSS XSLT stylesheet
self::serveDocument('wxr.xml','text/xml');
return;
}

Il nous reste à apporter la dernière touche à Burp pour que la requête d’exportation WordPress atterisse au bon endroit:

POST /wp-admin/export.php\?download=true&author=all

devient

POST /<cheminVersDotClear>/index.php\?feed/wxr

Et voilà!

image

Est-ce vraiment tout?

Malheureusement il y a eu quelques problèmes supplémentaires, non lié à Blurb mais à des vieux articles DotClear qui empêchaient l’export propre de toutes les photos. Ce problème a été adressé via des mises à jour de la base de donnée, mais plus d’informations suivront dans une petite semaine avec le récapitulatif comment faire pour exporter n’importe quel blog DotClear – ou WordPress - dans Blurb Sourire