1,220 → 1,1027 |
<?php |
// Encodage : UTF-8 |
// +-------------------------------------------------------------------------------------------------------------------+ |
|
/** |
* Migration des utilisateurs vers wordpress |
* Permet de migrer tout un tas de trucs vers le nouveau site |
* |
* Description : classe permettant de migrer les profils de l'annuaire vers les profils wordpress |
* Utilisation : php cli.php migrationwp -a tous |
* /usr/local/bin/php -d memory_limit=4000M cli.php migrationwp -a tous |
* vérifier le nom de la base et le préfixe des tables définis dans $basewp |
* Genre les utilisateurs, les actus, les évènements, etc |
* |
//Auteur original : |
* @author Aurélien PERONNET <jpm@tela-botanica.org> |
* @copyright Tela-Botanica 1999-2014 |
* @licence GPL v3 & CeCILL v2 |
* @version $Id$ |
* /!\ BEWARE OF THE CODE /!\ (Naughty code inside) |
* Ce script a été écrit à la sueur de vieux pied |
* |
* ***************************************** |
* UTILISATION : |
* ***************************************** |
* |
* $ php migration.php <<commande>> |
* |
* 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 logique) 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) |
* |
*/ |
|
class Migrationwp extends Script { |
private $basewp = "wordpress.site_"; |
private $table = "site_"; |
private $doc_loc = array(); |
require_once "config.php"; |
|
public function executer() { |
$this->bdd = new Bdd(); |
//$this->bdd->setAttribute(MYSQL_ATTR_USE_BUFFERED_QUERY, true); |
// évite les erreurs 2006 "MySQL has gone away" |
$this->bdd->executer("SET wait_timeout=300"); |
$actions = array( |
'utilisateurs', |
'utilisateurs-meta', |
'utilisateurs-profil', |
'utilisateurs-activite', |
'actualites', |
'actualites-commentaires', |
'actualites-image-de-couverture', |
'evenements', |
'evenements-meta', |
'rubriques', |
'suicide', |
'restaureLaTable' |
); |
|
$cmd = $this->getParametre('a'); |
$this->mode_verbeux = $this->getParametre('v'); |
// 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; |
} |
|
$retour = array(); |
$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; |
|
switch($cmd) { |
case "tous": |
$retour = $this->migrerUtilisateur(); |
$retour = $this->migrerUtilisateurMeta(); |
$retour = $this->migrerUtilisateurProfil(); |
$retour = $this->migrerUtilisateurActivite(); |
$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 "utilisateur": //liste wordpress |
$retour = $this->migrerUtilisateur(); |
case 'utilisateurs-meta': //role |
migrerUtilisateursMeta(); |
break; |
case "meta": //role |
$retour = $this->migrerUtilisateurMeta(); |
case 'utilisateurs-profil': |
migrerUtilisateursProfil(); |
break; |
case "profil": |
$retour = $this->migrerUtilisateurProfil(); |
case 'utilisateurs-activite': // obligatoire pour affichage |
migrerUtilisateursActivite(); |
break; |
case "activite": // obligatoire pour affichage |
$retour = $this->migrerUtilisateurActivite(); |
case 'actualites': |
migrerActualites(); |
break; |
case "actualiteTout" : |
$retour = $this->migrerActualites(); |
$retour .= $this->migrerActualitesRubrique(); |
$retour .= $this->migrerActualitesCommentaires(); |
case 'actualites-commentaires': |
migrerActualitesCommentaires(); |
break; |
case "actualite" : |
$retour = $this->migrerActualites(); |
case 'actualites-image-de-couverture': |
migrerActualitesImageDeCouverture(); |
break; |
case "actualiteRubrique" : |
$retour = $this->migrerActualitesRubrique(); |
case 'evenements': |
migrerEvenements(); |
break; |
case "actualiteComm" : |
$retour = $this->migrerActualitesCommentaires(); |
case 'evenements-meta': // contenu des champs ACF |
migrerEvenementsMeta(); |
break; |
default: break; |
case 'rubriques': |
migrerRubriques(); |
break; |
case 'suicide': |
supprimerLesTablesSauvegardees(); |
break; |
case 'restaureLaTable': |
restaurerTable($argv[2], $argv[3]); |
break; |
default: |
echo "commande inconnue, l'action ne correspond pas à une fonction"; |
break; |
} |
|
if($this->mode_verbeux) { |
// echo pour que bash capte la sortie et stocke dans le log |
//echo 'Identifiants des mails traites : '.implode(',', $retour)."--"; |
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 :)'); |
} |
|
private function migrerUtilisateur() { |
$requete = "INSERT INTO ".$this->basewp."users |
(`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_status`, `display_name`) |
SELECT `U_ID`, `U_MAIL`, `U_PASSWD`,concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(concat(`U_SURNAME`,'-',`U_NAME`,'-')),' ',''),'\'',''),'é','e'),'è','e'),'ï','i'),'ü','u'),'ø',''),'œ','oe'),'ë','e'),'ç','c'),cast(`U_ID` as char)), |
`U_MAIL` as mail, '' as user_url, `U_DATE`, '0', concat(`U_SURNAME`,' ',`U_NAME`) FROM tela_prod_v4.`annuaire_tela`"; |
$retour = $this->bdd->executer($requete); |
echo 'Il y a '.count($retour).' utilisateurs migrés '."--"; |
return $retour; |
_renommeLaTable($base, $table, $table . 'BAK'); |
restaureLaTable($base, $table); |
} |
|
function sauvegardeLaTable($base, $table) { |
_copieLaTable($base, $table, $table . 'SAV'); |
} |
|
//TODO encoder nick/first/last name pour ' |
private function migrerUtilisateurMeta() { |
$retour = array(); |
$requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME` FROM `annuaire_tela`;"; |
$utilisateurs = $this->bdd->recupererTous($requete); |
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 |
$requete_insert = "INSERT INTO ".$this->basewp."usermeta (`user_id`, `meta_key`, `meta_value`) VALUES |
({$utilisateur['U_ID']}, 'last_activity', '2016-05-18 15:38:18'), |
({$utilisateur['U_ID']}, 'first_name', {$this->bdd->proteger($utilisateur['U_SURNAME'])}), |
({$utilisateur['U_ID']}, 'last_name', {$this->bdd->proteger($utilisateur['U_NAME'])}), |
({$utilisateur['U_ID']}, 'description', ''), |
({$utilisateur['U_ID']}, 'rich_editing', 'true'), |
({$utilisateur['U_ID']}, 'comment_shortcuts', 'false'), |
({$utilisateur['U_ID']}, 'admin_color', 'fresh'), |
({$utilisateur['U_ID']}, 'use_ssl', '0'), |
({$utilisateur['U_ID']}, 'show_admin_bar_front', 'true'), |
({$utilisateur['U_ID']}, '".$this->basewp."capabilities', 'a:1:{s:11:\"contributor\";b:1;}'), |
({$utilisateur['U_ID']}, '".$this->basewp."user_level', '1'), |
({$utilisateur['U_ID']}, 'dismissed_wp_pointers', ''), |
({$utilisateur['U_ID']}, 'wp_dashboard_quick_press_last_post_id', '63'), |
({$utilisateur['U_ID']}, '_restrict_media', '1'), |
({$utilisateur['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\";}'), |
({$utilisateur['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\';}');"; |
$retour[] = $this->bdd->executer($requete_insert); |
$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 pour que bash capte la sortie et stocke dans le log |
//echo 'Il y a '.count($utilisateurs).' utilisateurs '."--"; |
//print_r($utilisateurs); |
return $retour; |
} |
} |
|
private function migrerUtilisateurActivite() { |
$retour = array(); |
$requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME` FROM `annuaire_tela`;"; |
$utilisateurs = $this->bdd->recupererTous($requete); |
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) { |
$requete_insert = "INSERT INTO ".$this->basewp."bp_activity |
$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, '2016-05-19 15:06:16', '0', '0', '0', '0');"; |
$retour[] = $this->bdd->executer($requete_insert); |
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 pour que bash capte la sortie et stocke dans le log |
//echo 'Il y a '.count($utilisateurs).' utilisateurs '."--"; |
//print_r($utilisateurs); |
return $retour; |
} |
} |
|
private function migrerUtilisateurProfil() { |
$retour = array(); |
$requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME`, U_WEB, `U_CITY`, `U_COUNTRY`, pays, `U_NIV`, `LABEL_NIV` 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` |
LEFT JOIN `annuaire_LABEL_NIV` ON `ID_LABEL_NIV` = `U_NIV`;"; |
$utilisateurs = $this->bdd->recupererTous($requete); |
$requete_supp = "SELECT * FROM `annu_meta_valeurs` WHERE `amv_ce_colonne` in (2,137, 99, 125) and (amv_valeur != '' and amv_valeur != 0)"; |
$infos_supp = $this->bdd->recupererTous($requete_supp); |
$codes_langues = array("30842"=>"Anglais", |
"30843"=>"Allemand", |
"30844"=>"Italien", |
"30845"=>"Espagnol", |
"30846"=>"Arabe", |
"30847"=>"Chinois", |
"30848"=>"Russe"); |
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' |
]; |
|
$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', |
'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 <a href="https://www.tela-botanica.org/mentions-legales/#conditions-d-utilisation"> conditions d''utilisation du site</a>', 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) { |
if ($infos['amv_ce_colonne'] == 2) { |
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']); |
$valeur = "a:".count($langues).':{'; |
foreach ($langues as $n=>$langue) { |
$valeur .= 'i:'.$n.';s:'.strlen($codes_langues[$langue]).':"'.$codes_langues[$langue].'";'; |
$langues = explode(';;', $infos['amv_valeur']); |
if (count($langues)) { |
$supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = serialize($langues); |
} |
$valeur .='}'; |
$supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $valeur; |
} else { |
|
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; |
} |
} |
|
$correspondance_categories = array("99"=>"1", |
"137"=>"2", |
"125"=>"11", |
"2"=>"13"); |
$requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME`, U_WEB, `U_CITY`, `U_COUNTRY`, pays, `LABEL_NIV`, `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) { |
$requete_insert = "INSERT INTO ".$this->basewp."bp_xprofile_data (`field_id`, `user_id`, `value`, `last_updated`) VALUES |
('3', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['pays'])}, '2016-05-19 15:06:16'), |
('4', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['U_CITY'])}, '2016-05-19 15:06:16'), |
('9', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['U_NAME'])}, '2016-05-19 15:06:16'), |
('10', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['U_SURNAME'])}, '2016-05-19 15:06:16'), |
('12', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['LABEL_NIV'])}, '2016-05-19 15:06:16'), |
('21', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['U_WEB'])}, '2016-05-19 15:06:16')"; |
// 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){ |
$requete_insert .= ",({$correspondance_categories[$num]}, {$utilisateur['U_ID']}, {$this->bdd->proteger($val)}, '2016-05-19 15:06:16')"; |
$requeteInsert .= ",({$correspondance_categories[$num]}, {$utilisateur['U_ID']}, {$bdWordpress->quote($val)}, '2017-05-19 15:06:16')"; |
} |
} |
$requete_insert .= ";"; |
$retour[] = $this->bdd->executer($requete_insert); |
$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)); |
} |
return $retour; |
} |
} |
|
private function migrerEvenements() { |
$retour = array(); |
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; |
} |
/* |
* */ |
$requete = ""; |
$articles = $this->bdd->recupererTous($requete); |
* @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'); |
|
$requete_insert = "INSERT INTO ".$this->basewp."posts VALUES ".implode($insert, ', ').";"; |
$retour[] = $this->bdd->executer($requete_insert); |
echo 'Il y a '.count($retour).' actualités migrées '."--"; |
return $retour; |
$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)); |
} |
} |
} |
|
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 '."--"; |
return $retour; |
echo '-- ' . $compteur . '/' . count($evenementsChampsACF) . ' meta d\'évènements migrées. ' . PHP_EOL; |
} |
|
private function migrerActualites() { |
$retour = array(); |
// 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 ),'{{{{',''), '}}}}', '<!--more-->'), '{{{','<h2>'), '}}}', '</h2>'), '{{', '<strong>'), '}}', '</strong>'), '{', '<em>'), '}', '</em>'), '_ ', '') as post_content, |
221,72 → 1028,552 |
`titre` as post_title, "" as post_excerpt, replace(replace(replace(replace(replace(`statut`,'poubelle', 'trash'),'publie', 'publish'), 'prepa', 'private'), 'prop', 'pending'), 'refuse', 'trash') as post_status, "open" as comment_status, "open" as ping_status, "" as post_password, spip_articles.`id_article` as post_name, "" as to_ping, "" as pinged, `date_modif` as post_modified,`date_modif` as post_modified_gmt, "" as post_content_filtered, "" as post_parent, |
concat("http://tela-botanica.net/wpsite/actu",spip_articles.`id_article`) as guid, "0" as menu_order, "post" as post_type, "" as post_mime_type, "" as comment_count FROM tela_prod_spip_actu.`spip_articles` left join tela_prod_spip_actu.spip_auteurs_articles on spip_auteurs_articles.`id_article` = spip_articles.`id_article` WHERE id_rubrique in (22,54,70,30,19,51) |
*/ |
$requete = "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 ),'{{{{',''), '}}}}', '<!--more-->'), '{{{','<h2>'), '}}}', '</h2>'), '{{', '<strong>'), '}}', '</strong>'), '{', '<em>'), '}', '</em>'), '_ ', '') as post_content, |
`titre` as post_title, \"\" as post_excerpt, replace(replace(replace(replace(replace(`statut`,'poubelle', 'trash'),'publie', 'publish'), 'prepa', 'private'), 'prop', 'pending'), 'refuse', 'trash') as post_status, \"open\" as comment_status, \"open\" as ping_status, \"\" as post_password, spip_articles.`id_article` as post_name, \"\" as to_ping, \"\" as pinged, `date_modif` as post_modified,`date_modif` as post_modified_gmt, \"\" as post_content_filtered, \"\" as post_parent, |
concat(\"http://tela-botanica.net/wpsite/actu\",spip_articles.`id_article`) as guid, \"0\" as menu_order, \"post\" as post_type, \"\" as post_mime_type, \"\" as comment_count FROM tela_prod_spip_actu.`spip_articles` left join tela_prod_spip_actu.spip_auteurs_articles on spip_auteurs_articles.`id_article` = spip_articles.`id_article` WHERE id_rubrique in (22,54,70,30,19,51)"; |
$articles = $this->bdd->recupererTous($requete); |
$requete_doc = "SELECT d.`id_document`, `fichier`, `id_article` FROM tela_prod_spip_actu.`spip_documents` d left join tela_prod_spip_actu.spip_documents_articles da on da.`id_document` = d.`id_document`"; |
$documents = $this->bdd->recupererTous($requete_doc); |
foreach ($documents as $doc) { |
$this->doc_loc[$doc['id_document']] = $doc['fichier']; |
}$i=0; |
$requete = "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 ),'{{{{',''), '}}}}', '<!--more-->'), '{{{','<h2>'), '}}}', '</h2>'), '{{', '<strong>'), '}}', '</strong>'), '{', '<em>'), '}', '</em>'), '_ ', '') AS post_content, |
`titre` AS post_title, \"\" AS post_excerpt, replace(replace(replace(replace(replace(`statut`,'poubelle', 'trash'),'publie', 'publish'), 'prepa', 'private'), 'prop', 'pending'), 'refuse', 'trash') AS post_status, \"open\" AS comment_status, \"open\" AS ping_status, \"\" AS post_password, concat(\"article\",spip_articles.`id_article`) AS post_name, \"\" AS to_ping, \"\" AS pinged, `date_modif` AS post_modified,`date_modif` AS post_modified_gmt, \"\" AS post_content_filtered, \"\" AS post_parent, |
concat(\"http://tela-botanica.org/?p=\",spip_articles.`id_article`) AS guid, \"0\" AS menu_order, \"post\" AS post_type, \"\" AS post_mime_type, \"\" AS comment_count FROM `spip_articles` LEFT JOIN spip_auteurs_articles ON spip_auteurs_articles.`id_article` = spip_articles.`id_article` WHERE id_rubrique in ( " . _rubriquesSpipAMigrer() . " )"; |
$articles = $bdSpip->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
|
$i = 0; |
$compteurSucces = 0; |
$length = count($articles); |
foreach ($articles as $article) { |
|
$article['post_content'] = preg_replace("/\[([^\[]*)\-\>([^\[]*)\]/", '<a href="\2" target="_blank">\1</a>', $article['post_content']); |
$article['post_content'] = preg_replace("/\[([^\[]*)\-\>([^\[]*)\]/", '<a href="\2">\1</a>', $article['post_content']); |
//$images = preg_grep("\<img([0-9]*)\|[a-z]*\>", $article['post_content']); |
$article['post_content'] = preg_replace_callback("/\<img([0-9]*)\|[a-z]*\>/", array($this, transformerNumEnUrl), $article['post_content']); |
$insert[] = "(".implode($this->bdd->proteger($article), ', ').")"; $i++; |
if ($i >50) { |
$requete_insert = "INSERT INTO ".$this->basewp."posts VALUES ".implode($insert, ', ').";"; |
$retour[] = $this->bdd->executer($requete_insert); |
$insert = array(); $i = 0; |
$article['post_content'] = preg_replace_callback("/\<img([0-9]*)\|[a-z]*\>/", 'transformerNumEnUrl', $article['post_content']); |
|
// gestion des dates normales et dates en GMT |
$date = new DateTime($article['post_date'], new DateTimeZone('Europe/Paris')); |
$article['post_date_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s'); |
$date = new DateTime($article['post_modified'], new DateTimeZone('Europe/Paris')); |
$article['post_modified_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s'); |
|
$insert[] = '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $article)) . ')'; |
|
// collecte les infos pour l'enregistrement des redirections 301 des articles |
$ancienne_url = 'http://www.tela-botanica.org/actu/article' . $article['ID'] . '.html'; |
$insert_redirection[] = '(' . $article['ID'] . ', ' . $bdWordpress->quote($ancienne_url) . ')'; |
|
$i++; |
|
// Permet de d'insérer par lot de 50 ou bien à la fin |
if (0 === $i % 50 || $i === $length -1) { |
$requeteInsert = '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(', ', $insert) . ' |
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($requeteInsert); |
|
$compteurSucces += count($insert); |
} catch(Exception $e) { |
echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL; |
|
if (true !== $modeBourrin) { |
restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); |
restaureLaTable($bdWordpress, $prefixe_tables_wp . 'slug_history'); |
|
die(var_dump($e->errorInfo)); |
} |
} |
$requete_insert = "INSERT INTO ".$this->basewp."posts VALUES ".implode($insert, ', ').";"; |
$retour[] = $this->bdd->executer($requete_insert); |
echo 'Il y a '.count($retour).' actualités migrées '."--"; |
return $retour; |
$insert = array(); |
|
$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)); |
} |
} |
$insert_redirection = array(); |
} |
} |
|
private function transformerNumEnUrl($matches) { |
$remplace = ""; |
echo '-- ' . $compteurSucces . '/' . count($articles) . ' actualités migrées. ' . PHP_EOL; |
} |
|
function transformerNumEnUrl($matches) { |
global $doc_loc; |
|
$remplace = ''; |
if (isset($matches[1])) { |
$remplace = '<img src="http://www.tela-botanica.org/actu/'.$this->doc_loc[$matches[1]].'" \/\>'; |
$remplace = '<img src="http://www.tela-botanica.org/actu/'.$doc_loc[$matches[1]].'" \/\>'; |
} |
|
return $remplace; |
} |
|
private function migrerActualitesRubrique() { |
$requete = "INSERT INTO ".$this->basewp."term_relationships (`object_id`, `term_taxonomy_id`) |
SELECT `id_article`, replace(replace(replace(replace(replace(replace(`id_rubrique`, 22, 20), 54, 21), 30, 23), 19, 24), 51, 25), 70, 22) |
FROM tela_prod_spip_actu.`spip_articles` WHERE id_rubrique in (22,54,70,30,19,51)"; |
$retour = $this->bdd->executer($requete); |
echo 'Il y a '.count($retour).' actualités migrées '."--"; |
return $retour; |
// Retourne les id des rubriques SPIP à migrer |
function _rubriquesSpipAMigrer() { |
global $correspondanceCategorieRubriques; |
|
$rubriquesAMigrer = []; |
foreach ($correspondanceCategorieRubriques as $correspondance) { |
$rubriquesAMigrer[] = implode(',', $correspondance['rubrique-a-migrer']); |
} |
|
private function migrerActualitesCommentaires() { |
$requete = "INSERT INTO ".$this->basewp.'comments (`comment_ID`, `comment_post_ID`, `comment_author`, `comment_author_email`, `comment_author_url`, `comment_author_IP`, `comment_date`, `comment_date_gmt`, `comment_content`, `comment_karma`, `comment_approved`, `comment_agent`, `comment_type`, `comment_parent`, `user_id`) |
SELECT `id_forum` , `id_article` , `auteur` , `email_auteur` , "" AS url, `ip` , `date_heure` , `date_heure` AS gmt, `texte` , "0" AS karma, replace(`statut`, "publie", "1") , "" AS agent, "" AS |
TYPE , `id_parent` , `id_auteur` |
FROM tela_prod_spip_actu.`spip_forum` |
WHERE id_article in (SELECT `id_article` FROM tela_prod_spip_actu.`spip_articles` WHERE id_rubrique in (22,54,70,30,19,51))'; |
return implode(',', $rubriquesAMigrer); |
} |
|
$retour = $this->bdd->executer($requete); |
echo 'Il y a '.count($retour).' actualités migrées '."--"; |
return $retour; |
/** |
* Ça c'est fait pour que les articles importés avant se retrouvent dans la bonne catégorie |
* (Du coup faut gerer les correspondances et tout, folie!) |
* Là dans l'état faut créer les catégories correctement coté Wordpress avant de lancer le script, puis corriger les noms/slugs toussa |
* |
* @todo revoir l'insertion, ça défonce les menus là... Voir : https://wordpress.stackexchange.com/a/78317 |
* @todo vérifier que les évènements sont aussi migrés ou alors créer la fonction de migration équivalente pour eux |
*/ |
function migrerRubriques() { |
global $prefixe_tables_wp; |
global $bdSpip; |
global $bdWordpress; |
global $modeBourrin; |
global $correspondanceCategorieRubriques; |
|
// Contient la table de correspondances rubrique(SPIP)-categorie(WP), indexée par rubrique |
$rubriqueCategorie = []; |
foreach ($correspondanceCategorieRubriques as $correspondance) { |
$requeteCategorie = 'SELECT term_id FROM ' . $prefixe_tables_wp . 'terms WHERE name = ' . $bdWordpress->quote($correspondance['titre']) . ' AND slug = ' . $bdWordpress->quote($correspondance['slug']) . ';'; |
|
$categorie = $bdWordpress->query($requeteCategorie)->fetchAll(PDO::FETCH_ASSOC); |
|
if (0 === count($categorie)) { |
var_dump($correspondance); |
die('catégorie inéxistante, est-elle bien créée coté wordpress ? est-ce le bon slug ?'); |
} elseif (1 < count($categorie)) { |
die('catégorie multiple, je suis censé deviner laquelle est la bonne ? merci de faire le ménage :)'); |
} |
|
private function migrerActualitesLogo() { |
$requete = "INSERT INTO ".$this->basewp."term_relationships`(`object_id`, `term_taxonomy_id`) |
SELECT `id_article`, replace(replace(replace(replace(replace(replace(`id_rubrique`, 22, 20), 54, 21), 30, 23), 19, 24), 51, 25), 70, 22) |
FROM `spip_articles` WHERE id_rubrique in (22,54,70,30,19,51)"; |
// On fait correspondre à chaque rubrique à migrer sa catégorie |
foreach ($correspondance['rubrique-a-migrer'] as $rubrique) { |
$rubriqueCategorie[$rubrique] = $categorie[0]['term_id']; |
} |
|
$retour = $this->bdd->executer($requete); |
echo 'Il y a '.count($retour).' actualités migrées '."--"; |
return $retour; |
// Initialisation des compteurs |
$compteur[$categorie[0]['term_id']] = 0; |
} |
|
sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'term_relationships'); |
sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'term_taxonomy'); |
|
$requeteActualitesRubriques = 'SELECT `id_article`, `id_rubrique` |
FROM `spip_articles` WHERE id_rubrique IN (' . _rubriquesSpipAMigrer() . ');' ; |
|
$actualites = $bdSpip->query($requeteActualitesRubriques)->fetchAll(PDO::FETCH_ASSOC); |
|
$compteur = 0; |
foreach ($actualites as $actualite) { |
$requete = 'INSERT INTO ' . $prefixe_tables_wp . 'term_relationships (`object_id`, `term_taxonomy_id`) |
VALUES(' . $actualite['id_article'] . ', ' . $rubriqueCategorie[$actualite['id_rubrique']] . ') |
ON DUPLICATE KEY UPDATE `object_id`=VALUES(`object_id`), `term_taxonomy_id`=VALUES(`term_taxonomy_id`);'; |
|
$updateCompteur = 'INSERT INTO ' . $prefixe_tables_wp . 'term_taxonomy (`term_id`, `taxonomy`, `count`) ' |
. 'VALUES(' . $rubriqueCategorie[$actualite['id_rubrique']] . ', "category", 1)' |
. 'ON DUPLICATE KEY UPDATE `term_id`=VALUES(`term_id`), `taxonomy`=VALUES(`taxonomy`), `count`=`count`+1' |
; |
|
try { |
$bdWordpress->exec($requete); |
$bdWordpress->exec($updateCompteur); |
|
$compteur++; |
} catch(Exception $e) { |
echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL; |
|
if (true !== $modeBourrin) { |
restaureLaTable($bdWordpress, $prefixe_tables_wp . 'term_relationships'); |
restaureLaTable($bdWordpress, $prefixe_tables_wp . 'term_taxonomy'); |
|
die(var_dump($e->errorInfo)); |
} |
?> |
} |
} |
|
echo '-- ' . $compteur . '/' . count($actualites) . ' rubriques d\'actualités migrées. ' . PHP_EOL; |
} |
|
function migrerActualitesCommentaires() { |
global $prefixe_tables_wp; |
global $bdSpip; |
global $bdWordpress; |
global $modeBourrin; |
|
sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'comments'); |
sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); |
|
$requeteActualitesCommentaires = 'SELECT `id_forum` , `id_article` , `auteur` , `email_auteur` , "" AS url, `ip` , `date_heure` , `date_heure` AS gmt, `texte` , "0" AS karma, replace(`statut`, "publie", "1") , "" AS agent, "" AS TYPE , `id_parent` , `id_auteur` |
FROM `spip_forum` |
WHERE id_article IN (SELECT `id_article` FROM `spip_articles` WHERE id_rubrique IN (' . _rubriquesSpipAMigrer() . ')) AND statut = "publie"'; |
|
$actualitesCommentaires = $bdSpip->query($requeteActualitesCommentaires)->fetchAll(PDO::FETCH_ASSOC); |
|
$compteur = 0; |
foreach ($actualitesCommentaires as $actualiteCommentaire) { |
$requete = 'INSERT INTO ' . $prefixe_tables_wp . 'comments (`comment_ID`, `comment_post_ID`, `comment_author`, `comment_author_email`, `comment_author_url`, `comment_author_IP`, `comment_date`, `comment_date_gmt`, `comment_content`, `comment_karma`, `comment_approved`, `comment_agent`, `comment_type`, `comment_parent`, `user_id`) ' |
. 'VALUES(' . implode(', ', array_map(array($bdWordpress, 'quote'), $actualiteCommentaire)) . ') |
ON DUPLICATE KEY UPDATE `comment_ID`=VALUES(`comment_ID`), `comment_post_ID`=VALUES(`comment_post_ID`), `comment_author`=VALUES(`comment_author`), `comment_author_email`=VALUES(`comment_author_email`), `comment_author_url`=VALUES(`comment_author_url`), `comment_author_IP`=VALUES(`comment_author_IP`), `comment_date`=VALUES(`comment_date`), `comment_date_gmt`=VALUES(`comment_date_gmt`), `comment_content`=VALUES(`comment_content`), `comment_karma`=VALUES(`comment_karma`), `comment_approved`=VALUES(`comment_approved`), `comment_agent`=VALUES(`comment_agent`), `comment_type`=VALUES(`comment_type`), `comment_parent`=VALUES(`comment_parent`), `user_id`=VALUES(`user_id`);'; |
|
$updateCompteurCommentaires = 'UPDATE ' . $prefixe_tables_wp . 'posts SET comment_count = comment_count + 1 WHERE ID = ' . $actualiteCommentaire['id_article'] . ';'; |
|
try { |
$bdWordpress->exec($requete); |
$bdWordpress->exec($updateCompteurCommentaires); |
|
$compteur++; |
} catch(Exception $e) { |
echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL; |
|
if (true !== $modeBourrin) { |
restaureLaTable($bdWordpress, $prefixe_tables_wp . 'comments'); |
restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); |
|
die(var_dump($e->errorInfo)); |
} |
} |
} |
|
echo '-- ' . $compteur . '/' . count($actualitesCommentaires) . ' commentaires d\'actualité migrés. ' . PHP_EOL; |
} |
|
function migrerActualitesImageDeCouverture() { |
global $prefixe_tables_wp; |
global $wordpress_dir; |
global $bdWordpress; |
global $bdSpip; |
global $modeBourrin; |
|
|
// On vérifie qu'on peut bosser |
// Faut être au bon endroit, le repertoire de wordpress |
// Et avoir wp-cli installé |
// Un peu plus loin on va charger les images depuis un dossier spécifique |
$old_path = getcwd(); |
chdir($wordpress_dir); |
|
echo '-- exécution de "wp --info"' . PHP_EOL; |
exec('wp --info', $output, $exit_code); |
if (0 !== $exit_code) { |
die('Faut lancer la commande depuis le repertoire de wordpress (et avoir wp-cli installé)'); |
} else { |
var_dump($output); |
} |
|
echo '-- recherche du dossier d\'images' . PHP_EOL; |
if (!file_exists($wordpress_dir . '/IMG')) { |
die('Faut rsync les images dans wordpress/IMG avant de commencer'); |
} |
|
// chdir($old_path); // commenté car inutile de rechanger de répertoire avant la fin du script |
|
sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); |
sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'postmeta'); |
|
$requete = sprintf('SELECT spip_articles.`id_article` AS ID, `date`, titre FROM `spip_articles` WHERE id_rubrique in ( %s ) ORDER BY id_article', _rubriquesSpipAMigrer()); |
$articles = $bdSpip->query($requete)->fetchAll(PDO::FETCH_ASSOC); |
|
$i = 0; |
$compteurSucces = 0; |
$compteurEchecs = 0; |
$compteurAbusay = 0; |
$length = count($articles); |
foreach ($articles as $article) { |
|
|
$wpcli_meta = 'wp post meta list ' . $article['ID'] . ' --format=json'; |
|
exec($wpcli_meta, $wpcli_meta_command_output, $exit_code); |
|
// die(var_dump($wpcli_meta_command_output)); |
|
// on va commencer par vérifier si l'article n'a pas déjà une image de couv |
// [comme la sortie de "wp post meta get ID" est merdique (toujours à 1 et vide) on va ruser] |
// cas 1 : le post n'existe pas ; code de sortie 1, tableau vide |
// cas 2 : listes des metas à gérer |
if (0 === $exit_code) { |
$metas = json_decode($wpcli_meta_command_output[0], true); |
unset($wpcli_meta_command_output); |
|
// on va fouiller les metas, si on trouve une image de couverture (_thumbnail_id), on passe à la suite |
foreach ($metas as $meta) { |
if ($meta['meta_key'] === '_thumbnail_id') { |
echo 'han!! le post ' . $article['ID'] . ' bah il a déjà une image, trop abusééééééé' . PHP_EOL; |
// echo 'id du post de l\'image ' . $meta['meta_value'] . PHP_EOL; |
$compteurAbusay++; |
|
continue 2; // y'a déjà une couverture, on passe au prochain article |
} |
} |
} else { |
// cas d'erreur, genre le post existe pas, on arrète tout (ou pas) |
echo $wpcli_meta . PHP_EOL; |
var_dump($wpcli_meta_command_output); |
var_dump($exit_code); |
$compteurEchecs++; |
// die('Erreur à l\'exécution de la commande'); |
echo('Erreur à l\'exécution de la commande (17)'); |
echo('Faut resynchroniser les actus, merci'); |
} |
|
// on va pas aller télécharger les images sur le site, on les mets |
// dans un dossier exprès |
// genre : |
// rsync -avz root@sequoia:/home/telabotap/www/actu/IMG/arton* wp-content/uploads/2017/03/ |
// |
// on recherche l'image de couverture dans le dossier |
$images = glob('IMG/arton' . $article['ID'] . '.*'); |
if (!empty($images)) { |
$imageChemin = $images[0]; // normalement y'a qu'une image correspondant au filtre |
|
if (file_exists($imageChemin)) { |
$imageNom = strtolower(pathinfo($imageChemin, PATHINFO_FILENAME)); |
|
$wpcli_commande = 'wp media import ' . $imageChemin . ' --featured_image' |
. ' --post_id=' . $article['ID'] |
. ' --title="image de couverture de l\'article ' . $article['ID'] . '"' |
. ' --alt="image de couverture"' |
. ' --desc="image de couverture de l\'article ' . $article['ID'] . '"' // post_content field |
. ' --caption="image de couverture de l\'article ' . $article['ID'] . '"' // post_except field |
; |
|
exec($wpcli_commande, $command_output, $exit_code); |
|
if (0 === $exit_code) { |
foreach ($command_output as $message) { |
echo $message; |
} |
echo PHP_EOL; |
|
$compteurSucces++; |
|
unset($command_output); |
} else { |
echo 'commande en échec : "' . $wpcli_commande . '"' . PHP_EOL; |
echo PHP_EOL; |
var_dump($command_output); |
|
die('Erreur à l\'exécution de la commande (42)'); |
} |
} else { |
echo 'Image manquante : ' . $article['ID']; |
} |
} |
// foreach ($imagesPaths as $path) { |
// if (file_exists($path) && is_file($path)) { |
// $imageChemin = $path; |
// break; |
// } |
// } |
|
|
// Si la méthode avec wp-cli fonctionne pas voir plus bas |
// En mode sql dessous : |
|
|
// vérifier si artonID.ext |
// comment gérer les ids supplémentaires ? Y'avait une marge de 10k pour les articles, pareil pour les évènement, c'est bien ça ? |
// |
// |
// Description de la table |
// |
// post_author sera admin "1" |
// post_content sera une description, genre : image de couverture / titre de l'article |
// post_title c'est le nom de l'image en minuscules sans l'extension |
// post_excerpt c'est la légende |
// post_status "inherit" avec post_parent à "0" |
// comment_status "open" |
// ping_status "closed" |
// post_password vide |
// post_name c'est comme post_title |
// to_ping / pinged vides |
// post_content_filtered vide |
// post_parent c koi ? |
// guid c koi ? dans mon exemple c'est l'url absolue de l'image |
// menu_order à 0 |
// post_type attachment |
// post_mime_type image/[gif,png,jpeg] |
// comment_count à 0 |
// |
// |
// une image dans la galerie ça consiste en : |
// - un post de type attachment comme vu au dessus |
// - des meta, à savoir (exemples) : |
// - _wp_attached_file 2017/03/acab-11219026_10208737059251108_4677167688813950172_n.jpg |
// - _wp_attachment_metadata a:4:{s:5:"width";i:800;s:6:"height";i:815;s:4:"file";s:65:"2017/03/acab-11219026_10208737059251108_4677167688813950172_n.jpg";s:10:"image_meta";a:12:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";s:11:"orientation";s:1:"0";s:8:"keywords";a:0:{}}} |
// - Dans cette dernière meta les seules choses importantes (sauf erreur) c'est les dimensions et l'emplacement du fichier, donc image_meta = osef |
// |
// getimagesize() avec GD pour les tailles, ou mieux suivant ce qu'on a dans le serveur |
// |
// et une image de la galerie attachée à un article en tant qu'image à la une ça consite en : |
// une ligne de meta sur le post avec _thumbnail_id qui pointe sur l'ID du post de l'image ex: _thumbnail_id 7870 |
|
// $image = array( |
// 'post_author' => 1, |
// 'post_date' => $article['date'], |
// 'post_date_gmt' => $article['date'], |
// 'post_content' => 'Image à la une de l\'article ' . $article['titre'], |
// 'post_title' => $imagesNom, |
// 'post_excerpt' => 'Image à la une de l\'article ' . $article['titre'], |
// 'post_status' => 'inherit', |
// 'comment_status' => 'open', |
// 'ping_status' => 'closed', |
// 'post_password' => '', |
// 'post_name' => $imagesNom, |
// 'to_ping' => '', |
// 'pinged' => '', |
// 'post_modified' => $article['date'], |
// 'post_modified_gmt' => $article['date'], |
// 'post_content_filtered' => '', |
// 'post_parent' => 0, |
// 'guid' => 'https://www.tela-botanica.org/wp-content/uploads/2017/03/' . basename($imageChemin), |
// 'menu_order' => 0, |
// 'post_type' => 'attachment', |
// 'post_mime_type' => mime_content_type($imageChemin), |
// 'comment_count' => 0 |
// ); |
|
// $i++; |
|
|
// // gestion des dates normales et dates en GMT |
// $date = new DateTime($image['post_date'], new DateTimeZone('Europe/Paris')); |
// $image['post_date_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s'); |
// $date = new DateTime($image['post_modified'], new DateTimeZone('Europe/Paris')); |
// $image['post_modified_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s'); |
|
// $requeteInsertAttachment = 'INSERT INTO ' . $prefixe_tables_wp . 'posts (`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'), $image)) . ' |
// 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`);' |
// ; |
|
// $attachmentMetas = array( |
// 'post_id' => article['ID'], |
// 'meta_key' => '_thumbnail_id', |
// 'meta_value' => $artucle['ID'] + 10000; |
// ); |
|
// $requeteInsertPostmeta = 'INSERT INTO ' . $prefixe_tables_wp . 'postmeta (`post_id`, `meta_key`, `meta_value`) VALUES' |
// . '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $attachmentMetas)) . ')' |
// . 'ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `meta_key`=VALUES(`meta_key`), `meta_value`=VALUES(`meta_value`);' |
// ; |
|
// $postMetas = array( |
// 'post_id' => article['ID'], |
// 'meta_key' => '_thumbnail_id', |
// 'meta_value' => $artucle['ID'] + 10000; |
// ); |
|
// $requeteInsertPostmeta = 'INSERT INTO ' . $prefixe_tables_wp . 'postmeta (`post_id`, `meta_key`, `meta_value`) VALUES' |
// . '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $postMetas)) . ')' |
// . 'ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `meta_key`=VALUES(`meta_key`), `meta_value`=VALUES(`meta_value`);' |
// ; |
|
// try { |
// $bdWordpress->exec($requeteInsertAttachment); |
|
// $compteurSucces += count($insert); |
// } catch(Exception $e) { |
// echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL; |
|
// if (true !== $modeBourrin) { |
// restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts'); |
// restaureLaTable($bdWordpress, $prefixe_tables_wp . 'postmeta'); |
|
// die(var_dump($e->errorInfo)); |
// } |
// } |
} |
|
echo '-- ' . $compteurSucces . ' images de couverture actualités migrées. ' . PHP_EOL; |
echo '-- ' . $compteurEchecs . ' erreurs rencontrées pendant la migration (mais rien de grave). ' . PHP_EOL; |
echo '-- ' . $compteurAbusay . ' images déjà migrées ' . PHP_EOL; |
echo '-- ' . $length . ' articles au total ' . PHP_EOL; |
} |
|
// @wphints : https://stackoverflow.com/questions/28643654/where-is-the-post-featured-image-link-stored-in-the-wordpress-database |
// @wphints : https://deliciousbrains.com/tour-wordpress-database/#wp_posts |
// |
// Une photo éligible en couverture est stockée dans la table *_posts avec un post_type = attachment. |
// Pour lier une image à un article il faut une ligne dans *_postmeta avec un type _thumbnail_id. |
// |
// Dans spip : l'image correspond à IMG/arton<<numarticle>>.png exemple : IMG/arton7965.png |
// |
// @TODO trouver une solution ? (ça marche pas car l'image doit être présente "dans" wordpress, connue de son gestionnaire de docs) |
// function migrerActualitesLogo() { |
// global $prefixe_tables_wp; |
// global $bdSpip; |
// global $bdWordpress; |
// global $modeBourrin; |
|
// sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'term_relationships'); |
|
// $requeteActualitesLogo = 'SELECT `id_article`, replace(replace(replace(replace(replace(replace(`id_rubrique`, 22, 20), 54, 21), 30, 23), 19, 24), 51, 25), 70, 22) |
// FROM `spip_articles` WHERE id_rubrique in (22,54,70,30,19,51)'; |
|
// $actualitesLogo = $bdSpip->query($requeteActualitesLogo)->fetchAll(PDO::FETCH_ASSOC); |
|
// $compteur = 0; |
// foreach ($actualitesLogo as $actualiteLogo) { |
// $requete = 'INSERT INTO ' . $prefixe_tables_wp . 'term_relationships (`object_id`, `term_taxonomy_id`) ' |
// . 'VALUES(' . implode(', ', array_map(array($bdWordpress, 'quote'), $actualiteLogo)) . ');'; |
|
// try { |
// $bdWordpress->exec($requete); |
|
// $compteur++; |
// } catch(Exception $e) { |
// echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL; |
|
// if (true !== $modeBourrin) { |
// restaureLaTable($bdWordpress, $prefixe_tables_wp . 'term_relationships'); |
|
// die(var_dump($e->errorInfo)); |
// } |
// } |
// } |
|
// echo '-- ' . $compteur . '/' . count($actualitesLogo) . ' logos d\'actualité migrés. ' . PHP_EOL; |
// } |
|
function supprimerLesTablesSauvegardees($table = false) { |
global $modeBourrin; |
global $prefixe_tables_wp; |
global $bdWordpress; |
|
if (true === $modeBourrin) { |
if (false !== $table) { |
$tables = [$table]; |
} else { |
$tables = array( |
$prefixe_tables_wp . 'users', |
$prefixe_tables_wp . 'usermeta', |
$prefixe_tables_wp . 'bp_activity', |
$prefixe_tables_wp . 'bp_xprofile_data', |
$prefixe_tables_wp . 'posts', |
$prefixe_tables_wp . 'postmeta', |
$prefixe_tables_wp . 'slug_history', |
$prefixe_tables_wp . 'term_relationships', |
$prefixe_tables_wp . 'term_taxonomy', |
$prefixe_tables_wp . 'comments' |
); |
} |
|
foreach ($tables as $table) { |
$requeteSuppressionTable = 'DROP TABLE IF EXISTS ' . $table . 'SAV;'; |
try { |
$bdWordpress->exec($requeteSuppressionTable); |
} catch(Exception $e) { |
echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteSuppressionTable]" . PHP_EOL; |
throw $e; |
} |
} |
|
echo '-- tables SAV supprimées' . PHP_EOL; |
} |
} |
|