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)
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 ?
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 ?
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 ?
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.
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
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
Discussions par date d’activité
21 discussions
Bonjour, j’ai fais la manip qui a marché c’est cool , par contre je n’arrive pas a importer les images des articles il y en a des miliers je n’arrive pas pourriez vous m’aider voici le site
www.europalestine.eu
et le nouveau www.europalestine.eu/v2
merci
Répondre à ce message
Bonjour à tous,
Je ne sais pas si ça a été dit, mais voilà une petite requete pour updater le nombre d’articles liés à une catégorie dans la colonne
count
de la table wp_terms_taxonomy .UPDATE
wp_term_taxonomy
TT SET TT.count = ( SELECT count( object_id )FROM
wp_term_relationships
TRWHERE TR.term_taxonomy_id = TT.term_taxonomy_id )
Bonne continuation.
Répondre à ce message
Impossible de faire marcher le fichier import_logos.html ! Quand j’appelle monsite.fr/ ?page=import_logos, cela m’affiche « Contact » qui est le titre d’un article et « test » qui est écrit dans votre squelette. Pas de pagination ni rien d’autres, on dirait que le script ne rentre pas ds la 2e boucle et s’arrête au bout d’un article pour la 1re boucle ...
Bonjour Ben,
En revérifiant, il y avait 2 soucis :
- il faut le plugin Itérateurs, comme on est en spip 2-1, si vous êtes e spip 3 il n’y pas besoin de l’installer.
- il faut éditer le indlude afin de mettre l’url de votre site
include_once("http://localhost:8888/test_pp_spip_2-1-11/ecrire/base/abstract_sql.php");
désigne le code propre à mon test en localPourriez vous tester ces 2 éléments ? J’ai mis à jour l’article également pour rajouter ces infos.
Bonjour,
je bloque également sur le squelette d’importation des logos. Lorsque je lance le squelette (avec « http://localhost/nom_cache/spip.php?page=import_logos », la page reste blanche (ça mouline quelques secondes, la barre de statut affiche « en attente de localhost... » puis ça s’arrête de mouliner, la page reste blanche).
J’utilise wamp sur windows 8.1 avec PHP 5.3.5 sur SPIP 2.1.12 [18732].
Dans Import_logos, j’ai mis include_once("http://localhost:8888/nom_cache/ecrire/base/abstract_sql.php") ;
Un problème avec l’URL de l’include (à noter que j’ai essayé sans mentionner :8888).
Répondre à ce message
alors il suffit de
Répondre à ce message
C’est une bonne initiative. C’est aussi ça la liberté !
Merci beaucoup pour ce tutoriel. Pour ceux qui devraient migrer de SPIP à Wordpress sur deux serveurs différents, je vous conseille d’importer les tables SPIP vers le MySQL du Wordpress et d’importer les tables wp_posts et wp_postmeta vers le MySQL de SPIP. Ceci permet d’utiliser les fichiers squelettes du tutoriel sans trop de problèmes.
Répondre à ce message
Bonjour et merci pour l’article.
Petite question, que faire des brèves selon toi ? Les intégrés comme simple article sous worpdress en créant une catégorie brève ?
bonjour Sullivan,
Je pense effectivement que ce serait ainsi, faire des brèves des posts wp.
apparement Wp permet de spécifier des « types » de post ("en passant, « citation ») et peut être qu’il fadurait modifier la requête afin de gérer le cas des brèves.
à toi d’adapter ensuite en fonction de tes besoins !
Répondre à ce message
J’ai migré le mois dernier un site spip avec plus de 5000 articles, un tas de champs personnalisés, des portfolio, 20 000 commentaires... des tas de plugins. Pas facile, mais ça se fait (2 jours pour tester puis mettre en pratique). je n’ai presque rien perdu ! Beaucoup de requêtes my SQL en effet.
Je précise que le choix de quitter Spip n’est pas dû à une quelconque défaillance du système spip en soi, juste à un manque de temps pour continuer à me former et à faire évoluer le site sous spip que j’étais la seule à maîtriser techniquement et graphiquement.
Bonjour,
Marjorie, peux-tu nous faire part de ta méthode. Je souhaite migrer de spip 3 vers wordpress 3.8. Je bloque à l’importation des documents et des commentaires.
merci
Répondre à ce message
spip 1.8.2 d vers wordpress 3.7.1 fait avec succès en suivant en parti les étape présenté ici. Comme Marjorie, beaucoup plus de requête SQL on été nécessaires mais au finale, presque rien de perdu !
Répondre à ce message
J’ai un site sous SPIP avec peu de contenus. Je n’ai donc pas de gros problèmes de transfert. En revanche, comment fait-on pour conserver le même nom de domaine, le même URL, pendant l’installation du nouveau site WordPress chez le même hébergeur OVH ?
Merci de votre aide.
Répondre à ce message
Hey, petites précisions pour une migration de SPIP 3.1 vers WP 3.6 :
> Faut changer systématiquement id_article par id_objet
> Pour importer les articles faut un peu bidouiller les commandes données (vous aurez des erreurs de la console MySQL). De mémoire il faut enlever les p. et auteur_articles n’existe plus. Il faut la remplacer par spip_auteurs. En fait j’ai pas réussi à migrer les auteurs du tout, j’ai tout fait à la main.
> Il faut créer les catégories dans le panel wordpress à la main avec le même nom et le même slug (allez voir dans wp_terms) afin de les activer.
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 :
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.
Suivre les commentaires : |