> * * ou * * $ /usr/local/bin/php -d memory_limit=4000M cli.php migrationwp -a tous * * @WARNING Bien vérifier le config.php * * * ***************************************** * TODOS * ***************************************** * * Liste de @TODO (censée être exhaustive) * - méthode de nettoyage (voir repartirDeZero) pour rendre le script i(de)mpotent * - gérer proprement les erreurs (là ça chie des exceptions dès que ça peut) en vue d'une automatisation * - trouver un équivalent à un gros try-catch autour de chaque méthode permettant de restaurer les tables en cas de plantage * - sauvegarder les tables proprement à chaque lancement ou ne pas lancer * - méthode All permettant de tout lancer à la suite en vue d'une automatisation * - vérifier les différentes meta ayant pu changer pendant le dev (évènements et leurs champs ACF, meta utilisateurs (mapping des IDs différent entre test et preprod)) * - vérifier les correspondances entre la réalité et les tables de correspondances (surtout les catégories avec les IDs et slugs pouvant différer d'une instance à l'autre) * - voir les différents @todo du script * - à compléter :) (Killian, avant ses vacances (et pas vous) le 21/07/2017) * */ require_once "config.php"; $actions = array( 'utilisateurs', 'utilisateurs-meta', 'utilisateurs-profil', 'utilisateurs-activite', 'actualites', 'actualites-commentaires', 'actualites-image-de-couverture', 'evenements', 'evenements-meta', 'rubriques', 'suicide', 'restaureLaTable', 'repartirDeZero', ); // Si l'utilisateur à mélangé ses doigts on affiche les consignes if ($argc < 2 || !in_array($argv[1], $actions)) { global $argv; global $actions; echo "Utilisation: \n\t$argv[0] action\n\n"; echo "Actions: \n\t" . implode(PHP_EOL . "\t", $actions) . "\n"; exit; } $action = $argv[1]; // // arguments de l'action : tout moins le nom du script et le nom de l'action // array_shift($argv); // array_shift($argv); // $argc -= 2; $modeBourrin = false; if (isset($argv[2]) && '--force' === $argv[2]) { $modeBourrin = true; echo 'Mode "BOURRIN" : certaines erreurs sont ignorées (mais ce serait quand même mieux de corriger le script)'; } // connexion aux BdDs $bdSpip = connexionSpip(); $bdSpip->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $bdTelaProd = connexionTelaProd(); $bdTelaProd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $bdWordpress = connexionWordpress(); $bdWordpress->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $doc_loc = array(); // Détails des différentes rubriques à migrer // on associe le titre et le slug d'une catégorie wordpress avec des rubriques spip // les articles des rubriques seront migrés vers la catégorie donnée $correspondanceCategorieRubriques = array( // Actualités array('titre' => 'Brèves', 'slug' => 'breves', 'rubrique-a-migrer' => [22, 31, 35]), array('titre' => 'Contribuez', 'slug' => 'contribuez', 'rubrique-a-migrer' => [70, 71]), array('titre' => 'En kiosque', 'slug' => 'en-kiosque', 'rubrique-a-migrer' => [30, 34]), array('titre' => 'Nouvelles du réseau', 'slug' => 'nouvelles-du-reseau', 'rubrique-a-migrer' => [54, 55]), array('titre' => 'Points de vue', 'slug' => 'points-de-vue', 'rubrique-a-migrer' => [38, 39]), // Évènements // array('titre' => 'Congrès et conférences', 'slug' => 'congres-conferences'), // array('titre' => 'Expositions', 'slug' => 'expositions'), // array('titre' => 'Sorties de terrain', 'slug' => 'sorties-de-terrain'), // array('titre' => 'Stages et ateliers', 'slug' => 'stages-ateliers'), // Offres d'emploi array('titre' => 'CDD / CDI', 'slug' => 'cdd-cdi', 'rubrique-a-migrer' => [19]), array('titre' => 'Stage', 'slug' => 'stages', 'rubrique-a-migrer' => [51]) // Autres // array('titre' => 'Revue de presse', 'slug' => 'revue-de-presse', 'rubrique-a-migrer' => 69) // Poubelle ); //$this->bdd->executer('SET wait_timeout=300'); switch($action) { case 'utilisateurs': migrerUtilisateurs(); break; case 'utilisateurs-meta': //role migrerUtilisateursMeta(); break; case 'utilisateurs-profil': migrerUtilisateursProfil(); break; case 'utilisateurs-activite': // obligatoire pour affichage migrerUtilisateursActivite(); break; case 'actualites': migrerActualites(); break; case 'actualites-commentaires': migrerActualitesCommentaires(); break; case 'actualites-image-de-couverture': migrerActualitesImageDeCouverture(); break; case 'evenements': migrerEvenements(); break; case 'evenements-meta': // contenu des champs ACF migrerEvenementsMeta(); break; case 'rubriques': migrerRubriques(); break; case 'suicide': supprimerLesTablesSauvegardees(); break; case 'restaureLaTable': restaurerTable($argv[2], $argv[3]); break; case 'repartirDeZero': repartirDeZero(); break; default: echo "commande inconnue, l'action ne correspond pas à une fonction"; break; } function repartirDeZero() { // vide la table users, sauf le n°1 (admin) // vide la table usermeta (si user_id != 1) (mais) // vide les tables bp_activity, bp_xprofile_data // vide les posts (WHERE post_type='post'), ainsi que slug_history et postmeta (WHERE post_id supprimé), et également term_relationships (WHERE object_id = post_id supprimé) // vide les term_taxonomy (WHERE term_id IN [listes des IDs des catégories d'articles et évènements migrés (voir correspondanceCategorieRubriques)]) } function restaurerTable($base, $table) { global $bdTelaProd; global $bdWordpress; global $bdSpip; switch ($base) { case 'wordpress': $base = $bdWordpress; break; case 'telaprod': $base = $bdTelaProd; break; case 'spip': $base = $bdSpip; break; default: die('base inconnue, choix possibles : wordpress | telaprod | spip'); break; } if (!$table) { die('faut renseigner une table à restaurer :)'); } _renommeLaTable($base, $table, $table . 'BAK'); restaureLaTable($base, $table); } function sauvegardeLaTable($base, $table) { _copieLaTable($base, $table, $table . 'SAV'); } function restaureLaTable($base, $table) { _copieLaTable($base, $table . 'SAV', $table, true); } function _renommeLaTable($base, $tableSource, $tableDestination) { $reqRenameTable = 'RENAME TABLE ' . $tableSource . ' TO ' . $tableDestination . ';'; try { $base->exec($reqRenameTable); } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$reqRenameTable]" . PHP_EOL; die(var_dump($e)); } echo "-- SUCCES table $tableSource renommée $tableDestination" . PHP_EOL;; } function _copieLaTable($base, $tableSource, $tableDestination, $faireLeManage = false) { try { if (true === $faireLeManage) { $requeteSuppressionTable = 'DROP TABLE IF EXISTS ' . $tableDestination . ';'; try { $base->exec($requeteSuppressionTable); } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteSuppressionTable]" . PHP_EOL; throw $e; } } $reqNouvelleTable = 'CREATE TABLE IF NOT EXISTS ' . $tableDestination . ' LIKE ' . $tableSource . ';'; try { $base->exec($reqNouvelleTable); } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$reqNouvelleTable]" . PHP_EOL; throw $e; } $reqInsertNouvelleTable = 'INSERT ' . $tableDestination . ' SELECT * FROM ' . $tableSource . ';'; try { $base->exec($reqInsertNouvelleTable); } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$reqInsertNouvelleTable]" . PHP_EOL; throw $e; } if (true === $faireLeManage) { $requeteSuppressionTable = 'DROP TABLE IF EXISTS ' . $tableSource . ';'; try { $base->exec($requeteSuppressionTable); } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteSuppressionTable]" . PHP_EOL; throw $e; } } } catch(Exception $e) { var_dump($e); return; } echo "-- SUCCES contenu de $tableSource copié dans $tableDestination" . PHP_EOL;; } /** * Migre les utilisateurs vers la table WordPress * * Si ça a déjà été fait, ça écrase les valeurs éxistantes coté WordPress * Peut donc être relancé plusieurs fois avant la mise en prod */ function migrerUtilisateurs() { global $prefixe_tables_wp; global $bdTelaProd; global $bdWordpress; global $modeBourrin; sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'users'); sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data'); // nicename doit être unique, de préférence l'intitulé, voir suffixé avec un rand ou l'ID // user_login pareil, sinon nom-prenom-id (champ interne à wordpress, ne change jamais, n'est jamais affiché) // nickname = intitulé, affiché sur le site // recopier ces metas dans celles de wordpress $requeteUtilisateurs = "SELECT `U_ID` AS `ID`, `U_MAIL` AS `user_login`, `U_PASSWD` AS `user_pass`, `U_MAIL` AS user_email, `U_WEB` AS user_url, `U_DATE` AS user_registered, '0' AS user_status, `U_SURNAME`, `U_NAME`, concat(`U_SURNAME`,' ',`U_NAME`) AS display_name FROM `annuaire_tela`"; $utilisateurs = $bdTelaProd->query($requeteUtilisateurs)->fetchAll(PDO::FETCH_ASSOC); $compteur = 0; foreach ($utilisateurs as $utilisateur) { /* user_nicename : unique, éditable, suffixé si déjà utilisé user_login : unique, immuable, prendra la valeur de user_nicename display_name : éditable (de base WordPress le rempli en fonction d'un réglage, y'a le choix entre différents trucs genre prénom, nom, prénom + nom, ou le nickname) nickname : éditable (équivalent du pseudo, mais coté WP) xprofileData[champ 1] (c'est le pseudo BP) unique, éditable, suffixé si déjà utilisé (lorsque le profil BP est modifié, sa valeur est copiée dans user_nicename dans sa version suffixée, et en version originale [saisie par l'utilisateur] dans display_name et nickname) Donc pour l'import il faut générer un user_nicename/user_login/pseudo_bp uniques. Basés sur le pseudo, sinon sur prenom-nom Tandis que nickname aura la valeur du pseudo actuel Et display_name prendra la valeur de pseudo, et sinon prenom-nom */ $pseudo = $bdTelaProd->query('SELECT amv_valeur AS pseudo FROM annu_meta_valeurs WHERE amv_ce_colonne = 99 AND amv_cle_ligne = ' . $utilisateur['ID'])->fetch(PDO::FETCH_ASSOC); $pseudo_utilise = $bdTelaProd->query('SELECT amv_valeur AS pseudo_utilise FROM annu_meta_valeurs WHERE amv_ce_colonne = 136 AND amv_cle_ligne = ' . $utilisateur['ID'])->fetch(PDO::FETCH_ASSOC); $intitule = $utilisateur['U_SURNAME'] . ' ' . $utilisateur['U_NAME']; if ($pseudo_utilise['pseudo_utilise'] && $pseudo['pseudo']) { $intitule = $pseudo['pseudo']; } $futur_pseudo = $intitule; // die(var_dump($futur_pseudo)); // removes all tags $futur_pseudo = preg_replace( '@<(script|style)[^>]*?>.*?\\1>@si', '', $futur_pseudo ); $futur_pseudo = strip_tags($futur_pseudo); $futur_pseudo = preg_replace('/[\r\n\t ]+/', ' ', $futur_pseudo); // Kill octets $futur_pseudo = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '', $futur_pseudo ); $futur_pseudo = preg_replace( '/&.+?;/', '', $futur_pseudo ); // Kill entities // Remplace les caractères accentués par le caractère correspondant $futur_pseudo = iconv('UTF-8', 'ASCII//TRANSLIT', $futur_pseudo); // Reduce to ASCII $futur_pseudo = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $futur_pseudo ); // Consolidate contiguous whitespace $futur_pseudo = mb_ereg_replace( '\s+', ' ', $futur_pseudo ); $futur_pseudo = trim($futur_pseudo); // on remplace les espaces par des tirets $futur_pseudo = mb_ereg_replace( ' ', '-', $futur_pseudo ); // on passe tout en minuscules $futur_pseudo = mb_strtolower($futur_pseudo); // On coupe pour que ça dépasse pas 45 charactères $futur_pseudo = substr($futur_pseudo, 0, 45); // die(var_dump($futur_pseudo)); $unique = $futur_pseudo; $count = 0; do { $count++; if ($count%100 === 0) { echo($count . 'ème étape pour ' . $unique); } $existant = false; // on cherche si un utilisateur existant possède déjà ces propriétés foreach (['user_nicename', 'user_login'] as $champ) { $requete_pseudo = "SELECT $champ FROM " . $prefixe_tables_wp . "users WHERE $champ = '$unique'"; // die(var_dump($requete_pseudo)); try { $utilisateur_existant = $bdWordpress->query($requete_pseudo)->fetchAll(PDO::FETCH_ASSOC); // die(var_dump($utilisateur_existant)); } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete_pseudo]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'users'); restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data'); die(var_dump($e->errorInfo)); } } if (!empty($utilisateur_existant)) { $existant = true; break; } } // si ça existe déjà on suffixe et on recommence if (true === $existant) { $unique = $futur_pseudo . '-' . rand(0, 1000); } } while (true === $existant); $utilisateur['user_nicename'] = $unique; $utilisateur['user_login'] = $unique; $utilisateur['display_name'] = $intitule; // $utilisateur['nickname'] = $pseudo; // nickname est dans les user_meta unset($utilisateur['U_SURNAME']); unset($utilisateur['U_NAME']); $req = 'INSERT INTO ' . $prefixe_tables_wp . 'users ' . '(`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_status`, `display_name`) ' . 'VALUES(' . implode(', ', array_map(array($bdWordpress, 'quote'), $utilisateur)) . ') ' . 'ON DUPLICATE KEY UPDATE `ID`=VALUES(`ID`), `user_login`=VALUES(`user_login`), `user_pass`=VALUES(`user_pass`), `user_nicename`=VALUES(`user_nicename`), `user_email`=VALUES(`user_email`), `user_url`=VALUES(`user_url`), `user_registered`=VALUES(`user_registered`), `user_status`=VALUES(`user_status`), `display_name`=VALUES(`display_name`);' ; try { $bdWordpress->exec($req); $compteur++; } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$req]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'users'); restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data'); die(var_dump($e->errorInfo)); } } $requete_pseudo_bp = "INSERT INTO " . $prefixe_tables_wp . "bp_xprofile_data (`field_id`, `user_id`, `value`, `last_updated`) VALUES ('1', {$utilisateur['ID']}, {$bdWordpress->quote($utilisateur['user_nicename'])}, '2017-05-19 15:06:16') ON DUPLICATE KEY UPDATE `field_id`=VALUES(`field_id`), `user_id`=VALUES(`user_id`), `value`=VALUES(`value`), `last_updated`=VALUES(`last_updated`);"; try { $bdWordpress->exec($requete_pseudo_bp); } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$req]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'users'); restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data'); die(var_dump($e->errorInfo)); } } } echo '-- ' . $compteur . '/' . count($utilisateurs) . ' utilisateurs migrés. ' . PHP_EOL; } /** * @todo il manque les metas de visibilités des champs du profil (global dans le vieux site, et granulaire dans le nouveau, voir bp_xprofile_visibility_levels) * @todo il manque les inscriptions aux projets (ou alors vérifier) * */ function migrerUtilisateursMeta() { global $prefixe_tables_wp; global $bdTelaProd; global $bdWordpress; global $modeBourrin; sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'usermeta'); $requeteUtilisateursMeta = "SELECT `U_ID`, `U_NAME`, `U_SURNAME` FROM `annuaire_tela`;"; $utilisateursMeta = $bdTelaProd->query($requeteUtilisateursMeta)->fetchAll(PDO::FETCH_ASSOC); $compteur = 0; foreach ($utilisateursMeta as $utilisateurMeta) { $pseudo = $bdTelaProd->query('SELECT amv_valeur AS pseudo FROM annu_meta_valeurs WHERE amv_ce_colonne = 99 AND amv_cle_ligne = ' . $utilisateurMeta['U_ID'])->fetch(PDO::FETCH_ASSOC); $pseudo_utilise = $bdTelaProd->query('SELECT amv_valeur AS pseudo_utilise FROM annu_meta_valeurs WHERE amv_ce_colonne = 136 AND amv_cle_ligne = ' . $utilisateurMeta['U_ID'])->fetch(PDO::FETCH_ASSOC); // die(var_dump($utilisateur)); $nickname = $utilisateurMeta['U_SURNAME'] . ' ' . $utilisateurMeta['U_NAME']; if ($pseudo_utilise['pseudo_utilise'] && $pseudo['pseudo']) { $nickname = $pseudo['pseudo']; } // _access est pour définir les catégories d'articles que l'utilisateur pourra écrire $requeteInsert = 'INSERT INTO ' . $prefixe_tables_wp . "usermeta (`user_id`, `meta_key`, `meta_value`) VALUES " . "({$utilisateurMeta['U_ID']}, 'last_activity', '2017-05-19 15:06:16'), " . "({$utilisateurMeta['U_ID']}, 'first_name', {$bdWordpress->quote($utilisateurMeta['U_SURNAME'])}), " . "({$utilisateurMeta['U_ID']}, 'last_name', {$bdWordpress->quote($utilisateurMeta['U_NAME'])}), " . "({$utilisateurMeta['U_ID']}, 'nickname', {$bdWordpress->quote($nickname)}), " . "({$utilisateurMeta['U_ID']}, 'description', ''), " . "({$utilisateurMeta['U_ID']}, 'rich_editing', 'true'), " . "({$utilisateurMeta['U_ID']}, 'comment_shortcuts', 'false'), " . "({$utilisateurMeta['U_ID']}, 'admin_color', 'fresh'), " . "({$utilisateurMeta['U_ID']}, 'use_ssl', '0'), " . "({$utilisateurMeta['U_ID']}, 'show_admin_bar_front', 'true'), " . "({$utilisateurMeta['U_ID']}, '" . $prefixe_tables_wp . "capabilities', 'a:1:{s:11:\"contributor\";b:1;}'), " . "({$utilisateurMeta['U_ID']}, '" . $prefixe_tables_wp . "user_level', '1'), " . "({$utilisateurMeta['U_ID']}, 'dismissed_wp_pointers', ''), " . "({$utilisateurMeta['U_ID']}, 'wp_dashboard_quick_press_last_post_id', '63'), " // c koi ? . "({$utilisateurMeta['U_ID']}, '_restrict_media', '1'), " // lié au plugin restrict author media . "({$utilisateurMeta['U_ID']}, '_access', 'a:4:{i:0;s:1:\"2\";i:1;s:1:\"5\";i:2;s:1:\"6\";i:3;s:1:\"7\";}'), " . "({$utilisateurMeta['U_ID']}, 'bp_xprofile_visibility_levels', 'a:12:{i:1;s:6:\"public\";i:60;s:6:\'public\';i:61;s:6:\'public\';i:49;s:6:\'public\';i:55;s:6:\'public\';i:48;s:6:\'public\';i:62;s:6:\'public\';i:63;s:6:\'public\';i:68;s:6:\'public\';i:76;s:6:\'public\';i:120;s:6:\'public\';i:81;s:6:\'public\';}') " . ";"; try { $bdWordpress->exec($requeteInsert); $compteur++; } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'usermeta'); die(var_dump($e->errorInfo)); } } } echo '-- ' . $compteur . '/' . count($utilisateursMeta) . 'metas d\'utilisateur migrées. ' . PHP_EOL; } function migrerUtilisateursActivite() { global $prefixe_tables_wp; global $bdTelaProd; global $bdWordpress; global $modeBourrin; sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'bp_activity'); $requete = 'SELECT `U_ID` FROM `annuaire_tela`;'; $utilisateurs = $bdTelaProd->query($requete)->fetchAll(PDO::FETCH_ASSOC); $compteur = 0; foreach ($utilisateurs as $utilisateur) { $requeteInsert = 'INSERT INTO ' . $prefixe_tables_wp . "bp_activity (`id`, `user_id`, `component`, `type`, `action`, `content`, `primary_link`, `item_id`, `secondary_item_id`, `date_recorded`, `hide_sitewide`, `mptt_left`, `mptt_right`, `is_spam`) VALUES (NULL, {$utilisateur['U_ID']}, 'members', 'last_activity', '', '', '', '0', NULL, '2017-05-19 15:06:16', '0', '0', '0', '0');"; // @todo voir si ON DUPLICATE KEY UPDATE est pertinent ici mais on dirait bien try { $bdWordpress->exec($requeteInsert); $compteur++; } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_activity'); die(var_dump($e->errorInfo)); } } } echo '-- ' . $compteur . '/' . count($utilisateurs) . ' activités d\'utilisateur migrés. ' . PHP_EOL; } function migrerUtilisateursProfil() { global $prefixe_tables_wp; global $bdTelaProd; global $bdWordpress; global $modeBourrin; $codes_langues = [ '30842'=>'Anglais', '30843'=>'Allemand', '30844'=>'Italien', '30845'=>'Espagnol', '30846'=>'Arabe', '30847'=>'Chinois', '30848'=>'Russe' ]; // Eric : ajout Saint-Pierre-et-Miquelon - 975 $departements = [ '01' => 'Ain', '02' => 'Aisne', '03' => 'Allier', '04' => 'Alpes-de-Haute-Provence', '05' => 'Hautes-Alpes', '06' => 'Alpes-Maritimes', '07' => 'Ardèche', '08' => 'Ardennes', '09' => 'Arièges', '10' => 'Aube', '11' => 'Aude', '12' => 'Aveyron', '13' => 'Bouches-du-Rhône', '14' => 'Calvados', '15' => 'Cantal', '16' => 'Charente', '17' => 'Charente-Maritime', '18' => 'Cher', '19' => 'Corrèze', '201' => 'Corse-du-Sud', '202' => 'Haute-Corse', '21' => 'Côte d\'Or', '22' => 'Côtes-d\'Armor', '23' => 'Creuse', '24' => 'Dordogne', '25' => 'Doubs', '26' => 'Drôme', '27' => 'Eure', '28' => 'Eure-et-Loir', '29' => 'Finistère', '30' => 'Gard', '31' => 'Haute-Garonne', '32' => 'Gers', '33' => 'Gironde', '34' => 'Hérault', '35' => 'Ille-et-Vilaine', '36' => 'Indre', '37' => 'Indre-et-Loire', '38' => 'Isère', '39' => 'Jura', '40' => 'Landes', '41' => 'Loir-et-Cher', '42' => 'Loire', '43' => 'Haute-Loire', '44' => 'Loire-Atlantique', '45' => 'Loiret', '46' => 'Lot', '47' => 'Lot-et-Garonne', '48' => 'Lozère', '49' => 'Maine-et-Loire', '50' => 'Manche', '51' => 'Marne', '52' => 'Haute-Marne', '53' => 'Mayenne', '54' => 'Meurthe-et-Moselle', '55' => 'Meuse', '56' => 'Morbihan', '57' => 'Moselle', '58' => 'Nièvre', '59' => 'Nord', '60' => 'Oise', '61' => 'Orne', '62' => 'Pas-de-Calais', '63' => 'Puy-de-Dôme', '64' => 'Pyrénées-Atlantiques', '65' => 'Hautes-Pyrénées', '66' => 'Pyrénées-Orientales', '67' => 'Bas-Rhin', '68' => 'Haut-Rhin', '69' => 'Rhône', '70' => 'Haute-Saône', '71' => 'Saône-et-Loire', '72' => 'Sarthe', '73' => 'Savoie', '74' => 'Haute-Savoie', '75' => 'Paris', '76' => 'Seine-Maritime', '77' => 'Seine-et-Marne', '78' => 'Yvelines', '79' => 'Deux-Sèvres', '80' => 'Somme', '81' => 'Tarn', '82' => 'Tarn-et-Garonne', '83' => 'Var', '84' => 'Vaucluse', '85' => 'Vendée', '86' => 'Vienne', '87' => 'Haute-Vienne', '88' => 'Vosges', '89' => 'Yonne', '90' => 'Territoire de Belfort', '91' => 'Essonne', '92' => 'Hauts-de-Seine', '93' => 'Seine-Saint-Denis', '94' => 'Val-de-Marne', '95' => 'Val-d\'Oise', '971' => 'Guadeloupe', '972' => 'Martinique', '973' => 'Guyane', '974' => 'La Réunion', '975' => 'Saint-Pierre-et-Miquelon', '976' => 'Mayotte', ]; // Export des meta de buddypress : // INSERT INTO `bp_xprofile_fields` (`id`, `group_id`, `parent_id`, `type`, `name`, `description`, `is_required`, `is_default_option`, `field_order`, `option_order`, `order_by`, `can_delete`) // (1, 1, 0, 'textbox', 'Pseudo', '', 1, 0, 0, 0, '', 0), // (2, 3, 0, 'datebox', 'Date de naissance', '', 0, 0, 1, 0, '', 1), // (3, 1, 0, 'selectbox', 'Pays', '', 1, 0, 4, 0, 'custom', 1), // (4, 1, 0, 'textbox', 'Ville', '', 1, 0, 6, 0, '', 1), // (9, 1, 0, 'textbox', 'Nom', '', 1, 0, 3, 0, '', 1), // (10, 1, 0, 'textbox', 'Prénom', '', 0, 0, 2, 0, '', 1), // (12, 2, 0, 'selectbox', 'Expérience botanique', '', 1, 0, 0, 0, 'custom', 1), // (63, 2, 0, 'textbox', 'Espèce d''intérêt', 'Pour préciser votre famille, genre voire espèce de spécialisation ou noter votre plante préférée', 0, 0, 2, 0, 'custom', 1), // (61, 2, 0, 'checkbox', 'Zones géographiques d''intérêt', 'Pour préciser vos zones phytogéographiques et altitudes de prédilection.', 0, 0, 3, 0, 'custom', 1), // (26, 3, 0, 'selectbox', 'Métier', '', 0, 0, 3, 0, 'custom', 1), // (46, 1, 0, 'selectbox', 'Compte', 'Merci de préciser si votre compte est un compte personnel ou professionnel (utilisé par une personne) ou de structure (partagé par plusieurs personnes)', 1, 0, 1, 0, 'custom', 1), // (69, 2, 0, 'selectbox', 'Membre d''une association naturaliste', '', 0, 0, 1, 0, 'custom', 1), // (51, 1, 0, 'textbox', 'Adresse', 'Votre adresse ne sera pas communiquée mais nous est utile pour éditer les reçus fiscaux si vous nous faites un don.', 0, 0, 8, 0, '', 1), // (52, 3, 0, 'url', 'Site web', 'Si vous avez un site web personnel', 0, 0, 2, 0, '', 1), // (53, 3, 0, 'textarea', 'Présentation', '', 0, 0, 0, 0, '', 1), // (54, 1, 0, 'checkbox', 'Inscription à la lettre d''actualité', '', 0, 0, 9, 0, 'custom', 1), // (59, 1, 0, 'checkbox', 'Conditions d''utilisation', 'Lire les conditions d''utilisation du site', 1, 0, 10, 0, 'custom', 1), // (592, 1, 0, 'selectbox', 'Département', '', 0, 0, 5, 0, 'custom', 1), // Correspondances entre les anciennes meta et celles de BP : // nom du champ ; id actuel ; id BP ; valeurs // prenom ; 7 ; 10 // experience bota ; 4 ; 12 (également présent dans la table annuaire_tela.U_NIV mais n'est jamais mis à jour) // departement (ou cp) ; 13 ; 592 ; pas trouvé d'exemple (faut utiliser annuaire_tela.U_ZIP_CODE) // conditions d'utilisation ; 15 ; 59 sur test (1035 sur preprod) ; 1 // lettre d'actu ; 14 ; 54 ; pas trouvé d'exemple // presentation ; 125 ; 53 ; juste du texte // site web ; 134 ; 52 (n'est pas rempli, c'est la valeur de annuaire_tela.U_WEB qui est utilisée en vrai) // adresse ; 132 ; 51 ; pas trouvé d'exemple // membre asso natur ; 133 ; 69 ; [30833, 30834, 30811, 30812, 30813] // compte ; pas d'équivalent ; 46 // metier ; pas d'équivalent ; 26 // zone geo d'interet ; 120 ; 61 ; [30806] ex: 30805;;30806;;30807 // espece d'interet ; pas forcément ça 8 ; 63 ; [30829] // l'index c'est l'identifiant actuel (amv_ce_colonne), et la valeur c'est celle coté bp $correspondance_categories = [ '99' => '1', // pseudo '2' => '137', // langues '13' => '592', // code postal '137' => '2', // date naissance '12' => '3', // pays '103' => '4', // ville '1' => '9', // nom '7' => '10', // prenom '4' => '12', // niveau bota '8' => '63', // espece d'interet '120' => '61', // zones géo '133' => '69', // membre asso natur '132' => '51', // adresse '134' => '52', // site web '125' => '53', // presentation '14' => '54', // lettre d'actu '15' => '59', // conditions d'utilisation ]; // expériences pour déterminer les metas utilisées de cotre coté // résultat de la requête // SELECT amc_abreviation, amv_valeur FROM `annu_meta_valeurs`JOIN annu_meta_colonne ON `amv_ce_colonne` = amc_id_champ WHERE `amv_ce_colonne` IN (99, 2, 13, 137, 12, 103, 1, 7, 4, 8, 120, 133, 132, 134, 125, 14, 15) AND amv_valeur != '' AND `amv_cle_ligne` = 41014; // experience_bota 30787 // conditions_utilisation 1 // pseudo KillianPseudoTest // date_naissance 02/01/1990 // presentation J'ai commencé la botanique hier, après avoir fait ... // specialite_bota_groupes 30829;;30837 // specialite_bota_geo 30806;;30807 // langues 30842;;30847 // mon_blog http://lolilol.lol // membre_asso_bota 30833 // // On voit que nombre de correspondances ne sont en fait pas $correspondances_niveau_bota = [ '30786' => 'Débutant', '30787' => 'Ayant une bonne pratique', '30788' => 'Confirmé', '30790' => 'Ne se prononce pas' ]; $correspondances_membre_asso_naturaliste = [ '30833' => 'Oui', '30834' => 'Non', '30811' => 'Ne se prononce pas', '30812' => 'Oui', '30813' => 'Non' ]; // a:8:{i:0;s:14:"Zones polaires";i:1;s:17:"Zones tempérées";i:2;s:16:"Zones tropicales";i:3;s:24:"Zones méditerranéennes";i:4;s:6:"Plaine";i:5;s:13:"Basses terres";i:6;s:13:"Hautes terres";i:7;s:8:"Montagne";} $correspondances_zones_geo = [ '30805' => 'Zones tempérées', // Zones géographiques : tempérées et boréales '30806' => 'Zones méditerranéennes', // Zone géographique : Méditerranéenne '30807' => 'Zones tropicales' // Zones géographiques : subtropicales à tropicales ]; // correspondance espèces d'interet sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data'); $requete_supp = "SELECT * FROM `annu_meta_valeurs` WHERE `amv_ce_colonne` in (99, 2, 137, 12, 103, 1, 7, 4, 8, 120, 133, 132, 134, 125, 14, 15) AND (amv_valeur != '' AND amv_valeur != 0)"; $infos_supp = $bdTelaProd->query($requete_supp)->fetchAll(PDO::FETCH_ASSOC); foreach ($infos_supp as $infos) { switch ($infos['amv_ce_colonne']) { case 2: // langues //exemple a:3:{i:0;s:7:"Anglais";i:1;s:8:"Espagnol";i:2;s:7:"Italien";} $langues = explode(';;', $infos['amv_valeur']); if (count($langues)) { $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = serialize($langues); } break; case 4: // niveau bota $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $correspondances_niveau_bota[$infos['amv_valeur']]; break; case 133: // asso naturalistes $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $correspondances_membre_asso_naturaliste[$infos['amv_valeur']]; break; case 15: // conditions d'utilisation if (1 == $infos['amv_valeur']) { $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = serialize("J\'accepte les conditions d\'utilisation"); } break; case 120: // zones géo // exemple: a:3:{i:0;s:16:"Zones tropicales";i:1;s:24:"Zones méditerranéennes";i:2;s:8:"Montagne";} $zones_geo = explode(';;', $infos['amv_valeur']); if (count($zones_geo)) { $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = serialize($zones_geo); } break; default: $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $infos['amv_valeur']; break; } } $requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME`, U_WEB, `U_CITY`, `U_COUNTRY`, pays, `U_ZIP_CODE` FROM `annuaire_tela` LEFT JOIN (SELECT `amo_nom` AS pays, `amo_abreviation` FROM `annu_meta_ontologie` WHERE `amo_ce_parent` = 1074) liste_pays ON `amo_abreviation` = `U_COUNTRY`"; $utilisateurs = $bdTelaProd->query($requete)->fetchAll(PDO::FETCH_ASSOC); $compteur = 0; foreach ($utilisateurs as $utilisateur) { // on va essayer de trouver le département à partir du code postal if (preg_match('@(?:^(\d{2})(\d)\d{2}.*$)|(?:^(\d{2})\s.*$)@', $utilisateur['U_ZIP_CODE'], $matches)) { $numero_departement = $matches[1]; $numero_complementaire = $matches[2]; // pour la corse (201/202) ou les // DOM (97X) et TOM (98X) switch ($numero_departement) { case 975: // Saint-Pierre-et-Miquelon case 98: // TOM (98X) // on ne gère pas ces cas, considérés comme des pays à part dans le formulaire d'inscription break; case 97: // DOM (97X) case 20: // Corse (201/202) if (isset($departements[$numero_departement . $numero_complementaire])) { $utilisateur['U_ZIP_CODE'] = $departements[$numero_departement . $numero_complementaire]; } break; default: if (isset($departements[$numero_departement])) { $utilisateur['U_ZIP_CODE'] = $departements[$numero_departement]; } break; } } $requeteInsert = "INSERT INTO " . $prefixe_tables_wp . "bp_xprofile_data (`field_id`, `user_id`, `value`, `last_updated`) VALUES ('3', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['pays'])}, '2017-05-19 15:06:16'), ('4', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_CITY'])}, '2017-05-19 15:06:16'), ('9', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_NAME'])}, '2017-05-19 15:06:16'), ('10', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_SURNAME'])}, '2017-05-19 15:06:16'), ('592', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_ZIP_CODE'])}, '2017-05-19 15:06:16'), ('21', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_WEB'])}, '2017-05-19 15:06:16')"; if (isset($supp[$utilisateur['U_ID']])) { foreach ($supp[$utilisateur['U_ID']] as $num => $val){ $requeteInsert .= ",({$correspondance_categories[$num]}, {$utilisateur['U_ID']}, {$bdWordpress->quote($val)}, '2017-05-19 15:06:16')"; } } $requeteInsert .= " ON DUPLICATE KEY UPDATE `field_id`=VALUES(`field_id`), `user_id`=VALUES(`user_id`), `value`=VALUES(`value`), `last_updated`=VALUES(`last_updated`);"; try { $bdWordpress->exec($requeteInsert); $compteur++; } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data'); die(var_dump($e->errorInfo)); } } } echo '-- ' . $compteur . '/' . count($utilisateurs) . ' profils d\'utilisateur migrés. ' . PHP_EOL; } function migrerEvenements() { global $prefixe_tables_wp; global $bdTelaProd; global $bdWordpress; global $modeBourrin; sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); $requeteEvenements = "SELECT `bf_id_fiche`+10000 AS `ID`, `bf_ce_utilisateur` AS `post_author`, `bf_date_creation_fiche` AS `post_date`, `bf_date_creation_fiche` AS `post_date_gmt`, '' AS `post_content`, `bf_titre` AS `post_title`, '' AS `post_excerpt`, 'publish' AS `post_status`, 'open' AS `comment_status`, 'open' AS `ping_status`, '' AS `post_password`, `bf_id_fiche`+10000 AS `post_name`, '' AS `to_ping`, '' AS `pinged`, `bf_date_maj_fiche` AS `post_modified`, `bf_date_maj_fiche` AS `post_modified_gmt`, '' AS `post_content_filtered`, 0 AS `post_parent`, `bf_id_fiche`+10000 AS `guid`, 0 AS `menu_order`, 'post' AS `post_type`, '' AS `post_mime_type`, 0 AS `comment_count` FROM `bazar_fiche` WHERE year(`bf_date_debut_validite_fiche`) >= 2017;"; $evenements = $bdTelaProd->query($requeteEvenements)->fetchAll(PDO::FETCH_ASSOC); $compteur = 0; foreach ($evenements as $evenement) { // gestion des dates normales et dates en GMT $date = new DateTime($evenement['post_date'], new DateTimeZone('Europe/Paris')); $evenement['post_date_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s'); $date = new DateTime($evenement['post_modified'], new DateTimeZone('Europe/Paris')); $evenement['post_modified_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s'); $requete = 'INSERT INTO ' . $prefixe_tables_wp . 'posts (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES' . '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $evenement)) . ')' . 'ON DUPLICATE KEY UPDATE `ID`=VALUES(`ID`), `post_author`=VALUES(`post_author`), `post_date`=VALUES(`post_date`), `post_date_gmt`=VALUES(`post_date_gmt`), `post_content`=VALUES(`post_content`), `post_title`=VALUES(`post_title`), `post_excerpt`=VALUES(`post_excerpt`), `post_status`=VALUES(`post_status`), `comment_status`=VALUES(`comment_status`), `ping_status`=VALUES(`ping_status`), `post_password`=VALUES(`post_password`), `post_name`=VALUES(`post_name`), `to_ping`=VALUES(`to_ping`), `pinged`=VALUES(`pinged`), `post_modified`=VALUES(`post_modified`), `post_modified_gmt`=VALUES(`post_modified_gmt`), `post_content_filtered`=VALUES(`post_content_filtered`), `post_parent`=VALUES(`post_parent`), `guid`=VALUES(`guid`), `menu_order`=VALUES(`menu_order`), `post_type`=VALUES(`post_type`), `post_mime_type`=VALUES(`post_mime_type`), `comment_count`=VALUES(`comment_count`);' ; try { $bdWordpress->exec($requete); $compteur++; } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); die(var_dump($e->errorInfo)); } } // collecte les infos pour l'enregistrement des redirections 301 des articles $ancienne_url = 'http://www.tela-botanica.org/page:evenements?action=8&id_fiche=' . $evenement['ID'] - 10000; $insert_redirection[] = '(' . $article['ID'] . ', ' . $bdWordpress->quote($ancienne_url) . ')'; $requeteInsertRedirection = 'INSERT INTO ' . $prefixe_tables_wp . 'slug_history (`post_id`, `url`) VALUES ' . implode(', ', $insert_redirection) . ' ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `url`=VALUES(`url`);'; try { $bdWordpress->exec($requeteInsertRedirection); } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsertRedirection]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); restaureLaTable($bdWordpress, $prefixe_tables_wp . 'slug_history'); die(var_dump($e->errorInfo)); } } } echo '-- ' . $compteur . '/' . count($evenements) . ' évènements migrés. ' . PHP_EOL; } /* * @todo vérifier que les metas sont bien synchros avec l'actuel */ function migrerEvenementsMeta() { global $prefixe_tables_wp; global $bdTelaProd; global $bdWordpress; global $modeBourrin; sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'postmeta'); $fin = 'AS meta_value FROM `bazar_fiche` WHERE year(`bf_date_debut_validite_fiche`) >= 2017'; $requeteEvenementsChampsACF = "SELECT `bf_id_fiche`+10000 AS post_id, '_edit_lock' AS meta_key, CONVERT(CONVERT('1476892394:1' USING utf8) USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_edit_last' AS meta_key, CONVERT('1' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_alp_processed' AS meta_key, CONVERT('1476891070' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_place' AS meta_key, CONVERT('field_580366d5a9e01' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'place' AS meta_key, CONVERT('a:3:{s:7:\"address\";s:47:\"53 Bd Bonne Nouvelle, 34000 Montpellier, France\";s:3:\"lat\";s:17:\"43.61335152461514\";s:3:\"lng\";s:17:\"3.880716562271118\";}' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_contact_0_description' AS meta_key, CONVERT('field_580e45789024f' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'contact_0_description' AS meta_key, CONVERT(bf_nom_contact USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_prices' AS meta_key, CONVERT('field_5803a6059a5d1' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'prices' AS meta_key, CONVERT(bf_tarif_individuel USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_is_free' AS meta_key, CONVERT('field_5803a5d09a5d0' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'is_free' AS meta_key, CONVERT('0' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_image' AS meta_key, CONVERT('field_5803a65a08014' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'image' AS meta_key, CONVERT('7669' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_contact' AS meta_key, CONVERT('field_580e45279024d' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'contact' AS meta_key, CONVERT('1' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_description' AS meta_key, CONVERT('field_580366bfa9e00' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'description' AS meta_key, CONVERT(bf_description USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_date' AS meta_key, CONVERT('field_580364c892ee1' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'date' AS meta_key, CONVERT(date_format(bf_date_fin_evenement, '%Y%m%d') USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, '_date_end' AS meta_key, CONVERT('field_5803659792ee5' USING utf8) $fin UNION SELECT `bf_id_fiche`+10000 AS post_id, 'date_end' AS meta_key, CONVERT(date_format(bf_date_debut_evenement, '%Y%m%d') USING utf8) $fin;"; $evenementsChampsACF = $bdTelaProd->query($requeteEvenementsChampsACF)->fetchAll(PDO::FETCH_ASSOC); $compteur = 0; foreach ($evenementsChampsACF as $champACF) { $requete = 'INSERT INTO ' . $prefixe_tables_wp . 'postmeta (`post_id`, `meta_key`, `meta_value`) VALUES' . '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $champACF)) . ')' . 'ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `meta_key`=VALUES(`meta_key`), `meta_value`=VALUES(`meta_value`);' ; try { $bdWordpress->exec($requete); $compteur++; } catch(Exception $e) { echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL; if (true !== $modeBourrin) { restaureLaTable($bdWordpress, $prefixe_tables_wp . 'postmeta'); die(var_dump($e->errorInfo)); } } } echo '-- ' . $compteur . '/' . count($evenementsChampsACF) . ' meta d\'évènements migrées. ' . PHP_EOL; } // private function migrerEvenementsRubrique() { // $requete = "INSERT INTO ".$this->basewp."term_relationships (`object_id`, `term_taxonomy_id`) // SELECT `bf_id_fiche` +10000, replace( replace( replace( replace( `bf_ce_nature` , '3', '39' ) , '4', '38' ) , '2', '37' ) , '1', '40' ) // FROM `bazar_fiche` // WHERE year( `bf_date_debut_validite_fiche` ) =2016 // UNION SELECT `bf_id_fiche` +10000, 36 AS cat_evnt // FROM `bazar_fiche` // WHERE year( `bf_date_debut_validite_fiche` ) =2016"; // $retour = $this->bdd->executer($requete); // echo 'Il y a '.count($retour).' actualités migrées '."--"; // } /** * Explication des champs de la table wp_posts : https://deliciousbrains.com/tour-wordpress-database/#wp_posts * * @todo : revoir la méthode d'ajout, là c'est un peu violent, ça écrase les menus, le footer, toussa * (wai les menus c'est stocké dans la table posts, deal with it) * Vérifier l'auto-incrément de la table Posts, 20000 ids sont censés être réservés aux articles importés * Voir : https://wordpress.stackexchange.com/a/78317 */ function migrerActualites() { global $prefixe_tables_wp; global $bdSpip; global $bdWordpress; global $modeBourrin; global $doc_loc; sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'slug_history'); $requete_doc = "SELECT d.`id_document`, `fichier`, `id_article` FROM `spip_documents` d LEFT JOIN spip_documents_articles da ON da.`id_document` = d.`id_document`"; $documents = $bdSpip->query($requete_doc)->fetchAll(PDO::FETCH_ASSOC); foreach ($documents as $doc) { $doc_loc[$doc['id_document']] = $doc['fichier']; } /*INSERT INTO `wp4_posts` SELECT spip_articles.`id_article` as ID, `id_auteur` as post_author, `date` as post_date, `date` as post_date_gmt, replace(replace(replace(replace(replace(replace(replace(replace(replace(convert( convert( texte USING latin1 ) USING utf8 ),'{{{{',''), '}}}}', ''), '{{{','