Skip to content

Instantly share code, notes, and snippets.

@mathieumd
Created September 6, 2014 18:19
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mathieumd/8d0db113bac0eec333fd to your computer and use it in GitHub Desktop.
Save mathieumd/8d0db113bac0eec333fd to your computer and use it in GitHub Desktop.
Script de migration d'un site SPIP vers Wordpress (par Jonathan Bersot)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Migrer SPIP vers WordPress </title>
</head>
<body>
<h1>Migration de SPIP vers WordPress </h1>
<p>Attention, il ne faut pas oublier d'importer les documents dans WordPress en utilisant le plugin « Add From Server » </p>
<blockquote>
<p>1. les images des Logo des articles (artonxxx.jpg) et des rubriques (rubonxxx.jpg) à partir de \site spip\IMG</p>
<p>2. les documents joints à partir de \site spip\IMG\jpg et aussi \BMP \GIF \PDF etc...</p>
<p>&nbsp;</p>
</blockquote>
<p>Parce que certaines bases de données sont assez volumineuses, cette routine fonctionne par lot, en indiquand l'ID de l'article de début et l'ID de l'article de fin. Cela permet aussi de faire des tests avec un petit nombre d'articles (un RESET de la base sera nécessaire avant une importation finale). Le début (DEB) et la fin (FIN) doivent être renseignés dans l'url comme par exemple export-wp.php?DEB=1&amp;FIN=99 </p>
<p>
<?php
// ---------------------------------------------------------------------------------
// Migration d'un site SPIP vers WP par Jonathan Bersot (c) 2012-10 V 1.0
//
// Pour adapter cette routine à vos besoins, modifier les variables ci dessous.
//
// Source : http://www.wordpress-fr.net/support/sujet-73045-migration-spip-vers-word-press
//
// Modifications :
// - 2014-09-06 Mathieu MD : Compatible Spip 3.0.17 (et testé vers Wordpress 4.0)
//
// ----------------------------------------------------------------------------------
// Variables de paramètrage général
// connexion à la base de données SPIP
$param_bd_spip_server = "";
$param_bd_spip_dbname = "";
$param_bd_spip_user = "";
$param_bd_spip_password = "";
// connexion à la base de données WordPress
$param_bd_wp_server = "";
$param_bd_wp_dbname = "";
$param_bd_wp_user = "";
$param_bd_wp_password = "";
$param_bd_wp_prefix = "wp_";
//liste des rubriques à exclure de l'importation
$param_rub_exclure = "42";
//liste des rubriques dont les articles seront des pages sous WP et non des post
//$param_rub_page = array("42", "123");
$param_rub_page = array();
// récupération des ID d'Articles (SPIP) à traiter : début et fin
$param_DEB = intval($_GET["DEB"]);
$param_FIN = intval($_GET["FIN"]);
if (($param_FIN-$param_DEB)<1) {
die ('<hr>Erreur : les variables de l\'url DEB et FIN ne sont pas correctes.<br>deb='.$param_DEB.'<br>fin='.$param_FIN);
}
function convertir_bd($vartxt)
// conversion pour défaut de compatibilité UTF-8
{
$result="";
$content=trim($vartxt);
$content = preg_replace('#&nbsp;#', '', $content);
$content = preg_replace('/\[([^->]*?)\]/is','<em>($1)</em>',$content);
$content = str_replace("{{{","<h3>",$content);
$content = str_replace("}}}","</h3>",$content);
$content = str_replace("{{","<strong>",$content);
$content = str_replace("}}","</strong>",$content);
$content = str_replace("{","<em>",$content);
$content = str_replace("}","</em>",$content);
$content = str_replace("[[","(<em>",$content);
$content = str_replace("]]","</em>)",$content);
$content = str_replace("<quote>","<blockquote>",$content);
$content = str_replace("</quote>","</blockquote>",$content);
$content = preg_replace('/\[(.*?)->(.*?)\]/is','<a href="$2">$1</a>',$content);
// à modifier selon le codage de vos bases de données
for ($i = 0; $i <= strlen($content); $i++) {
$car1 = substr($content,$i,1);
if (ord($car1)==192) $car1="À";
if (ord($car1)==193) $car1="Á";
if (ord($car1)==194) $car1="Â";
if (ord($car1)==195) $car1="Ã";
if (ord($car1)==196) $car1="Ä";
if (ord($car1)==198) $car1="Æ";
if (ord($car1)==199) $car1="Ç";
if (ord($car1)==200) $car1="È";
if (ord($car1)==201) $car1="É";
if (ord($car1)==202) $car1="Ê";
if (ord($car1)==203) $car1="Ë";
if (ord($car1)==206) $car1="Î";
if (ord($car1)==207) $car1="Ï";
if (ord($car1)==212) $car1="Ô";
if (ord($car1)==214) $car1="Ö";
if (ord($car1)==219) $car1="Û";
if (ord($car1)==220) $car1="Ü";
if (ord($car1)==224) $car1="à";
if (ord($car1)==225) $car1="á";
if (ord($car1)==226) $car1="â";
if (ord($car1)==228) $car1="ä";
if (ord($car1)==230) $car1="æ";
if (ord($car1)==231) $car1="ç";
if (ord($car1)==232) $car1="è";
if (ord($car1)==233) $car1="é";
if (ord($car1)==234) $car1="ê";
if (ord($car1)==235) $car1="ë";
if (ord($car1)==238) $car1="î";
if (ord($car1)==239) $car1="ï";
if (ord($car1)==242) $car1="ò";
if (ord($car1)==243) $car1="ó";
if (ord($car1)==244) $car1="ô";
if (ord($car1)==246) $car1="ö";
if (ord($car1)==249) $car1="ù";
if (ord($car1)==250) $car1="ú";
if (ord($car1)==251) $car1="û";
if (ord($car1)==252) $car1="ü";
if ($car1=='"') $car1='\"';
if ($car1=="'") $car1="\'";
$result=$result.$car1;
}
return utf8_decode($result);
}
// connextions aux bases de données
$dbwp=mysql_connect($param_bd_wp_server,$param_bd_wp_user,$param_bd_wp_password);
$dbwp2=mysql_select_db($param_bd_wp_dbname,$dbwp) ; //se connecter à la bdd Word Press
$dbspip=mysql_connect($param_bd_spip_server,$param_bd_spip_user,$param_bd_spip_password);
$bdspip2=mysql_select_db($param_bd_spip_dbname,$dbspip) ; //se connecter à la bdd SPIP
echo date('h-i-s')."<br>migration des Articles de ".$param_DEB." à ".$param_FIN."<br>";
// lire les articles de SPIP
$requete = "SELECT spip_articles.*, spip_rubriques.titre as titrerub FROM spip_articles, spip_rubriques WHERE spip_articles.id_article >=".$param_DEB." AND spip_articles.id_article <=".$param_FIN." AND spip_articles.id_rubrique NOT IN (".$param_rub_exclure.") AND spip_articles.id_rubrique=spip_rubriques.id_rubrique AND spip_articles.statut='publie' ORDER BY id_article "; // envoi de la requête
$resultat = mysql_query($requete,$dbspip) or die ('Erreur '.$requete.' '.mysql_error());
// tant qu'il y a un ARTICLE, les instructions dans la boucle s'exécutent
while ($ligne = mysql_fetch_assoc($resultat)) {
$titre = convertir_bd($ligne['titre']);
$content=convertir_bd($ligne['texte']);
$postdate=$ligne['date'];
$rubrique=$ligne['id_rubrique'];
$titre_rubrique=$ligne['titrerub'];
$codeart=$ligne['id_article'];
echo "<hr>".$codeart." ";
// LES AUTEURS
$requeteA = "SELECT spip_auteurs.nom FROM spip_auteurs, spip_auteurs_liens WHERE spip_auteurs_liens.objet = 'article' AND spip_auteurs_liens.id_objet = '".$ligne['id_article']."' AND spip_auteurs.id_auteur = spip_auteurs_liens.id_auteur;";
$resultatA = mysql_query($requeteA,$dbspip) or die ('Erreur '.$requeteA.' '.mysql_error());
// tant qu'il y a un auteur, les instructions dans la boucle s'exécutent
while ($ligneA = mysql_fetch_assoc($resultatA)) {
$auteur= convertir_bd($ligneA['nom']);
$email=convertir_bd($ligneA['email']);
$requete2 = "SELECT * FROM ".$param_bd_wp_prefix."users WHERE user_login='".$auteur."'";
$resultat2 = mysql_query($requete2,$dbwp) or die ('Erreur '.$requete2.' '.mysql_error());
$ligne2 = mysql_fetch_assoc($resultat2);
$postauteur=$ligne2['ID'];
if ($ligne2['user_login']!=$auteur)
{
$requete3 = "INSERT INTO ".$param_bd_wp_prefix."users (user_login,user_nicename,user_email,display_name) VALUES ('".$auteur."','".$auteur."','".$email."','".$auteur."')";
$resultat3 = mysql_query($requete3,$dbwp) or die ('Erreur '.$requete3.' '.mysql_error());
$requete4 = "SELECT * FROM ".$param_bd_wp_prefix."users WHERE user_login='".$auteur."'";
$resultat4 = mysql_query($requete4,$dbwp) or die ('Erreur '.$requete4.' '.mysql_error());
$ligne4 = mysql_fetch_assoc($resultat4);
$postauteur=$ligne4['ID'];
}
}
// MIGRER L'ARTICLE
$requete5 = "SELECT * FROM ".$param_bd_wp_prefix."posts WHERE guid='".$ligne['id_article']."'"; // envoi de la requête
$resultat5 = mysql_query($requete5,$dbwp) or die ('Erreur '.$requete5.' '.mysql_error());
$ligne5 = mysql_fetch_assoc($resultat5);
$wp_posts_ID=$ligne5['ID'];
if ($ligne4['guid']==$codeart)
{
$idpost=$ligne4['ID'];
} else
{
$urlsite=$ligne['url_site'];
//ajouter une lien vers l'url du site
if (strlen($urlsite) > 2) {
$content="<hr><a href=\'".$urlsite."\' target=\'_blank\'>Lien externe</a><hr>".$content;
}
if (in_array($rubrique, $param_rub_page)) {
$post_type="page";
} else {
$post_type="post";
}
$requeteI = "INSERT INTO ".$param_bd_wp_prefix."posts (post_author,post_title,post_name,guid,post_content,post_date,post_date_gmt,post_type) VALUES (".intval($postauteur).",'".$titre."','".$titre."','".$codeart."','".$content."','".$postdate."','".$postdate."','".$post_type."')";
$resultatI = mysql_query($requeteI,$dbwp) or die ('Erreur '.$requeteI.' '.mysql_error());
$requeteI2 = "SELECT * FROM ".$param_bd_wp_prefix."posts WHERE guid = '".$ligne['id_article']."'";
$resultatI2 = mysql_query($requeteI2,$dbwp) or die ('Erreur '.$requeteI2.' '.mysql_error());
$ligneI2 = mysql_fetch_assoc($resultatI2);
$idpost=$ligneI2['ID'];
}
// Le Tag pour la rubrique
//est-ce que la catégorie existe déjà?
$namet = convertir_bd($titre_rubrique);
$namet2=$rubrique;
$requete7 = "SELECT * FROM ".$param_bd_wp_prefix."terms WHERE slug='".$namet2."'";
$resultat7 = mysql_query($requete7,$dbwp) or die ('Erreur '.$requete7.' '.mysql_error());
$ligne7 = mysql_fetch_assoc($resultat7);
$wp_term=$ligne7['term_id'];
if ($ligne7['slug']==$namet2)
{
$termid=$ligne7['term_id'];
// rajouter +1 au compteur
$requeteT3a = "UPDATE ".$param_bd_wp_prefix."term_taxonomy SET count=count+1 WHERE term_id = '".$termid."' and taxonomy = 'category' ";
$resultatT3a = mysql_query($requeteT3a,$dbwp) or die ('Erreur '.$requeteT3a.' '.mysql_error());
$requeteT3 = "SELECT * FROM ".$param_bd_wp_prefix."term_taxonomy WHERE term_id = '".$termid."' and taxonomy = 'category'"; $resultatT3 = mysql_query($requeteT3,$dbwp) or die ('Erreur '.$requeteT3.' '.mysql_error());
$ligneT3 = mysql_fetch_assoc($resultatT3);
$taxonomy=$ligneT3['term_taxonomy_id'];
} else
{
$requeteT = "INSERT INTO ".$param_bd_wp_prefix."terms (name,slug) VALUES ('".$namet."','".$namet2."')";
$resultatT = mysql_query($requeteT,$dbwp) or die ('Erreur '.$requeteT.' '.mysql_error());
$requete8 = "SELECT * FROM ".$param_bd_wp_prefix."terms WHERE slug='".$namet2."'";
$resultat8 = mysql_query($requete8,$dbwp) or die ('Erreur '.$requete8.' '.mysql_error());
$ligne8 = mysql_fetch_assoc($resultat8);
$termid=$ligne8['term_id'];
//création de ".$param_bd_wp_prefix."term taxonomy
$requeteT2 = "INSERT INTO ".$param_bd_wp_prefix."term_taxonomy (term_id,taxonomy,count) VALUES (".$termid.",'category',1)";
$resultatT2 = mysql_query($requeteT2,$dbwp) or die ('Erreur '.$requeteT2.' '.mysql_error());
$requeteT3 = "SELECT * FROM ".$param_bd_wp_prefix."term_taxonomy WHERE term_id = '".$termid."' and taxonomy = 'category'";
$resultatT3 = mysql_query($requeteT3,$dbwp) or die ('Erreur '.$requeteT3.' '.mysql_error());
$ligneT3 = mysql_fetch_assoc($resultatT3);
$taxonomy=$ligneT3['term_taxonomy_id'];
}
//créer la relation du mot clé
if (($taxonomy>0)and($idpost)) {
$requeteT4 = "INSERT INTO ".$param_bd_wp_prefix."term_relationships (object_id,term_taxonomy_id) VALUES (".$idpost.",'".$taxonomy."')";
$resultatT4 = mysql_query($requeteT4,$dbwp) or die ('Erreur '.$requeteT4.' '.mysql_error());
}
// LES MOTS CLES
$requete6 = "SELECT * FROM spip_mots_liens, spip_mots WHERE spip_mots_liens.objet = 'article' AND spip_mots_liens.id_objet = '".$codeart."' AND spip_mots.id_mot = spip_mots_liens.id_mot";
$resultat6 = mysql_query($requete6,$dbspip) or die ('Erreur '.$requete6.' '.mysql_error());
while ($ligne6 = mysql_fetch_assoc($resultat6)) {
//est-ce que le mot existe déjà?
$namet = convertir_bd($ligne6['titre']);
$namet2=$ligne6['id_mot'];
$requete7 = "SELECT * FROM ".$param_bd_wp_prefix."terms WHERE slug='".$namet2."'";
$resultat7 = mysql_query($requete7,$dbwp) or die ('Erreur '.$requete7.' '.mysql_error());
$ligne7 = mysql_fetch_assoc($resultat7);
$wp_term=$ligne7['term_id'];
if ($ligne7['slug']==$namet2)
{
$termid=$ligne7['term_id'];
// rajouter +1 au compteur
$requeteT3a = "UPDATE ".$param_bd_wp_prefix."term_taxonomy SET count=count+1 WHERE term_id = '".$termid."' and taxonomy = 'post_tag' ";
$resultatT3a = mysql_query($requeteT3a,$dbwp) or die ('Erreur '.$requeteT3a.' '.mysql_error());
$requeteT3 = "SELECT * FROM ".$param_bd_wp_prefix."term_taxonomy WHERE term_id = '".$termid."' and taxonomy = 'post_tag'";
$resultatT3 = mysql_query($requeteT3,$dbwp) or die ('Erreur '.$requeteT3.' '.mysql_error());
$ligneT3 = mysql_fetch_assoc($resultatT3);
$taxonomy=$ligneT3['term_taxonomy_id'];
} else
{
$requeteT = "INSERT INTO ".$param_bd_wp_prefix."terms (name,slug) VALUES ('".$namet."','".$namet2."')";
$resultatT = mysql_query($requeteT,$dbwp) or die ('Erreur '.$requeteT.' '.mysql_error());
$requete8 = "SELECT * FROM ".$param_bd_wp_prefix."terms WHERE slug='".$namet2."'";
$resultat8 = mysql_query($requete8,$dbwp) or die ('Erreur '.$requete8.' '.mysql_error());
$ligne8 = mysql_fetch_assoc($resultat8);
$termid=$ligne8['term_id'];
//création de ".$param_bd_wp_prefix."term taxonomy
$requeteT2 = "INSERT INTO ".$param_bd_wp_prefix."term_taxonomy (term_id,taxonomy,count) VALUES (".$termid.",'post_tag',1)";
$resultatT2 = mysql_query($requeteT2,$dbwp) or die ('Erreur '.$requeteT2.' '.mysql_error());
$requeteT3 = "SELECT * FROM ".$param_bd_wp_prefix."term_taxonomy WHERE term_id = '".$termid."' and taxonomy = 'post_tag'";
$resultatT3 = mysql_query($requeteT3,$dbwp) or die ('Erreur '.$requeteT3.' '.mysql_error());
$ligneT3 = mysql_fetch_assoc($resultatT3);
$taxonomy=$ligneT3['term_taxonomy_id'];
}
//créer la relation du mot clé
if (($taxonomy>0)and($idpost)) {
$requeteT4 = "INSERT INTO ".$param_bd_wp_prefix."term_relationships (object_id,term_taxonomy_id) VALUES (".$idpost.",'".$taxonomy."')";
$resultatT4 = mysql_query($requeteT4,$dbwp) or die ('Erreur '.$requeteT4.' '.mysql_error());
}
}
//Gérer le logo de l'article
$filename = 'arton'.$codeart;
$filename2 = 'arton'.$codeart.".jpg";
//est-ce que le logo existe (a été importé avec Add From Server)
$requeteL = "SELECT * from ".$param_bd_wp_prefix."postmeta WHERE meta_value LIKE '%".$filename."%' AND meta_key='_wp_attached_file'";
$resultatL = mysql_query($requeteL,$dbwp) or die ('Erreur '.$requeteL.' '.mysql_error());
$ligneL = mysql_fetch_assoc($resultatL);
$idpostL=$ligneL['post_id'];
if ($idpostL>0) {
$requeteIp6 = "INSERT INTO ".$param_bd_wp_prefix."postmeta (post_id,meta_key,meta_value) VALUES (".$idpost.",'_thumbnail_id','".$idpostL."')";
$resultatIp6 = mysql_query($requeteIp6,$dbwp) or die ('Erreur '.$requeteIp6.' '.mysql_error());
} else {
// utiliser le logo de la rubrique s'il existe
$filename = 'rubon'.$rubrique;
$filename2 = 'rubon'.$rubrique.".jpg";
//est-ce que le logo de la rubrique existe (a été importé avec Add From Server)
$requeteLr = "SELECT * from ".$param_bd_wp_prefix."postmeta WHERE meta_value LIKE '%".$filename."%' AND meta_key='_wp_attached_file'";
$resultatLr = mysql_query($requeteLr,$dbwp) or die ('Erreur '.$requeteLr.' '.mysql_error());
$ligneLr = mysql_fetch_assoc($resultatLr);
$idpostL=$ligneLr['post_id'];
if ($idpostL>0) {
$requeteIp6 = "INSERT INTO ".$param_bd_wp_prefix."postmeta (post_id,meta_key,meta_value) VALUES (".$idpost.",'_thumbnail_id','".$idpostL."')";
$resultatIp6 = mysql_query($requeteIp6,$dbwp) or die ('Erreur '.$requeteIp6.' '.mysql_error());
}
}
//Gérer les documents et images de l'article (portfolio SPIP)
$requeteD = "SELECT * FROM `spip_documents`,`spip_documents_liens` WHERE spip_documents_liens.id_objet = ".$codeart." and spip_documents_liens.objet='article' and spip_documents_liens.id_document=spip_documents.id_document";
$resultatD = mysql_query($requeteD,$dbspip) or die ('Erreur '.$requeteD.' '.mysql_error());
// tant qu'il y a un auteur, les instructions dans la boucle s'exécutent
$premier=0;
while ($ligneD = mysql_fetch_assoc($resultatD)) {
$filename=$ligneD['fichier'];
//est-ce que le document existe (a été importé avec Add From Server)
$recherche=substr($filename,4);
$l=strlen($recherche)-4;
$recherche=substr($recherche,0,$l);
$requeteL = "SELECT * from ".$param_bd_wp_prefix."postmeta WHERE meta_value LIKE '%".$recherche."%' AND meta_key='_wp_attached_file'";
$resultatL = mysql_query($requeteL,$dbwp) or die ('Erreur '.$requeteL.' '.mysql_error());
$ligneL = mysql_fetch_assoc($resultatL);
$idpostL=$ligneL['post_id'];
if ($idpostL>0) {
//si première fois, rajouter [gallery] au post
if ($premier==0) {
$requeteL3 = "UPDATE ".$param_bd_wp_prefix."posts SET post_content= CONCAT(post_content,'[gallery]') WHERE ID = ".$idpost." ";
$resultatL3 = mysql_query($requeteL3,$dbwp) or die ('Erreur '.$requeteL3.' '.mysql_error());
$premier=1;
}
$requeteL2 = "UPDATE ".$param_bd_wp_prefix."posts SET post_parent=".$idpost." WHERE ID = ".$idpostL." ";
$resultatL2 = mysql_query($requeteL2,$dbwp) or die ('Erreur '.$requeteL2.' '.mysql_error());
$requeteIp6 = "INSERT INTO ".$param_bd_wp_prefix."postmeta (post_id,meta_key,meta_value) VALUES (".$idpost.",'_thumbnail_id','".$idpostL."')";
$resultatIp6 = mysql_query($requeteIp6,$dbwp) or die ('Erreur '.$requeteIp6.' '.mysql_error());
}
}
}
?>
</p>
<hr />
Fin de procédure, tout s'est bien déroulé.
</body>
</html>
@sirius82
Copy link

Bonjour, merci pour ce gist. Je l'ai fait fonctionner avec quelques adaptations pour un spip 1.9 et ça a l'air de bien marcher. Sauf que ... les images logo ne sont pas dans les bons articles et les ne sont pas interprétés.
Est-il possible d'avoir l'un ou l'autre conseil ?
Merci

@egavard
Copy link

egavard commented Oct 3, 2015

Bravo et merci pour ce Gist !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment