{"id":10255,"date":"2014-02-18T06:57:42","date_gmt":"2014-02-18T05:57:42","guid":{"rendered":"http:\/\/flaven.fr\/?p=10255"},"modified":"2014-06-06T06:27:20","modified_gmt":"2014-06-06T04:27:20","slug":"drupal-wordpress-migration-migrer-de-drupal-a-wordpress","status":"publish","type":"post","link":"https:\/\/flaven.fr\/2014\/02\/drupal-wordpress-migration-migrer-de-drupal-a-wordpress\/","title":{"rendered":"Drupal, WordPress, Migration &#8211; Migrer de Drupal \u00e0 WordPress"},"content":{"rendered":"\n<p><!--  Drupal, WordPress, Migration - Migrer de Drupal \u00e0 WordPress --><br \/>\n\t<!--  Drupal, WordPress, Migration, MySQL, Console, CMS, PHP, Symfony --><\/p>\n<p>Qu&#8217;on se le dise, Drupal est un excellent CMS mais c&#8217;est un CMS de &#8220;riches&#8221;. En partant d&#8217;un constat simple, la plupart des \u00e9quipes \u00e9ditoriales ne sont compos\u00e9es souvent que de stagiaires mal pay\u00e9s, voir pas pay\u00e9s du tout, oblig\u00e9s de se former sur le tas&#8230; Bref, souvent consid\u00e9rer \u00e0 tort comme de simples ex\u00e9cutants, des &#8220;petites mains&#8221; dont l&#8217;int\u00e9r\u00eat pour le donneur d&#8217;ordre est que ceux-ci soient le plus rapidement op\u00e9rationnelles et ne posent pas de probl\u00e8me (surtout que la formation ne prenne que 5 minutes)<br \/>\nC&#8217;est la r\u00e9alit\u00e9 du march\u00e9 aujourd&#8217;hui et nous ne sommes ni l\u00e0 pour la d\u00e9plorer mais juste pour la constater. Des gens tout \u00e0 fait honorables n&#8217;h\u00e9sitent pas \u00e0 mentionner ce fait, peu avouable, avec une plus grande prudence langagi\u00e8re certes mais le r\u00e9sultat est le m\u00eame. <b>Il faut que l&#8217;administration soit simple, trivial avec la courbe d&#8217;apprentissage la plus rapide.<\/b><\/p>\n<p>Pour l&#8217;exemple, je vous cite in extenso le 2eme point issu d&#8217;un appel d&#8217;offre.<\/p>\n<blockquote><p>Penser \u00e0 une administration facile pour des administrateurs peu form\u00e9s et avec un turn over important.<\/p><\/blockquote>\n<p>Partant de ce constat, si vous devez r\u00e9pondre \u00e0 un projet de moyenne envergure financi\u00e8re, vous avez tout int\u00e9r\u00eat \u00e0 pr\u00e9coniser ce fait WordPress.<\/p>\n<p><b>Or au grand jeu de la courbe d&#8217;apprentissage, WordPress supplante encore tr\u00e8s largement Drupal.<\/b> Son temps de maitrise est quasi nul, c&#8217;est donc que vous allez pouvoir faire des devis extr\u00eamement agressifs sans vous retrouvez dans une boucle de correctifs et de formation infinie<br \/>\n<b>Paradoxalement, on choisit donc WordPress non pour ces qualit\u00e9s intrins\u00e8ques mais pour son faible co\u00fbt d&#8217;apprentissage face \u00e0 une \u00e9quipe \u00e9ditoriale souvent compose de &#8220;Newbies&#8221;.<\/b><\/p>\n<p>Une fois ce paradoxe \u00e9nonc\u00e9, on va voir comment migrer un site de Drupal vers WordPress. Ce paradoxe risque m\u00eame de se renforcer compte tenu du fait que Drupal 7 va embarquer Symfony sous peu, ce qui ne manquera pas d&#8217;accro\u00eetre la complexit\u00e9 de ce CMS, accroissant de facto son co\u00fbt d&#8217;adoption et de d\u00e9veloppement.<\/p>\n<h4>Migration de Drupal vers WP<\/h4>\n<p>On va partir d&#8217;une BDD wordpress, toute neuve <code>drupal_to_wp<\/code> et la base d&#8217;origine de Drupal se nomme <code>drupal6_17<\/code>.<\/p>\n<p><b>Pour m\u00e9moire, bien remplacer le nom des bases par les v\u00f4tres si vous utilsez les commandes SQL ci-dessous.<\/b><\/p>\n<ul>\n<li>Nom de la BDD WordPress <code>drupal_to_wp<\/code><\/li>\n<li>Nom de la BDD Drupal <code>drupal_to_wp<\/code><\/li>\n<li>Pr\u00e9fixe des tables Drupal <code>d_<\/code><\/li>\n<\/ul>\n<p><b>1. Se connecter au client MySQL (nous sommes sur MAMP en local)<\/b><\/p>\n<pre lang=\"sql\">\r\n  \/Applications\/MAMP\/Library\/bin\/mysql -u root -p\r\n  USE drupal_to_wp;\r\n<\/pre>\n<p><b>2. Cr\u00e9er les cat\u00e9gories sous WP<\/b><\/p>\n<pre lang=\"sql\">\r\n#Create Categories\r\nINSERT INTO drupal_to_wp.wp_term_taxonomy (term_id, taxonomy, description, parent)\r\nSELECT\r\n d.tid `term_id`,\r\n 'category' `taxonomy`,\r\n d.description `description`,\r\n h.parent `parent`\r\nFROM drupal6_17.d_term_data d\r\nINNER JOIN drupal6_17.d_term_hierarchy h\r\n USING(tid);\r\n<\/pre>\n<p><b>3. Cr\u00e9er les taxonomies sous WP<\/b><\/p>\n<pre lang=\"sql\">\r\n#Add Taxonomies\r\n   INSERT INTO drupal_to_wp.wp_term_taxonomy (term_id, taxonomy, description, parent)\r\n   SELECT\r\n    d.tid `term_id`,\r\n    'category' `taxonomy`,\r\n    d.description `description`,\r\n    h.parent `parent`\r\n   FROM drupal6_17.d_term_data d\r\n   INNER JOIN drupal6_17.d_term_hierarchy h\r\n    USING(tid);\r\n<\/pre>\n<p><b>4. Ins\u00e9rer le contenu dans WP<\/b><\/p>\n<pre lang=\"sql\">\r\n# Import posts\/pages\r\nINSERT INTO drupal_to_wp.wp_posts (id, post_date, post_content, post_title, post_excerpt, post_name, post_modified, post_type, `post_status`)\r\nSELECT DISTINCT\r\n n.nid `id`,\r\n FROM_UNIXTIME(n.created) `post_date`,\r\n r.body `post_content`,\r\n n.title `post_title`,\r\n r.teaser `post_excerpt`,\r\n IF(SUBSTR(a.dst, 11, 1) = '\/', SUBSTR(a.dst, 12), a.dst) `post_name`,\r\n FROM_UNIXTIME(n.changed) `post_modified`,\r\n n.type `post_type`,\r\n IF(n.status = 1, 'publish', 'private') `post_status`\r\nFROM drupal6_17.d_node n\r\nINNER JOIN drupal6_17.d_node_revisions r\r\n USING(vid)\r\nLEFT OUTER JOIN drupal6_17.d_url_alias a\r\n ON a.src = CONCAT('node\/', n.nid)\r\nWHERE n.type IN ('post', 'page', 'article');\r\n<\/pre>\n<p><b>5. Convertir les articles en post<\/b><\/p>\n<pre lang=\"sql\">\r\n# Turn articles in to posts\r\nUPDATE drupal_to_wp.wp_posts set post_type='post' where post_type='article';\r\n<\/pre>\n<p><b>6. Indexer les posts dans des cat\u00e9gories WP<\/b><\/p>\n<pre lang=\"sql\">\r\n# Add post to category relationships\r\nINSERT INTO drupal_to_wp.wp_term_relationships (object_id, term_taxonomy_id) SELECT nid, tid FROM drupal6_17.d_term_node;\r\n<\/pre>\n<p><b>7. Mettre \u00e0 jour le nombre de post par cat\u00e9gorie<\/b><\/p>\n<pre lang=\"sql\">\r\n# Update category count\r\nUPDATE drupal_to_wp.wp_term_taxonomy tt\r\nSET `count` = (\r\n SELECT COUNT(tr.object_id)\r\n FROM drupal_to_wp.wp_term_relationships tr\r\n WHERE tr.term_taxonomy_id = tt.term_taxonomy_id);\r\n<\/pre>\n<p><b>8. Importer les commentaires dans WP<\/b><\/p>\n<pre lang=\"sql\">\r\n# Import comments\r\nINSERT INTO drupal_to_wp.wp_comments (comment_post_ID, comment_date, comment_content, comment_parent, comment_author, comment_author_email, comment_author_url, comment_approved)\r\nSELECT nid, FROM_UNIXTIME(timestamp), comment, thread, name, mail, homepage, status FROM drupal6_17.d_comments;\r\n<\/pre>\n<p><b>9. D\u00e9nombrer le nombre de commentaires par post dans WP<\/b><\/p>\n<pre lang=\"sql\">\r\n# Update comment counts\r\nuse wordpress;\r\nUPDATE `wp_posts` SET `comment_count` = (SELECT COUNT(`comment_post_id`) FROM `wp_comments` WHERE `wp_posts`.`id` = `wp_comments`.`comment_post_id`);\r\n<\/pre>\n<p><b>10. R\u00e9parer les d\u00e9g\u00e2ts dans les contenus des posts<\/b><\/p>\n<pre lang=\"sql\">\r\n# Fix breaks in post content\r\nUPDATE drupal_to_wp.wp_posts SET post_content = REPLACE(post_content, '', '');\r\n<\/pre>\n<p><b>11. Fixer les chemin des images<\/b><\/p>\n<pre lang=\"sql\">\r\n# fix images in post content\r\nUPDATE drupal_to_wp.wp_posts SET post_content = REPLACE(post_content, '\"\/files\/', '\"\/wp-content\/uploads\/');\r\n<\/pre>\n<p><b>Il est certain que ces commandes font l&#8217;impasse sur le traitement des utilisateurs (<code>users<\/code>) mais on part du principe que c&#8217;est le squelette ainsi que la chair et le sang du site que l&#8217;on veut migrer fissa par forcement faire de la thanatopraxie !<\/b><\/p>\n<h4>Les choses \u00e0 savoir pour la suite des op\u00e9rations<\/h4>\n<p>A priori, si vous passez l&#8217;ensemble des commandes SQL sans trop de dommages, vous pouvez vous concentrez sur la finalisation de votre migration en ayant en t\u00eate les points suivants.<\/p>\n<ul>\n<li>Toujours conserver un backup des bases respectives de votre Drupal te de votre WordPress<\/li>\n<li>N&#8217;oubliez pas de d\u00e9placer les images notamment du r\u00e9pertoire <code>.\/files<\/code> dans le r\u00e9pertoire <code>.\/wp-content\/uploads<\/code>. Le r\u00e9pertoire de Drupal <code>.\/files<\/code> possed\u00e9 la m\u00eame structure d&#8217;URL que celui de WordPress \u00e0 savoir <code>.\/YYYY\/MM\/DD\/filename<\/code>. Il sera peut-\u00eatre necessaire de renommer manuellement les r\u00e9pertoires. C&#8217;est la partie un peu d\u00e9licate mais bon il faut savoir en passer par l\u00e0 !<\/li>\n<li>Vous aurez sans doute besoin d&#8217;utiliser de constituer une table de redirection ou d&#8217;utiliser par exemple le plugin WordPress Redirection afin de rien perdre des b\u00e9n\u00e9fices SEO de votre ancien site sur Drupal.<\/li>\n<\/ul>\n<p><i>Source : <a href=\"http:\/\/www.mikesmullin.com\/development\/migrate-convert-import-drupal-5-to-wordpress-27\/\" target=\"_blank\">http:\/\/www.mikesmullin.com\/development\/migrate-convert-import-drupal-5-to-wordpress-27\/<\/a> <\/i><\/p>\n<p><b>Conclusion : Migrer un site d&#8217;un CMS \u00e0 un autre n&#8217;est jamais anodin toutefois c&#8217;est parfaitement concevable. Pour avoir con\u00e7u de nombreux sites sous Drupal comme sous WordPress, il est ind\u00e9niable que m\u00eame si la proc\u00e9dure de migration peut vous causer quelque soucis, le gain ensuite que vous obtiendrez dans la formation \u00e0 l&#8217;administration des fameux <code>newbies<\/code> de l&#8217;\u00e9quipe \u00e9ditoriale est incommensurable.<\/b><\/p>\n<h2>En savoir plus<\/h2>\n<ul>\n<li>Moving From Drupal 7 to WordPress 3.3<br \/><a href=\"http:\/\/fuzzythinking.davidmullens.com\/content\/moving-from-drupal-7-to-wordpress-3-3\/\" target=\"_blank\">http:\/\/fuzzythinking.davidmullens.com\/content\/moving-from-drupal-7-to-wordpress-3-3\/<\/a><\/li>\n<li>Migration from Drupal to WordPress<br \/><a href=\"http:\/\/www.allthingscahill.com\/2012\/11\/migration-from-drupal-to-wordpress\/\" target=\"_blank\">http:\/\/www.allthingscahill.com\/2012\/11\/migration-from-drupal-to-wordpress\/<\/a><\/li>\n<li>Drupal to WordPress migration<br \/><a href=\"http:\/\/9seeds.com\/news\/drupal-to-wordpress-migration\/\" target=\"_blank\">http:\/\/9seeds.com\/news\/drupal-to-wordpress-migration\/<\/a><\/li>\n<li>How to Import Drupal Into WordPress<br \/><a href=\"http:\/\/smallbusiness.chron.com\/import-drupal-wordpress-47655.html\" target=\"_blank\">http:\/\/smallbusiness.chron.com\/import-drupal-wordpress-47655.html<\/a><\/li>\n<li>Important Factors to Consider in the WordPress vs. Drupal Debate<br \/><a href=\"http:\/\/premium.wpmudev.org\/blog\/important-factors-to-consider-in-the-wordpress-vs-drupal-debate\/\" target=\"_blank\">http:\/\/premium.wpmudev.org\/blog\/important-factors-to-consider-in-the-wordpress-vs-drupal-debate\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Qu&#8217;on se le dise, Drupal est un excellent CMS mais c&#8217;est un CMS de &#8220;riches&#8221;. En partant d&#8217;un constat simple, la plupart des \u00e9quipes \u00e9ditoriales&hellip; <\/p>\n<p class=\"text-center\"><a href=\"https:\/\/flaven.fr\/2014\/02\/drupal-wordpress-migration-migrer-de-drupal-a-wordpress\/\" class=\"more-link\">Continue reading &rarr; <span class=\"screen-reader-text\">Drupal, WordPress, Migration &#8211; Migrer de Drupal \u00e0 WordPress<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":10257,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"bf_ai_meta_description":"Migrer de Drupal \u00e0 WordPress optimise l'efficacit\u00e9 \u00e9ditoriale. Utilisez des outils sp\u00e9cifiques pour un transfert fluide et des r\u00e9sultats rapides.","bf_ai_og_title":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[3444,3448,3449,3435,3452],"tags":[2221,524,2225,1902,2211,20,182,2223],"class_list":["post-10255","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming-databases","category-tools-productivity","category-tutorials-how-to","category-web-development","category-wordpress-cms","tag-cms","tag-console","tag-drupal","tag-migration","tag-mysql","tag-php","tag-symfony","tag-wordpress"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3Vuhl-2Fp","jetpack_featured_media_url":"https:\/\/flaven.fr\/wp-content\/uploads\/2014\/02\/migrate_drupal_to_wp_bf.jpg","_links":{"self":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10255","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/comments?post=10255"}],"version-history":[{"count":3,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10255\/revisions"}],"predecessor-version":[{"id":10340,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10255\/revisions\/10340"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media\/10257"}],"wp:attachment":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media?parent=10255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/categories?post=10255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/tags?post=10255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}