Migration de WordPress vers Pelican


Retour sur la migration d’un blog construit avec WordPress pour un site statique généré avec Pelican.

Mais pourquoi ?

Tout simplement pour avoir quelque chose de plus léger… J’avais volontairement gardé mon installation de WordPress minimaliste mais l’outil prends du poids par nature (en tout cas pour des fonctionalités que je n’utilisais pas). Peu de plugins étaient installés mais les temps de chargement ne me convenaient pas (hébergement mutualisé pour du PHP).

Comme j’écrivais déjà mes textes en Markdown pour les convertir en HTML et les coller dans l’éditeur de WordPress, j’ai sauté le pas pour un générateur de contenu statique.

Pelican

Pelican est un générateur de site statique écrit en Python. Il supporte Markdown, AsciiDoc et reStructuredText.
Il en existe une pléthore, les plus connus étant certainement Jekyll et Octopress.
J’ai choisi Pelican car il propose une fonctionalité multilangue, ce qu’il est possible de faire avec les autres mais pas de manière native.

Installation

Pour l’utiliser avec OS X :

brew install python
pip install virtualenv

## Install Pelican
mkdir -p ~/virtualenvs/pelican
virtualenv ~/virtualenvs/pelican
cd ~/virtualenvs/pelican
. bin/activate
pip install pelican
pip install Markdown
pip install beautifulsoup4
pip install typogrify
pip install webassets
pip install cssmin

Sinon l’installation est détaillée ici.

Activer l’environnement Pelican

. ~/virtualenvs/pelican/bin/activate

Quitter l’environnement Pelican

deactivate

Créer un site

Il suffit de lancer pelican-quickstart et de suivre les instructions.

Welcome to pelican-quickstart v3.3.0.

This script will help you create a new Pelican-based website.

Please answer the following questions so this script can generate the files
needed by Pelican.


> Where do you want to create your new web site? [.] blog
> What will be the title of this web site? Jean-Christophe Gay
> Who will be the author of this web site? Jean-Christophe Gay
> What will be the default language of this web site? [en] fr
> Do you want to specify a URL prefix? e.g., http://example.com   (Y/n) Y
> What is your URL prefix? (see above example; no trailing slash) http://jeanchristophegay.com
> Do you want to enable article pagination? (Y/n) Y
> How many articles per page do you want? [10]
> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n) Y
> Do you want an auto-reload & simpleHTTP script to assist with theme and site development? (Y/n) Y
> Do you want to upload your website using FTP? (y/N) N
> Do you want to upload your website using SSH? (y/N) N
> Do you want to upload your website using Dropbox? (y/N) N
> Do you want to upload your website using S3? (y/N) N
> Do you want to upload your website using Rackspace Cloud Files? (y/N) N
Done. Your new project is available at /Users/jcgay/blog

Les source générées:

blog
├── Makefile
├── content
│   ├── (pages)
├── develop_server.sh
├── fabfile.py
├── output
├── pelicanconf.py
└── publishconf.py

2 directories, 5 files

Ajouter du contenu

Les articles doivent être ajoutés dans le dosser content. Il est possible d’extraire le contenu de WordPress pour l’importer dans Pelican : http://docs.getpelican.com/en/3.3.0/importer.html#import

Je ne l’ai pas testé car j’avais déjà des versions Markdown de mes articles. Je me suis contenté d’ajouter les métadonnées nécessaires à Pelican dans mes fichiers .md.

Pour qu’un article soit indexé comme tel par Pelican, il faut ajouter les métadonnées:

Title: git-p4 au secours de Perforce
Date: 2012-03-18 18:10
Category: Scm
Tags: git, git-p4, perforce, p4
Slug: git-p4-au-secours-de-perforce
Author: Jean-Christophe Gay
lang: fr

La propriété slug permettra de conserver les mêmes URLs que celles utilisées par WordPress.

Choisir un thème

Les thèmes sont disponibles dans le repository https://github.com/getpelican/pelican-themes.

Pour le moment j’ai choisi le thème elegant.

Cloner le répository des thèmes Pelican pour pouvoir les utiliser par la suite.

Les plugins

Pelican est extensible par l’intermédiaire de plugins. Ils sont répertoriés dans le repository https://github.com/getpelican/pelican-plugins. Comme pour les thèmes il suffit de cloner le repository dans l’emplacement de son choix.

La liste des plugins que j’ai activé:

  • sitemap : génère un fichier sitemap.xml pour l’indexation.
  • tipue_search : moteur de recherche au sein du site sans utiliser un service tiers.
  • extract_toc : extait une table des matières du contenu d’un article.
  • optimize_images : compresse les images jpeg et png.
  • related_posts : affiche une liste d’article en relation avec l’article lu.
  • summary : défini un résumé de l’article en utilisant le tag <!-- PELICAN_END_SUMMARY --> dans les articles.
  • assets : permet de minifier/compiler les resources statiques.

Configuration

La configuration est séparée en deux fichiers: pelicanconf.py et publishconf.py. Le second surcharge le premier avec les paramètres utilisés lors de la génération du site de production.

Tous les paramètres sont documentés ici.

Je n’ai pas rencontré de difficultés particulières, deux petites astuces quand même.

  1. Pour générer des URLs identiques à celles que j’avais avec WordPress :

    ARTICLE_URL = '{slug}'
    ARTICLE_SAVE_AS = '{slug}/index.html'
    

    Pour chaque article, un dossier est créé avec la valeur de la métadonnée slug contenant un fichier index.html.

  2. Il est possible de copier des fichiers avec la propriété EXTRA_PATH_METADATA :

    EXTRA_PATH_METADATA = {
        'extra/humans.txt': {'path': 'humans.txt'},
        'extra/robots.txt': {'path': 'robots.txt'},
        'extra/.htaccess': {'path': '.htaccess'},
    }
    

Les commentaires

Si vous utilisez le système de commentaires de WordPress, il faut les migrer vers un service externe, par exemple Disqus. C’est déjà ce que j’utilisais mais sinon il suffit d’installer le plugin WordPress.

Pour chacun des articles, ajouter l’identifiant de chaque fil de discussion :

disqus_identifier: 7 http://jeanchristophegay.com/?p=7

C’est supporté par le thème elegant.

Règles de redirection

Il faut réécrire les URLs qui vont disparaitre pour ne pas perdre toutes vos URLs qui se baladent dans la nature.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule feed/?$ feeds/rss.xml [R=301,L]
RewriteRule wp-content/uploads/2013/03/Capture-d’écran-2013-03-09-à-11.24.20-300x182.png images/p4merge-mini.png [R=301,L]
RewriteRule wp-content/uploads/2013/03/Capture-d’écran-2013-03-09-à-11.24.20.png images/p4merge.png [R=301,L]
# Redirect wp-content/uploads/2012/03/git-p4.png to images/git-p4.png
RewriteRule wp-content/uploads/[0-2][0-9][0-9][0-9]/[0-1][0-9]/([^/]+) images/$1 [R=301,L]
# Redirect 2012/04 to archives.html#2012
RewriteRule ([0-2][0-9][0-9][0-9])/[0-1][0-9]/? archives.html#$1 [R=301,NE,L]
# Redirect category/slug/ to categories.html#slug-ref
RewriteRule category/([^/]+)/? categories.html#$1-ref [R=301,NE,L]
# Redirect tag/slug/ to tags.html#slug-ref
RewriteRule tag/([^/]+)/? tags.html#$1-ref [R=301,NE,L]
# Redirect author/jcgay/ to /
RewriteRule author/jcgay/? / [R=301,L]
</IfModule>    

Tester/Publier son site

Pour générer le site, lancer make html && make serve.
Le contenu est généré dans le dossier output et accessible via http://localhost:8000.

Le contenu final est disponible en utilisant make publish. Il ne reste qu’à uploader le contenu en ligne.

Conclusion

Je suis plutôt satisfait du résultat, tout le site est généré à partir d’un simple repository git, celà permet de versionner correctement le contenu du site et j’ai les fonctionalités nécessaires à la publication de quelques articles de temps en temps. Mission Accomplie !


comments powered by Disqus