Quelques notes rapides prises lors de la migration de mes albums Gallery 2 vers le plugin WordPress NextGEN Gallery…
Attention : les manipulations de bases de données décrites ici sont dangereuses et il n’y a aucune garantie qu’elles fonctionnent pour vous!
La première différence est terminologique :
- Gallery gère une « galerie » qui est la racine de votre collection de photos et est composée d’albums pouvant être imbriqués les uns dans les autres (les albums sont composés de photos et d’albums).
- NextGEN Gallery gère des « galeries » photos qui sont des ensembles de photos ne pouvant pas être imbriquées les uns dans les autres mais peuvant être groupées dans des « albums » qui peuvent, eux, être imbriqués les uns dans les autres (les galeries sont uniquement composées de photos et les albums sont composés de galeries et d’albums).
Cette différence se retrouve au niveau de la structure des répertoires, puisque les albums de Gallery forment physiquement une structure arborescence sur le système de fichier alors que les galeries de NextGEN Gallery sont toutes aux même niveau et que ses albums ne sont pas matérialisés sur le système de fichier (ils sont virtuels et n’existent que dans la base de données).
Mes albums Gallery avaient tous, c’est une chance, des noms uniques. J’ai donc simplement « aplati » la structure de fichiers après transfert dans wp-content/gallery et utilisé l’interface d’administration de WordPress pour créer les galeries à partir des répertoires que je venais de transférer.
Le nombre d’albums étant limité, je n’ai pas cherché à migrer leur définition et les ai également recréé manuellement dans l’interface d’administration.
Je voulais par contre éviter de perdre les métadonnées associées aux photos et c’est à ce niveau qu’il m’a fallu faire preuve d’un peu de « geekerie »!
J’ai commencé par examiner la base de données Gallery 2 (qui dans mon cas était gérée par MySQL) pour exporter ces métadonnées en XML :
vdv@dedibox4:/var/lib/wordpress_vdv/wp-content/gallery$ mysql -uroot -pXXXX --default-character-set=utf8 -X gallery2_vdv > /tmp/images.xml <<EOF select e.g_id, i.g_description, i.g_keywords, i.g_summary, i.g_title, f.g_pathComponent, fp.g_pathComponent, iam.g_orderWeight from g2_Entity e, g2_Item i, g2_FileSystemEntity f, g2_ChildEntity ce, g2_FileSystemEntity fp, g2_ItemAttributesMap iam where e.g_entityType = "GalleryPhotoItem" and e.g_id = i.g_id and e.g_id = f.g_id and e.g_id = ce.g_id and e.g_id = iam.g_itemId and fp.g_id = ce.g_parentId order by fp.g_pathComponent, iam.g_orderWeight; EOF
A noter :
- L’option « -X » pour formatter les données en XML
- L’option « –default-character-set=utf8 » indispensable dans mon cas pour éviter que MySQL n’insère des caractères ISO-8859-1 dans un document XML sans déclaration d’encodage!
Le document XML obtenu est de la forme :
<?xml version="1.0"?>
<resultset statement="select
e.g_id,
i.g_description,
i.g_keywords,
i.g_summary,
i.g_title,
f.g_pathComponent,
fp.g_pathComponent,
iam.g_orderWeight
from
g2_Entity e,
g2_Item i,
g2_FileSystemEntity f,
g2_ChildEntity ce,
g2_FileSystemEntity fp,
g2_ItemAttributesMap iam
where
e.g_entityType = "GalleryPhotoItem"
and e.g_id = i.g_id
and e.g_id = f.g_id
and e.g_id = ce.g_id
and e.g_id = iam.g_itemId
and fp.g_id = ce.g_parentId
order by fp.g_pathComponent, iam.g_orderWeight" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="g_id">22909</field>
<field name="g_description" xsi:nil="true" />
<field name="g_keywords" xsi:nil="true" />
<field name="g_summary" xsi:nil="true" />
<field name="g_title">dsc00001</field>
<field name="g_pathComponent">aaa.jpg</field>
<field name="g_pathComponent">011120-Forum-XML-2001</field>
<field name="g_orderWeight">1000</field>
</row>
<row>
<field name="g_id">22913</field>
<field name="g_description" xsi:nil="true" />
<field name="g_keywords" xsi:nil="true" />
<field name="g_summary" xsi:nil="true" />
<field name="g_title">dsc00002</field>
<field name="g_pathComponent">aab.jpg</field>
<field name="g_pathComponent">011120-Forum-XML-2001</field>
<field name="g_orderWeight">2000</field>
</row>
...
</resultset>
A partir de ce document XML, j’ai ensuite écrit une transformation XSLT 2.0 pour générer les instructions SQL insérant les données correspondantes dans la base de données WordPress / NextGEN Gallery.
Pour cela, il faut créer les tags en insérant des lignes dans les tables wp_terms et wp_term_taxonomy :
insert into wp_terms (name, slug) values ("albatros d'amsterdam", "albatros d'amsterdam");
insert into wp_term_taxonomy (term_id, taxonomy, parent, count) select term_id, 'ngg_tag', 0, 0 from wp_terms where name = "albatros d'amsterdam";
Associer les tags aux photos et incrémenter les compteurs adéquats :
insert into wp_term_relationships (object_id, term_taxonomy_id, term_order)
select pid, term_taxonomy_id, 1
from
wp_ngg_gallery g,
wp_ngg_pictures p,
wp_terms t,
wp_term_taxonomy taxo
where
p.galleryid = g.gid
and t.term_id = taxo.term_id
and g.title = "amsterdam-vrac"
and p.filename = "crop0011.jpg"
and t.name="albatros d'amsterdam";
update wp_terms t, wp_term_taxonomy taxo set count = count + 1 where t.term_id = taxo.term_id and t.name="albatros d'amsterdam";
Et enfin, mettre à jour les photos elles mêmes :
update wp_ngg_gallery g, wp_ngg_pictures p set p.image_slug = "dsc00001", p.description = "dsc00001", p.alttext = "dsc00001", p.sortorder = 1 where p.galleryid = g.gid and g.title = "011120-Forum-XML-2001" and p.filename = "aaa.jpg";
A noter que je me suis appuyé, là aussi, sur le fait que mes galeries ont des noms uniques et que l’on peut donc identifier les photos à partir de leur nom de fichier et du nom de leur galerie.
La transformation utilise bien entendu le template nommé décrit dans mon billet précédent.
Vous pouvez la télécharger si vous voulez y jeter un coup d’œil.
Une fois la migration achevée, il faut encore veiller à gérer les redirections (cool uris don’t change…), ce que j’ai fait ç grand coups d’expressions régulières :
RedirectMatch 301 ^/gallery/ https://blog.eric.van-der-vlist.com/gallery/? RedirectMatch 301 ^/gallery2/v(/[^/]*)*(/[^/]*/[^/]*\.(jpg|JPG|png)) https://blog.eric.van-der-vlist.com/wp-content/gallery$2? RedirectMatch 301 ^/gallery2/v/(.*)/(slideshow\.html) https://blog.eric.van-der-vlist.com/gallery/$1/? RedirectMatch 301 ^/gallery2/v/(.*) https://blog.eric.van-der-vlist.com/gallery/$1? RedirectMatch 301 ^/gallery2/ https://blog.eric.van-der-vlist.com/gallery/?