source: spip-zone/_plugins_/wp_import/trunk/formulaires/import_wordpress.php @ 109960

Last change on this file since 109960 was 109960, checked in by peetdu@…, 3 years ago

Normalisation répertoires / fichiers SPIP 3.x
+ nouvelle gestion de l’import
+ un peu de doc

  • Property svn:executable set to *
File size: 14.6 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7include_spip('inc/wp_import_api');
8
9
10
11
12
13// A utiliser en DEV pour importer uniquement les NB_ARTICLES
14// define("NB_ARTICLES", 20);
15
16function formulaires_import_wordpress_charger_dist() {
17
18$valeurs['mes_saisies'] = array(
19       
20        array(
21                'saisie' => 'input',
22                'options' => array(
23                        'nom' => 'document_xml',
24                        'label' => _T('wp_import:document_xml_label'),
25                        'explication' => _T('wp_import:document_xml_explication'),
26                        'obligatoire' => 'oui'
27                )),
28        array(
29                'saisie' => 'case',
30                'options' => array(
31                        'nom' => 'auteurs',
32                        'label' => _T('wp_import:auteurs_label'),
33                        'explication' => _T('wp_import:auteurs_explication')
34                )),
35        // array(
36        //      'saisie' => 'case',
37        //      'options' => array(
38        //              'nom' => 'rubriques',
39        //              'label' => _T('wp_import:rubriques_label'),
40        //              'explication' => _T('wp_import:rubriques_explication')
41        //      )),
42        // array(
43        //      'saisie' => 'input',
44        //      'options' => array(
45        //              'nom' => 'id_parent',
46        //              'label' => _T('wp_import:id_parent_label'),
47        //              'explication' => _T('wp_import:id_parent_explication'),
48        //              'defaut' => 0
49        //      )),
50        array(
51                'saisie' => 'case',
52                'options' => array(
53                        'nom' => 'documents',
54                        'label' => _T('wp_import:documents_label'),
55                        'explication' => _T('wp_import:documents_explication')
56                )),
57        array(
58                'saisie' => 'case',
59                'options' => array(
60                        'nom' => 'articles',
61                        'label' => _T('wp_import:articles_label'),
62                        'explication' => _T('wp_import:articles_explication')
63                )),
64        array(
65                'saisie' => 'case',
66                'options' => array(
67                        'nom' => 'forum',
68                        'label' => _T('wp_import:forum_label'),
69                        'explication' => _T('wp_import:forum_explication')
70                )),
71        // array(
72        //      'saisie' => 'radio',
73        //      'options' => array(
74        //              'nom' => 'forum_config',
75        //              'label' => _T('wp_import:forum_config_label'),
76        //              'explication' => _T('wp_import:forum_config_explication'),
77        //              'afficher_si' =>  '@forum@=="on"'
78        //      )),
79       
80        // array(
81        //      'saisie' => 'case',
82        //      'options' => array(
83        //              'nom' => 'motcle',
84        //              'label' => _T('wp_import:motcle_label'),
85        //              'explication' => _T('wp_import:motcle_explication')
86        //      ))
87    );
88
89    return $valeurs;
90}
91
92
93// function formulaires_import_wordpress_verifier_dist() {
94//      $erreurs = array();
95//      $fichier = _DIR_TMP . _request('document_xml');
96
97//      $fichiers = "../tmp/afap.wordpress.2018-04-06.xml";
98//      if (_request('document_xml')) {
99//              if (!file_exists($fichier)) {
100//                      $erreurs['document_xml'] = _T('wp_import:erreur_fichier', array('fichier' => "$fichier"));
101//                      $erreurs['message_erreur'] = _T('wp_import:erreur_generale');
102//              }
103//      }
104//      else {
105//              $erreurs['document_xml'] = _T('wp_import:erreur_fichier_vide');
106//      }
107//      return $erreurs;
108// }
109
110
111// https://code.spip.net/@inc_editer_mot_dist
112function formulaires_import_wordpress_traiter_dist() {
113
114        // Lancer l'importation
115    list($message, $erreurs) = wp_import_import_wordpress();
116
117    $retour['editable'] = true;
118    if (count($erreurs) == 0) {
119        $retour['message_ok'] = $message;
120    }
121    else {
122        $retour['message_erreur'] = implode('<br />', $erreurs);
123    }
124    return $retour;
125}
126
127function wp_import_import_wordpress() {
128
129        $chemin_temp = sous_repertoire(_DIR_TMP, 'wordpress');
130        //$chemin_fichier = _DIR_TMP . _request('document_xml');
131        $chemin_fichier = "../tmp/afap.wordpress.2018-04-06.xml";
132        include_spip('inc/getdocument');
133
134        if (file_exists($chemin_fichier)) {
135
136                include_spip('inc/xml');
137                include_spip('sale_fonctions');
138       
139
140                $tab_document = array();
141
142                $arbre = spip_xml_load($chemin_fichier);
143                $arbre = array_shift($arbre);
144                $arbre = $arbre[0]['channel'][0];
145
146                // On commence par les auteurs, rubriques, documents, mot-clés
147                if (_request('auteurs') or _request('rubriques') or _request('motcle')) {
148                        foreach ($arbre as $type => $a) {
149                                // spip_log("Type : $type  ", "wp_import" . _LOG_INFO_IMPORTANTE);
150
151                                switch ($type) {
152
153                                        // Importation des auteurs
154                                        case 'wp:author':
155                                                if (!_request("auteurs")) {
156                                                        break; //sortir de suite si l'on n'a pas coché l'importation des auteurs
157                                                }
158                                                wp_import_auteurs($a);
159                                                break;
160
161                                        // Importation des rubriques
162                                        case "wp:category":
163                                                if (!_request("rubriques")) {
164                                                        break; // sortir de suite si l'on n'a pas coché l'importation des rubriques
165                                                }
166                                                wp_import_rubriques($a);
167                                                break;
168
169                                        case "wp:term":
170                                                //sortir de suite si l'on n'a pas coché l'importation des mots-clés
171                                                if (!_request("motcle")) {
172                                                        break;
173                                                }
174                                                wp_import_mots_cles($item);
175                                                break;
176                                       
177                                        // case "item":
178                                        //      foreach ($a as $item) {
179                                        //              spip_log("post_type : " . $item['wp:post_type'][0], "wp_import" . _LOG_INFO_IMPORTANTE);
180                                        //              $objet = wp_import_twp($item['wp:post_type']['0']);
181
182                                        //              switch ($objet) {
183                                        //                      case 'attachment':
184                                        //                              wp_import_documents($item);
185                                        //                              break;
186                                        //              }
187                                        //      }
188                                        //      break;
189                                }
190                        }
191                }
192
193                // On continue avec les articles (puisqu'on a maintenant les documents dans la médiathèque)
194                if (_request("articles")) {
195               
196                        foreach ($arbre as $type => $a) {
197                                // spip_log("Type : $type  ", "wp_import" . _LOG_INFO_IMPORTANTE);
198
199                                switch ($type) {
200                                        // Importation des articles, pages, documents, sujets de forums et réponses asscosiés.
201                                        case "item":
202
203                                                foreach ($a as $item) {
204                                                        // spip_log("post_type : " . $item['wp:post_type'][0], "wp_import" . _LOG_INFO_IMPORTANTE);
205                                                        $objet = wp_import_twp($item['wp:post_type']['0']);
206
207                                                        switch ($objet) {
208                                                                case 'post':    // articles de blog, mais des fois traiter dans WP comme actus
209                                                                //case 'page':  // articles (peut être transformé en Page Uniques (voir plugin éponyme))
210                                                                case 'topic':   // articles aux sens SPIP, mais en fait ce sont des Sujets de Forum
211                                                                        wp_import_articles($item, $objet);
212                                                                        break;
213                                                        }
214                                                }
215                                                break;
216                                }
217                        }
218                }
219
220                // finir avec les forums (puisqu'on a maintenant les articles)
221                if (_request("forum")) {
222                        // faire le tableau des correspondances parent_wp <-> id_article
223                        // $res = sql_allfetsel('id_article, accepter_forum ', 'spip_articles', "accepter_forum != 'non'");
224                        // foreach ($res as $key => $value) {
225                        //      $correspondance[$value['accepter_forum']] = $value['id_article'];
226                        // }
227                       
228                        // debug($correspondance);
229
230                        foreach ($arbre as $type => $a) {
231                                if ($type == 'item') {
232                                        foreach ($a as $item) {
233                                                $objet = wp_import_twp($item['wp:post_type']['0']);
234                                                if ($objet == 'reply') {
235                                                        wp_import_forum($item, $correspondance);
236                                                }
237                                        }
238                                }
239                        }
240                }
241        }
242
243    if (empty($erreurs)) {
244        $message = "Le contenu de votre site Wordpress a bien été importé";
245    }
246
247    return array($message, $erreurs);
248}
249
250/**
251 * Import des auteurs (wp_author - auteurs spip)
252 *
253 * @authors xml : l'ensemble des authors WP
254 * @return string : le nombre d'auteurs enregistrés
255 */
256function wp_import_auteurs($authors) {
257        include_spip('action/editer_auteur');
258
259        foreach ($authors as $auteur) {
260                $nom = wp_import_twp($auteur['wp:author_display_name'][0]);
261                $nom = empty($nom) ? $auteur['wp:author_login'][0] : $nom;
262                $data_auteur = array(
263                        'login'         => wp_import_twp($auteur['wp:author_login'][0]),
264                        'email'         => wp_import_twp($auteur['wp:author_email'][0]),
265                        'statut'        => '1comite',
266                        'nom'           => $nom
267                );
268                $id_auteur = auteur_inserer();
269                auteur_modifier($id_auteur, $data_auteur);
270                $tab_auteur[$auteur['wp:author_login'][0]] = $id_auteur;
271                spip_log("Auteur $id_auteur créé ( " . $auteur['wp:author_login'][0] . " ) ", "wp_import" . _LOG_INFO_IMPORTANTE);
272                $cpt_auteurs++;
273        }
274}
275
276/**
277 * Import des category (wp_category -> rubriques spip)
278 * Attention : cette logique [category = rubrique] n'est pas toujours respectée
279 *
280 * @authors xml : l'ensemble des authors WP
281 * @return string : le nombre d'auteurs enregistrés
282 */
283function wp_import_rubriques($category) {
284        include_spip('action/editer_rubrique');
285        $id_parent_rubrique = _request("id_parent");
286        foreach ($a as &$cat) {
287                $data_rub = array(
288                'titre' => wp_import_twp($cat['wp:cat_name'][0]),
289                'id_parent' => "$id_parent_rubrique"
290                );
291                $id_rub = rubrique_inserer($id_parent_rubrique);
292                spip_log("Création rubrique $id_rub (id_parent : $id_parent_rubrique) (" . wp_import_twp($cat['wp:cat_name'][0]) . ") ", "wp_import" . _LOG_INFO_IMPORTANTE);
293                $cat["id"] = $id_rub;
294                $tab_cat[$cat['wp:category_nicename'][0]] = $id_rub;
295                rubrique_modifier($id_rub, $data_rub);
296        }
297        foreach ($a as $cat) {
298                $id_parent = $tab_cat[wp_import_twp($cat['wp:category_nicename'][0])] + 0;
299                spip_log("Modif rubrique parent $id_parent ) ", "wp_import" . _LOG_INFO_IMPORTANTE);
300
301                $data_rub = array('id_parent' => $id_parent);
302                rubrique_modifier($cat["id"], $data_rub);
303        }
304}
305
306/**
307 * Import des articles (item[post, page, topic] -> article spip)
308 *
309 * @article_wp xml : un article WP
310 * @objet string : soit un post, une page, un topic
311 * @return string : le nombre d'auteurs enregistrés
312 */
313function wp_import_articles($article_wp, $objet) {
314        include_spip('action/editer_article');
315        include_spip('action/editer_auteur');
316
317        static $compteur_post = 0;
318        static $compteur_page = 0;
319        static $compteur_topic = 0;
320
321        // récuperation des données
322        $set_article = array(
323                'titre'                 => $article_wp['title'][0],
324                'descriptif'    => wp_import_twp($article_wp['description'][0]),
325                'texte'                 => sale(wp_import_twp($article_wp['content:encoded'][0]), $tab_document),
326                'date'                  => wp_import_twp($article_wp['wp:post_date'][0]),
327                'date_modif'    => wp_import_twp($article_wp['wp:post_date'][0]),
328                'accepter_forum' => 'non',
329                'statut' => 'prepa',
330        );
331
332        // Gestion du rubriquage
333        switch ($objet) {
334                case 'post':
335                        $set_article['id_rubrique'] = 1;
336                        $set_article['id_secteur'] = 1;
337                        $compteur_post++;
338                        break;
339                case 'page':
340                        $set_article['id_rubrique'] = 2;
341                        $set_article['id_secteur'] = 2;
342                        $compteur_page++;
343                        break;
344                case 'topic':
345                        $set_article['id_rubrique'] = 3;
346                        $set_article['id_secteur'] = 3;
347                        $compteur_topic++;
348                        break;
349        }
350       
351        // gestion du statut
352        $status_wp = wp_import_twp($article_wp['wp:status'][0]);
353        if ($status_wp == 'publish') {
354                $set_article['statut'] = 'publie';
355        }
356        else {
357                $set_article['statut'] = 'prepa';
358        }
359
360        // On insère…
361        $id_article = sql_insertq('spip_articles', $set_article);
362        //article_modifier($id_article, $set_article);
363
364        // gestion des forums : creer un table de correspondance si récupération des forums demandée
365        global $tab_forum;
366        if ($objet == 'topic') {
367                $id_wp_parent = $article_wp['wp:post_id'][0];
368                $tab_forum[$id_wp_parent] = $id_article;
369        }
370       
371        // Lier l'auteur : on se base sur le login car avec SPIP, on est sûr de l'unicité de ce champ
372        $login_auteur = wp_import_twp($article_wp['dc:creator'][0]);
373        $id_auteur = sql_getfetsel('id_auteur', 'spip_auteurs', 'login='.sql_quote($login_auteur ));
374        $res = auteur_associer($id_auteur, array('article' => $id_article));
375
376        $message_retour = 'à faire';
377        return $message_retour;
378       
379}
380
381/**
382 * Import des réponses aux sujets posés (item[reply] -> forum spip)
383 * Il s'agit ici de lier les réponses aux articles identifiés comme étant des sujets
384 *
385 * @reply_wp : un item[reply] WP
386 *
387 * @return string : le nombre de reply enregistré
388 */
389function wp_import_forum($reply_wp, $correspondance) {
390        include_spip('inc/forum');
391        global $tab_forum;
392
393        $id_wp_parent = $reply_wp['wp:post_parent'][0];
394        $id_article = $tab_forum[$id_wp_parent];
395
396        // debug($id_wp_parent);
397        // debug($id_article);
398
399
400        // récupérer les infos de l'auteur
401        $login_auteur = wp_import_twp($reply_wp['dc:creator'][0]);
402        $auteur = sql_fetsel('id_auteur, nom, email', 'spip_auteurs', 'login='.sql_quote($login_auteur));
403
404        // recuperer la date
405        $date =  wp_import_twp($reply_wp['wp:post_date'][0]);
406
407        // récuperation des données
408        $set_forum = array(
409                'id_objet' => $id_article,
410                'objet' => 'article',
411                'date_heure' => $date,
412                'date_thread' => $date,
413                'titre' => $reply_wp['title'][0],
414                'texte' => sale(wp_import_twp($reply_wp['content:encoded'][0]), $tab_document),
415                'auteur' => $auteur['nom'],
416                'email_auteur' => $auteur['email'],
417                'statut' => 'publie',
418                'id_auteur' => $auteur['id_auteur'],
419        );
420
421        // Insertion des forums
422        $id_forum = sql_insertq('spip_forum', $set_forum);
423
424        // mise à jour de la valeur id_thread = id_forum
425        $res = sql_updateq('spip_forum', array('id_thread' => $id_forum), 'id_forum='.intval($id_forum));
426
427}
428
429
430/**
431 * Import des documents (images, fichiers pdf, etc.)
432 *
433 * @attachement_wp : un item[attachement] WP
434 *
435 * @return string : le nombre de document enregistré jusque là
436 */
437function wp_import_documents($attachement_wp) {
438        include_spip("action/ajouter_documents");
439
440        $data_document = array(
441                'titre'                 => $attachement_wp['title'][0],
442                'descriptif'    => wp_import_twp($attachement_wp['description'][0]),
443                'date'                  => $attachement_wp['post_date'][0]
444        );
445
446        $fichier = $attachement_wp['wp:attachment_url'][0];
447        $result = array();
448        $path_parts = pathinfo($attachement_wp['wp:attachment_url'][0]);
449        $e = $path_parts['extension'];
450        $mode = strpos($GLOBALS['meta']['formats_graphiques'], $e) === false ? 'document' : 'image';
451
452        $tmp_name               = basename($attachement_wp['wp:attachment_url'][0]);
453        $nom_fichier    = basename($attachement_wp['wp:attachment_url'][0]);
454        $chemin_temp_document = sous_repertoire($chemin_temp, 'uploads');
455        if (file_exists($chemin_temp_document . $nom_fichier)) {
456                $tmp_name = $chemin_temp_document . $nom_fichier;
457        }
458        else {
459                $tmp_name = $attachement_wp['wp:attachment_url'][0];
460        }
461
462        $file = array('tmp_name' => $tmp_name,
463                'name' => $nom_fichier,
464                'titrer' => true,
465                'distant' => false,
466                'mode' => 'document'
467        );
468
469        $ajouter_un_document = charger_fonction('ajouter_un_document', 'action');
470        $id_document = $ajouter_un_document(0, $file, '', 0, 'document');
471        document_modifier($id_document, $data_document);
472
473        $tab_document[basename($attachement_wp['wp:attachment_url'][0])] = $id_document;
474}
475
476function wp_import_mots_cles($term_wp) {
477        include_spip("action/editer_mot");
478        include_spip("action/editer_groupe_mots");
479        include_spip("action/editer_objet");
480
481        foreach ($a as &$term) {
482                $id_groupe = 0;
483                $titre_groupe = $term['wp:term_taxonomy'][0];
484                if ($sql_groupe_mot = sql_fetsel('id_groupe', "spip_groupes_mots", "titre=" . sql_quote($titre_groupe))) {
485                        $id_groupe = $sql_groupe_mot['id_groupe'];
486                } 
487                else {
488                        //Création du groupe de mot
489                        $data = array('titre' => $titre_groupe);
490                        //$id_groupe = groupe_mots_inserer( $data);
491                        $id_groupe = objet_inserer("groupe_mots");
492                        groupe_mots_modifier($id_groupe, $data);
493                        spip_log("Création groupe_mot $id_groupe ( $titre_groupe)  ", "wp_import" . _LOG_INFO_IMPORTANTE);
494                }
495        }
496
497        //Création du mot
498        $data = array(
499        'titre' => wp_import_twp($term['wp:term_name'][0]),
500        'id_groupe' => $id_groupe);
501
502        $id_mot = mot_inserer($id_groupe);
503        mot_modifier($id_mot, $data);
504        spip_log("Création mot $id_mot (" . wp_import_twp($term['wp:term_name'][0]) . ")  ", "wp_import" . _LOG_INFO_IMPORTANTE);
505
506}
Note: See TracBrowser for help on using the repository browser.