Export Spip vers Wordpress

Problématique

On souhaite migrer un site spip vers un site wordpress.
Si seul le contenu des articles nous intéresse, on peut très bien utiliser un des plugins de Wordpress permettant d’importer un flux rss, ce flux rss étant créé par Spip.
Cette méthode n’est toutefois pas forcément satisfaisante dans certains cas, car il manque certaines informations (par exemple : documents, commentaire, etc).

Contexte de l’import détaillé ici

Voici le contexte dans lequel a été réalisé cet import :
-  On dispose d’un spip 2.1.12 installé et avec du contenu.
-  Un wordpress 3.5 a été installé au même endroit et est vierge de contenu « véritable ».
C’est à dire que wordpress est installé et contient juste les enregistrements de base créé lors de l’installation de wordpress : catégorie de test, l’article de test, le commentaire de test, etc
-  Le spip et le wordpress ont été installé sur la même base de données

Il se peut que votre contexte à vous soit différent :
-  wp et spip sur des bases de données différentes
-  wp et spip sur des hébergements différents sur le même serveur
-  wp et spip sur des serveurs différents
-  wp a déjà des posts, des categories, des comments, des attachments, etc

Je n’ai pas pu traiter l’ensemble de ces cas, mais les techniques détaillées ici devraient vous permettre d’avoir un début de solutions.

Une solution pour régler ces différents cas serait de faire un export bdd du spip (soit par spip, soit par phpMyadmin), et de réinstaller en local afin d’avoir le même contexte (spip/wp au meme endroit, sur la meme base, etc).
Une fois le contexte local ok, vous lancer la mise à jour détaillée ici avant de faire un export du wordpress afin de tout réimporter sur votre wordpress en ligne.

A lire avant de commencer - Conseils


-  Afin de migrer un spip vers un wordpress, plusieurs étapes sont nécessaires, et doivent réaliser dans l’ordre car il y a des dépendances (comment voulez vous rajouter des commentaires à des posts n’ayant pas encore été créé.)
C’est pourquoi il est vraiment important de respecter l’ordre de ces étapes

-  Avant de faire quoi que ce soit, il est vraiment impératif d’avoir fait au préalable une sauvegarde complète du site en terme de fichiers et de base de données.

-  Cette migration devrait être effectuée sur un serveur de développement et non sur le site en production. Idéalement il faudrait faire cette migration en local. Pour cela il existe plusieurs très bonnes solutions vous permettant d’avoir un serveur un local (wamp, easyphp, mamp, xamp, etc)

Lancer des requêtes dans phpMyAdmin
beaucoup des manipulations à effectuer sont des requêtes mysql. il vous faudra donc les lancer dans votre utilitaire de gestion de base de données,comme par exemple phpMyadmin

Les rubriques en category wp

L’équivalent des rubriques de spip sont les catégories de wordpress.
On fait une première requete afin d’importer les rubriques dans les catégories

REPLACE INTO wp_terms(term_id, name, slug, term_group)
SELECT    id_rubrique, titre, CONCAT("rub",id_rubrique), 1 FROM spip_rubriques;

On fait ensuite une seconde requête, qui va mettre à jour les urls ré écrites des catégories en se basant sur celles des rubriques spip.

UPDATE wp_terms, spip_urls
SET slug = spip_urls.url
WHERE spip_urls.id_objet = term_id
AND spip_urls.type = "rubrique"

Les articles spip en post wp

Une fois la hiérarchie du site « rubriques-catégories » effectuée, on passe aux articles.
Un article au sens spip correspond à un post de wordpress.
Cette première requête permet de convertir les articles en posts.
On concatène ici chapo, descriptif et texte dans l’unique champ de base du post correspondant : post_content.

wordpress permet normalement de rajouter de nouveaux champs via la taxonomy, mais je ne m’y connais pas assez pour créer de nouveaux champs chapeau et descriptif dans les posts.

REPLACE INTO wp_posts(
   ID
   , post_author
   , post_date, post_date_gmt
   , post_content
   , post_title
   #, post_category
   # , post_status
   , to_ping , pinged
   , post_modified, post_modified_gmt

)

SELECT
   p.id_article
   , u.id_auteur
   , p.date, p.date
   , concat(p.chapo, p.descriptif, p.texte)
   , titre
   #, p.id_rubrique
   , '', ''
   , p.date_modif, p.date_modif
FROM
   spip_articles AS p
   LEFT JOIN spip_auteurs_articles AS u ON u.id_article = p.id_article;

Une seconde requête permet de faire l’association « post <=> catégorie » correspondant à « article <=> rubrique »

REPLACE INTO   wp_term_relationships(object_id, term_taxonomy_id)
SELECT  p.id_article, p.id_rubrique FROM spip_articles AS p;

Les commentaires spip en comments wp

Maintenant que nous avons les « articles-posts », on peut import les « forums-comments »
On importe tout d’abord les commentaires en les mettant tous non validés.
Un seconde requete permettra de valider uniquement les comments correspondant aux forums spip publiés

REPLACE INTO wp_comments(
  	 comment_ID
 	, comment_post_ID
	, comment_author
	, comment_author_email
	,comment_author_url
	, comment_date
	, comment_date_gmt
	, comment_content
	, comment_parent
	, comment_approved
)

SELECT
	  id_forum
	, id_article
	, auteur
	, email_auteur
	, url_site
	, date_heure
	, date_heure
	, texte
	, id_parent
	, 0
FROM  spip_forum;

On valide les commentaires qui doivent l’être :

update wp_comments, spip_forum
SET comment_approved = 1
WHERE wp_comments .comment_ID = spip_forum.id_article
AND spip_forum.statut = "publie"

On update le nombre de commentaires par posts, par rapport aux validations précédentes

UPDATE wp_posts
SET comment_count = (SELECT COUNT( * )
from wp_comments, wp_posts WHERE comment_post_ID = ID and comment_approved = 1)

Les documents

Comment est-ce géré chez Spip ?

Documents dans Spip
Tous les documents sont stockés dans le répertoire IMG.

Les logos d’articles sont à la racine de IMG sous la forme de fichier artonID_ARTICLE.extension (en fonction de l’extension de l’image de base uploadée en tant que logo, généralement des jpeg)

Les autres fichiers sont répartis dans des sous répertoires, un par type de fichier (zip, jpg, png, swf, etc)

Comment est-ce géré chez Wordpress ?

Documents dans Wordpress
Chaque document est considéré comme un post, ce post ayant des postmeta particuliere.
Une image, ou un document, ou un logo d’un post wp sera considéré en bdd comme étant un sous post de ce post.
Les documents sont stockés au niveau de wp-content/uploads, et Wordpress crée des répertoires selon les années et les mois.

Comment concilier les 2 lors de l’export ?

Copie de /IMG dans /wp-content/upload
Pour pouvoir gérer l’export spip => Wordpress, il vous faut COPIER le répertoire IMG dans wp-content/upload

Cette manipulation nous permettra de gérer les export de logos d’articles et de documents vers Wordpress

Méthode de mise à jour
Étant donné les opérations nécessaires afin de mettre à jour les données concernant les documents, je suis passé par des squelettes spip ayant une pagination, ce qui permet de traiter par lots (au cas où votre spip aurait beaucoup d’éléments).
J’ai mis par défaut une pagination de 100, mais vous pouvez modifier cette valeur dans le squelette au besoin.

Installation du plugin itérateurs

Afin que les import ssuivants se passent bien, comme nous somme en Spip version 2, ilf aut installer le plugin Itérateurs : http://contrib.spip.net/Les-Iterateurs-pour-SPIP-2-1

Les documents « Image à la Une » = logo d’article

Wordpress permet pour chaque post de choisir ou d’uploader une image comme étant « l’image à la Une » pour ce post, en d’autre termes, le logo de cet article.
Ce traitement chez Spip est séparé artonXX d’un côté, et documents de l’autre) alors que chez wordpress, logo d’article, fichier joint, même combat, il s’agit d’un wp_post.

import_logos à placer dans /squelettes
Il faut mettre ce fichier dans votre répertoire /squelettes, modifier la ligne 8 (le include) avec votre propre url, le lancer dans votre navigateur, puis passer de page en page avec la pagination.
A chaque page affichée, Spip fait les requêtes nécessaires pour les images à la Une.

Les documents liés à un article

import_documents à placer dans /squelettes
Chaque document est un wp_post, ce post est lié à l’article grâce aux informations de wp_post_meta.
Il faut mettre ce fichier dans votre répertoire /squelettes, le lancer dans votre navigateur, puis passer de page en page avec la pagination.
A chaque page affichée, Spip fait les requêtes nécessaires pour les documents affichés.

Pour afficher les fichiers liés à un article, cela dépend de votre thème WordPress.
Beaucoup de thèmes n’affichent pas les documents liés à un post.
C’est pourquoi vous serez sans doute obligé d’éditer votre thème afin de les afficher.
Pour tester rapidement, voici un bout de code que vous pouvez mettre au niveau de l’affichage d’un post (single.php)

<?php 
	echo "<h1>test !</h1>";
	$args = array(
	'post_type' => 'attachment',
	'numberposts' => null,
	'post_status' => null,
	'post_parent' => $post->ID
); 
$attachments = get_posts($args);
if ($attachments) {
	foreach ($attachments as $attachment) {
		echo apply_filters('the_title', $attachment->post_title);
		the_attachment_link($attachment->ID, false);
	}
}
?>

En faisant rapidement une recherche Google, il ya d’autre ssources permettant de gérer l’affichage des documents liés dans WP :
-  http://wp.tutsplus.com/tutorials/creative-coding/sharing-the-wordpress-love-with-non-image-media-attachments/
-  http://www.emmanuelgeorjon.com/wordpress-attachments-107/
-  http://www.eiffair.fr/wordpress/creer-un-theme-wordpress-7-les-templates-single-post-attachment-et-404.htm
-  http://wordpress.stackexchange.com/questions/14937/attachment-page-template-only-show-attachments-for-current-post
-  http://wordpress.stackexchange.com/questions/13916/page-template-for-attachement-page

TO DO :

Ceci est loin d’être parfait, et n’attend que votre aide afin d’être amélioré.

Plusieurs points ne sont pas traités :
-  import des mots clés spip
-  post_meta des images dans wp_postmeta pour des images : apparemment il faudrait aussi un tableau sérialisé avec plusieurs infos
-  tester ces étapes pour un spip 3 vers wordpress 3.5 (dernière version au moment de la rédaction de cet article

Discussion

21 discussions

  • si jamais, j’ai modifié le gist cité plus bas pour ume migration spip 3.0 vers wp 4.9.
    c’est par ici : github

    Répondre à ce message

  • Bonjour,

    Il existe un plugin WordPress qui permet de transférer un site SPIP vers WordPress : FG SPIP to WordPress

    Répondre à ce message

  • 1

    bonsoir. la requete de dyonisos a lair de bien fonctionner. cpendant je suis un peu perdu cote phpMyadmin..
    les requetes s’effectuent elles dans l’onglet query ou dans l’onglet sql ?
    config : WP4.2 spip 3 ?0 ?16 ou 17...
    mac os maverick apache2 php 5 phpmyadmin
    ce que j’ai fait :
    >spip installé correctement apres modif du php.ini dans /etc..
    j’ai installé deux WP un avec sa base propre et un avec la base spip
    j’ai fait les requetes dans « query » dans le WP avec sa base, ce qui n’a pas eu grand effet
    j’ai effectue la requete « dyonisos » dans WP avec base spip dans longlet « sql » ce qui a eu pour effet de modifier la base spip en rajoutant des tables wp_.
    >>il a fallu modifier les guillemets ligne 4 de la requete..
    >RE-GO...
    et voila l’erreur de SQL query :

    Error
    SQL query : Documentation
    REPLACE INTO wp_posts(
    ID
    , post_author
    , post_date, post_date_gmt
    , post_content
    , post_title
    #, post_category
    # , post_status
    , to_ping , pinged
    , post_modified, post_modified_gmt

    )

    SELECT
    p.id_article
    , u.id_auteur
    , p.date, p.date
    , concat(p.chapo, p.descriptif, p.texte)
    , titre
    #, p.id_rubrique
    , ’’, ’’
    , p.date_modif, p.date_modif
    FROM
    spip.spip_articles AS p
    LEFT JOIN spip.spip_auteurs_liens AS u ON u.id_objet = p.id_article ;
    MySQL said : Documentation
    #1054 - Unknown column ’’’’ in ’field list’

    voila.
    en esperant ca donne quelque resultats..
    merci de votre aide.

    • Bonjour,

      Effectivement, ayant du retravailler avec ce script, je suis venu le récupérer ici.
      Et il semblerait que le copier-coller soit problèmatique.
      Il faudra remplacer les guillements français par des guillemets droits « classiques » et remplacement les apostrophes français par des quote simple américaines.

      Il suffit de les remplacer avec la touche normal du clavier dans votre éditeur

    Répondre à ce message

  • 1

    Bonjour à tous,

    Pour résoudre l’import de mon spip vers Wordpress, j’ai finalement utilisé un plugin depuis wordpress que j’ai découvert un peu par hasard : WP All Import

    Ça a vraiment bien marché et il y a plein de réglages d’import à partir du dump xml de spip.

    Pour reprendre tout mon contenu, ça m’a enfin fait gagner du temps parce que je galérais et j’en étais réduit à copier-coller tous les articles (mission longue).

    Merci à tous pour vos contributions.

    • Ça serait sympa de partager tes réglages ;-)

      Merci d’avance.

    Répondre à ce message

  • 5

    Bonjour, j’essaye ne me servir de cette astuce pour envoyer une base spip 3 vers un wordpress 3.8/9 et cela ne marche pas (les tables ne semblent plus être les mêmes dans spip, ni les champs...

    une idée ?

    • Bonjour Al !

      En fait cet article traite d’une migration spip 2.1 vers wordpress, et non d’un spip 3.
      Spip a effectivement beaucoup évolué niveau table entre la version 2 et la version 3 , donc les éléments décrits ici ne sont pas adaptés.
      Il faudrait refaire une version de cet article mais pour la version 3 de spip, et je n’ai malheureusement pas encore eu le temps de le faire.

    • Bonjour,

      Je viens de faire cette migration de Spip 3.0.16 vers WP 4.0.
      Merci pour vos requêtes. Les différences sont assez minimes, cependant voici les requêtes que j’ai executé. J’espère que ça pourra servir à d’autres

      Attention, les tables de Spip sont préfixées par le nom de la base (spip ici).

      UPDATE wp_terms, spip.spip_urls
      SET slug = spip.spip_urls.url
      WHERE spip.spip_urls.id_objet = term_id
      AND spip.spip_urls.type = « rubrique » ;

      REPLACE INTO wp_posts(
      ID
      , post_author
      , post_date, post_date_gmt
      , post_content
      , post_title
      #, post_category
      # , post_status
      , to_ping , pinged
      , post_modified, post_modified_gmt

      )

      SELECT
      p.id_article
      , u.id_auteur
      , p.date, p.date
      , concat(p.chapo, p.descriptif, p.texte)
      , titre
      #, p.id_rubrique
      , ’’, ’’
      , p.date_modif, p.date_modif
      FROM
      spip.spip_articles AS p
      LEFT JOIN spip.spip_auteurs_liens AS u ON u.id_objet = p.id_article ;

      REPLACE INTO wp_term_relationships(object_id, term_taxonomy_id)
      SELECT p.id_article, p.id_rubrique FROM spip.spip_articles AS p ;

      REPLACE INTO wp_comments(
      comment_ID
      , comment_post_ID
      , comment_author
      , comment_author_email
      ,comment_author_url
      , comment_date
      , comment_date_gmt
      , comment_content
      , comment_parent
      , comment_approved
      )

      SELECT
      id_forum
      , id_objet
      , auteur
      , email_auteur
      , url_site
      , date_heure
      , date_heure
      , texte
      , id_parent
      , 0
      FROM spip.spip_forum ;

      update wp_comments, spip.spip_forum
      SET comment_approved = 1
      WHERE wp_comments .comment_ID = spip.spip_forum.id_objet
      AND spip.spip_forum.statut = « publie »
       ;

      UPDATE wp_posts
      SET comment_count = (SELECT COUNT( * )
      from wp_comments WHERE comment_post_ID = ID and comment_approved = 1)
       ;

    • Tout fonctionne presque à merveille pour moi en ce qui attrait à l’import de cette façon (Spip 3 à Wordpress 4), mais je suis confuse au niveau des catégories.

      wp_terms et wp_term_relationships semblent ok, mais wp_term_taxonomy ne possède qu’une seule entrée (probablement la catégorie Non classée, renommer par ma première rubrique de Spip). Ce qui fait que mes articles dans Wordpress ne semble associés à aucune catégorie et qu’il n’y a qu’une seule catégorie dans l’admin de mon Wordpress. Quelqu’un pourrait m’aider à ce propos ? Est-ce que j’ai négligé quelque chose ?

      Je crains aussi de perdre la hiérarchie de mes catégories, mais ce ne serai pas la fin du monde.

      Merci beaucoup de votre aide

    • Je confirme le pbl. signalé par Gabriel.
      L’import fonctionne, excepté pour les catégories qui ne sont pas liées aux posts, et n’apparaissent même pas dans l’interface admin de WP (pourtant, elles sont dans la base dans wp_terms). Comment régler ce pbl. ? C’est crucial dans mon cas pour récupérer une navigation par catégories !
      Merci d’avance pour vos lumières ;)

    • Bonjour,
      J’ai exactement le même problème est ce que vous avez la solution ??? Merci de votre aide

    Répondre à ce message

  • Bonjour,

    Webdesigner freelance je souhaiterais migrer un site SPIP2-1-10 vers wordpress.
    La prestation serait rémunéré, et la deadline est souple (avant la fin de l’été).
    Le site est hébergé sur OVH et comporte 750 articles avec en rubriques et sous-rubriques, reliés également par mots-clés, avec des logos et images, plus raccourcis spip (h3, b, i,...) et documents joints.

    Les personnes interessés peuvent me contacter en MP :
    contact@fraktale.net // 06 14 76 81 72

    Répondre à ce message

  • a propos de spip...
    j’ai le clone en local qui contient tout le site original mais le repertoire IMG est vide.
    ou sont les contenus ?
    merci...

    Répondre à ce message

  • Bonjour à tous, souhaitant migrer un site sous SPIP 1.9 vers WP 4.1, j’ai repris le gist mis à jour. Voir ici
    Au préalable, tous les fichiers avaient été intégrés avec le plugin Ajout à partir d’un serveur pour WP.

    A première vue, la bdd s’est bien remplie. Mais dans la seconde après que j’ai lancé le script, la page du localhost s’est de nouveau affichée, et je n’ai plus qu’une page blanche sur le BO et le FO du WP.

    Donc je suis en local.
    Les tables des 2 CMS sont dans la même base

    Est-ce qu’une bonne âme pourrait me dire comment corriger le tir ?

    Merci d’avance

    Répondre à ce message

  • Pardon pour mon message précédent, erreur de ma part, j’avais essayé sur un dossier ne reprenant que les fichiers sauvegardés du site ... Donc ai recommencé dans le bon répertoire, le script se lance correctement et voici la 1re erreur :
    13 Erreur SELECT spip_auteurs.nom FROM spip_auteurs, spip_auteurs_liens WHERE spip_auteurs_liens.objet = 'article' AND spip_auteurs_liens.id_objet = '13' AND spip_auteurs.id_auteur = spip_auteurs_liens.id_auteur; Table 'hr-wp.spip_auteurs_liens' doesn't exist

    Effectivement, il n’y a pas de table spip_auteurs dans cette version, mais comment corriger la requête ?

    Merci d’avance

    Répondre à ce message

  • Bonjour,
    Je dois réaliser rapidement une migration dans le cadre de mon stage mais je ne sais pas du tout comment m’y prendre. Le SQL de l’article ne marche pas (problème de version je suppose) mais le code donné en commentaire ne marche pas non plus.... Je reçois l’erreur « #1054 - Unknown column ’’’’ in ’field list’ ».
    Est-ce que quelqu’un aurait du temps à accorder à un inconnu pour un coup de main...? Il faut vraiment que je fasse ça rapidement....
    Merci d’avance....

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom