Cela fait longtemps que je veux me débarrasser de Wordpress pour mon blog. Il y a dix ans, j'avais déjà étudié son remplacement par un générateur de sites statiques.
Je n'ai pas utilisé mon blog depuis plus de dix ans. Donc je peux le transformer en archive publique sous forme de site statique.
Contrainte : conserver le contenu et les URL.
Pour ce genre de manip', j'utilise habituellement le logiciel httrack.
Première étape : effectuer un inventaire. Objectif : voir le travail à réaliser, identifier les éventuelles embûches, etc.
httrack -z --spider http://www.guiguishow.info/.
-z Augmente la verbosité du journal (hts-log.txt), notamment les URL traitées.
Assez vite, en lisant le log, il s'avère qu'il faut exclure wp-content (j'ai déjà ce dossier sous forme statique, donc pas la peine de le traiter), loyaltyactinoid (ma contribution au projet Honeypot qui devient caduque avec un site statique), wp-json et xmlrpc (qui sont des API de WP sur lesquelles butent httrack), « /?p=XXXXX » (qui est un format d'URL dont je ne veux pas), et « /feed/ » pour la raison que je vais expliquer après.
Ça donne : httrack -z --spider http://www.guiguishow.info/ -*/wp-content/* -*loyaltyactinoid* -*wp-json* -*xmlrpc* -*?p=* -*/feed/*.
Pour une raison que j'ignore, httrack refuse d'archiver les flux RSS et le sitemap : « Error: "OK" (-1) » alors que HTTP 200 dans le log du serveur web… J'ai essayé le paramètre « -%a », sans succès (et c'est logique, il ne fait que forcer le contenu de l'entête « Accept » de la requête).
Deuxième étape : archiver.
httrack -z -%F ' ' http://www.guiguishow.info/ -*/wp-content/* -*loyaltyactinoid* -*wp-json* -*xmlrpc* -*?p=* -*/feed/*.
L'option « -%F » permet de virer la pub que httrack insère à la fin de chaque page sauvegardée.
Troisième étape : adaptation et cosmétique. Je me suis inspiré de cet article.
Dans les pages archivées, on trouve plein de choses qui ne vont pas :
DirectoryIndex d'Apache httpd ;On nettoie tout ça (j'ai séparé les commandes sed avec regex simple de celles avec regex avancée) :
find . -name "*.html" -type f | xargs sed -i -e '/Added by HTTrack/d' \
-e '/loyaltyactinoid/d' \
-e '/xmlrpc.php/d' \
-e '/wp-json\//d' \
-e '/\/wp-includes\//d' \
-e "/rel='shortlink'/d" \
-e '/Flux des commentaires/d' \
-e 's#"http://www.guiguishow.info/#"/#g' \
-e 's#index.html##g' \
-e 's#<h1>.*</h1>#<h1><a href="/">GuiGui\&\#039;s show</a></h1>#' \
-e 's#<li ><a href.*ACCUEIL<!--end--></a></li>#<li><a href="/">ACCUEIL</a></li>#' \
-e 's#<li class="page_item page-item-2665"><a href=.*/mentions-legales/">Mentions légales</a></li>#<li class="page_item page-item-2665"><a href="/mentions-legales/">Mentions légales</a></li>#' \
-e 's#<li class="page_item page-item-3582"><a href=".*">TLS</a></li>#<li class="page_item page-item-3582"><a href="/tls/">TLS</a></li>#'
et
find . -name "*.html" -type f | xargs sed -i -r -e 's#<a href="(../)+categorie/#<a href="/categorie/#g' \
-e 's#<a href="(../)+tag/#<a href="/tag/#g' \
-e 's#<a href="(../)+(201[0-9])/#<a href="/\2/#g' \
-e 's#Toute copie de ce site doit mentionner <a href="(../)+">#Toute copie de ce site doit mentionner www.guiguishow.info.#' \
-e 's#http://www.guiguishow.info</a>. Publié#Publié#' \
-e 's#<a href="(../)+administration-reseau/#<a href="/categorie/administration-reseau/#' \
-e 's#<a href="(../)+administration-systeme/#<a href="/categorie/administration-systeme/#' \
-e 's#<a href="(../)+bgp-rpki-roa/#<a href="/categorie/bgp-rpki-roa/#' \
-e 's#<a href="(../)+blog/#<a href="/categorie/blog/#' \
-e 's#<a href="(../)+cinematv/#<a href="/categorie/cinematv/#' \
-e 's#<a href="(../)+assembleur-8086/#<a href="/categorie/developpement/assembleur-8086/#g' \
-e 's#<a href="(../)+developpement/#<a href="/categorie/developpement/#' \
-e 's#<a href="(../)+divers/#<a href="/categorie/divers/#' \
-e 's#<a href="(../)+dns-dnssec/#<a href="/categorie/dns-dnssec/#' \
-e 's#<a href="(../)+openwrt/#<a href="/categorie/hardware/embarque/openwrt#g'`
-e 's#<a href="(../)+embarque/#<a href="/categorie/hardware/embarque/#g' \
-e 's#<a href="(../)+hardware/#<a href="/categorie/hardware/#g' \
-e 's#<a href="(../)+humeur/#<a href="/categorie/humeur/#' \
-e 's#<a href="(../)+jeux-video/#<a href="/categorie/jeux-video/#' \
-e 's#<a href="(../)+logiciels/#<a href="/categorie/logiciels/#' \
-e 's#<a href="(../)+openwrt/#<a href="/categorie/openwrt/#' \
-e 's#<a href="(../)+securite/#<a href="/categorie/securite/#'
Je sais qu'il reste nombre de liens relatifs, notamment les numéros de page, les numéros de jours/mois dans le calendrier, etc. Mais cela reste difficile à substituer automatiquement. Les numéros de pages pourraient peut-être l'être en prenant le contexte, mais le reste… Me prendre trop la tête sur ça n'a pas grand intérêt : les anciennes URLs fonctionnent, peu importe que j'en utilise des nouvelles, relatives, sur mon site web.
Évidemment, ces substitutions sont spécifiques à mon thème et à mes besoins, mais ça peut inspirer.
Pour me simplifier la vie (= éviter le recours à sed), j'ai essayé les options de httrack, notamment « -K », mais ça n'a pas produit le résultat attendu. Le paramètre « -N » influe sur l'arborescence qui sera créée par httrack, mais celle par défaut me convient, ce n'est pas le sujet.
Quatrième étape : sitemap et flux RSS.
Pour le sitemap, wget sur les différentes URL (sitemap.xml pointe vers post-sitemap.xml, etc.).
Pour les RSS, wget. Les renommer feed.xml. Les positionner chacun dans un dossier « feed ». Dans la conf' Apache httpd :
DirectoryIndex index.html feed.xml
<IfModule mod_headers.c>
<FilesMatch "feed.xml$">
Header always set Content-Type "application/rss+xml; charset=utf-8"
</FilesMatch>
</IfModule>
Cinquième étape : nettoyer wp-content.
Supprimer le dossier « languages ».
Dans « themes », supprimer tous les thèmes non-utilisés. Dans le thème utilisé, conserver uniquement les images et les feuilles de style.
Dans « plugins », supprimer tous les plugins inutiles pour l'affichage des pages. Pour ceux restants, conserver uniquement les images et le CSS.
Sixième étape : nettoyer la conf' du serveur web.
Virer tout ce qui est spécifique à Wordpress (réécriture d'URL, permissions, etc.).
Dernière étape : tester les liens.
Même commande qu'à la première étape : httrack -z --spider http://www.guiguishow.info/ -*/wp-content/* -*/feed/*.
On doit obtenir aucune erreur HTTP 404.