Created
September 6, 2014 18:19
-
-
Save mathieumd/8d0db113bac0eec333fd to your computer and use it in GitHub Desktop.
Script de migration d'un site SPIP vers Wordpress (par Jonathan Bersot)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!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> </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&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('# #', '', $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> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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