Subversion Repositories Applications.annuaire

Rev

Rev 618 | Rev 620 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 618 Rev 619
Line 1... Line 1...
1
<?php
1
<?php
2
// Encodage : UTF-8
-
 
3
// +-------------------------------------------------------------------------------------------------------------------+
-
 
-
 
2
 
4
/**
3
/**
-
 
4
 * Permet de migrer tout un tas de trucs vers le nouveau site
-
 
5
 *
5
* Migration des utilisateurs vers wordpress
6
 * Genre les utilisateurs, les actus, les évènements, etc
-
 
7
 *
-
 
8
 * /!\ BEWARE OF THE CODE /!\ (Naughty code inside)
-
 
9
 * Ce script a été écrit à la sueur de vieux pied
-
 
10
 *
-
 
11
 * *****************************************
-
 
12
 * UTILISATION :
-
 
13
 * *****************************************
-
 
14
 *
-
 
15
 * $ php migration.php <<commande>>
-
 
16
 *
-
 
17
 *  ou
-
 
18
 *
-
 
19
 * $ /usr/local/bin/php -d memory_limit=4000M cli.php migrationwp -a tous
-
 
20
 *
-
 
21
 * @WARNING Bien vérifier le config.php
-
 
22
 *
-
 
23
 *
-
 
24
 * *****************************************
-
 
25
 * TODOS
-
 
26
 * *****************************************
-
 
27
 *
-
 
28
 * Liste de @TODO (censée être exhaustive)
-
 
29
 * - méthode de nettoyage (voir logique) pour rendre le script i(de)mpotent
-
 
30
 * - gérer proprement les erreurs (là ça chie des exceptions dès que ça peut) en vue d'une automatisation
-
 
31
 * - trouver un équivalent à un gros try-catch autour de chaque méthode permettant de restaurer les tables en cas de plantage
-
 
32
 * - sauvegarder les tables proprement à chaque lancement ou ne pas lancer
-
 
33
 * - méthode All permettant de tout lancer à la suite en vue d'une automatisation
-
 
34
 * - 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))
-
 
35
 * - 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)
-
 
36
 * - voir les différents @todo du script
-
 
37
 * - à compléter :) (Killian, avant ses vacances (et pas vous) le 21/07/2017)
6
*
38
 *
7
* Description : classe permettant de migrer les profils de l'annuaire vers les profils wordpress
-
 
8
* Utilisation : php cli.php migrationwp -a tous
-
 
9
* /usr/local/bin/php -d memory_limit=4000M cli.php migrationwp -a tous
-
 
10
* vérifier le nom de la base et le préfixe des tables définis dans $basewp
-
 
11
*
-
 
12
//Auteur original :
-
 
13
* @author       Aurélien PERONNET <jpm@tela-botanica.org>
-
 
14
* @copyright	Tela-Botanica 1999-2014
-
 
15
* @licence		GPL v3 & CeCILL v2
-
 
16
* @version		$Id$
-
 
17
*/
39
 */
Line 18... Line -...
18
 
-
 
19
class Migrationwp extends Script {
-
 
20
	private $basewp = "wordpress.site_";
40
 
21
	private $table = "site_";
-
 
22
	private $doc_loc = array();
-
 
23
	
-
 
24
	public function executer() {	
-
 
25
		$this->bdd = new Bdd();
-
 
26
		//$this->bdd->setAttribute(MYSQL_ATTR_USE_BUFFERED_QUERY, true);
-
 
27
		// évite les erreurs 2006 "MySQL has gone away"
-
 
28
		$this->bdd->executer("SET wait_timeout=300");
-
 
29
		
-
 
30
		$cmd = $this->getParametre('a');
-
 
Line -... Line 41...
-
 
41
require_once "config.php";
-
 
42
 
-
 
43
$actions = array(
-
 
44
  'utilisateurs',
-
 
45
  'utilisateurs-meta',
-
 
46
  'utilisateurs-profil',
-
 
47
  'utilisateurs-activite',
-
 
48
  'actualites',
-
 
49
  'actualites-commentaires',
-
 
50
  'actualites-image-de-couverture',
-
 
51
  'evenements',
-
 
52
  'evenements-meta',
-
 
53
  'rubriques',
-
 
54
  'suicide',
-
 
55
  'restaureLaTable'
-
 
56
);
-
 
57
 
-
 
58
// Si l'utilisateur à mélangé ses doigts on affiche les consignes
-
 
59
if ($argc < 2 || !in_array($argv[1], $actions)) {
-
 
60
  global $argv;
-
 
61
  global $actions;
-
 
62
  echo "Utilisation: \n\t$argv[0] action\n\n";
-
 
63
  echo "Actions: \n\t" . implode(PHP_EOL . "\t", $actions) . "\n";
-
 
64
  exit;
-
 
65
}
-
 
66
 
-
 
67
$action = $argv[1];
-
 
68
// // arguments de l'action : tout moins le nom du script et le nom de l'action
-
 
69
// array_shift($argv);
-
 
70
// array_shift($argv);
-
 
71
// $argc -= 2;
-
 
72
 
-
 
73
$modeBourrin = false;
-
 
74
if (isset($argv[2]) && '--force' === $argv[2]) {
-
 
75
  $modeBourrin = true;
-
 
76
 
-
 
77
  echo 'Mode "BOURRIN" : certaines erreurs sont ignorées (mais ce serait quand même mieux de corriger le script)';
-
 
78
}
-
 
79
 
-
 
80
// connexion aux BdDs
-
 
81
$bdSpip = connexionSpip();
-
 
82
$bdSpip->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
 
83
$bdTelaProd = connexionTelaProd();
-
 
84
$bdTelaProd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
 
85
$bdWordpress = connexionWordpress();
31
		$this->mode_verbeux = $this->getParametre('v');
86
$bdWordpress->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
 
87
 
-
 
88
$doc_loc = array();
-
 
89
 
-
 
90
// Détails des différentes rubriques à migrer
-
 
91
// on associe le titre et le slug d'une catégorie wordpress avec des rubriques spip
-
 
92
// les articles des rubriques seront migrés vers la catégorie donnée
-
 
93
$correspondanceCategorieRubriques = array(
-
 
94
  // Actualités
-
 
95
  array('titre' => 'Brèves', 'slug' => 'breves', 'rubrique-a-migrer' => [22, 31, 35]),
-
 
96
  array('titre' => 'Contribuez', 'slug' => 'contribuez', 'rubrique-a-migrer' => [70, 71]),
-
 
97
  array('titre' => 'En kiosque', 'slug' => 'en-kiosque', 'rubrique-a-migrer' => [30, 34]),
-
 
98
  array('titre' => 'Nouvelles du réseau', 'slug' => 'nouvelles-du-reseau', 'rubrique-a-migrer' => [54, 55]),
-
 
99
  array('titre' => 'Points de vue', 'slug' => 'points-de-vue', 'rubrique-a-migrer' => [38, 39]),
-
 
100
  // Évènements
-
 
101
  // array('titre' => 'Congrès et conférences', 'slug' => 'congres-conferences'),
-
 
102
  // array('titre' => 'Expositions', 'slug' => 'expositions'),
-
 
103
  // array('titre' => 'Sorties de terrain', 'slug' => 'sorties-de-terrain'),
-
 
104
  // array('titre' => 'Stages et ateliers', 'slug' => 'stages-ateliers'),
-
 
105
  // Offres d'emploi
-
 
106
  array('titre' => 'CDD / CDI', 'slug' => 'cdd-cdi', 'rubrique-a-migrer' => [19]),
-
 
107
  array('titre' => 'Stage', 'slug' => 'stages', 'rubrique-a-migrer' => [51])
-
 
108
  // Autres
-
 
109
  // array('titre' => 'Revue de presse', 'slug' => 'revue-de-presse', 'rubrique-a-migrer' => 69) // Poubelle
-
 
110
);
32
		
111
 
33
		$retour = array();
112
//$this->bdd->executer('SET wait_timeout=300');
34
		
113
 
35
		switch($cmd) {
114
switch($action) {
-
 
115
	case 'utilisateurs':
-
 
116
		migrerUtilisateurs();
36
			case "tous":
117
		break;
-
 
118
	case 'utilisateurs-meta': //role
-
 
119
		migrerUtilisateursMeta();
37
				$retour = $this->migrerUtilisateur();
120
    break;
-
 
121
  case 'utilisateurs-profil':
-
 
122
    migrerUtilisateursProfil();
38
				$retour = $this->migrerUtilisateurMeta();
123
		break;
-
 
124
  case 'utilisateurs-activite': // obligatoire pour affichage
-
 
125
    migrerUtilisateursActivite();
-
 
126
		break;
-
 
127
	case 'actualites':
-
 
128
		migrerActualites();
-
 
129
		break;
39
				$retour = $this->migrerUtilisateurProfil();
130
  case 'actualites-commentaires':
40
				$retour = $this->migrerUtilisateurActivite();
131
    migrerActualitesCommentaires();
41
				break;
132
    break;
42
			case "utilisateur": //liste wordpress
133
  case 'actualites-image-de-couverture':
43
				$retour = $this->migrerUtilisateur();
134
    migrerActualitesImageDeCouverture();
44
				break;
135
    break;
45
			case "meta": //role
136
  case 'evenements':
46
				$retour = $this->migrerUtilisateurMeta();
137
    migrerEvenements();
47
				break;
138
    break;
48
			case "profil":
139
  case 'evenements-meta': // contenu des champs ACF
49
				$retour = $this->migrerUtilisateurProfil();
140
    migrerEvenementsMeta();
50
				break;
141
    break;
51
			case "activite": // obligatoire pour affichage
142
	case 'rubriques':
52
				$retour = $this->migrerUtilisateurActivite();
143
		migrerRubriques();
53
				break;
144
		break;
54
			case "actualiteTout" :
-
 
55
				$retour = $this->migrerActualites();
-
 
56
				$retour .= $this->migrerActualitesRubrique();
145
  case 'suicide':
57
				$retour .= $this->migrerActualitesCommentaires();
146
    supprimerLesTablesSauvegardees();
58
				break;
147
    break;
59
			case "actualite" :
148
  case 'restaureLaTable':
60
				$retour = $this->migrerActualites();
149
    restaurerTable($argv[2], $argv[3]);
61
				break;
150
    break;
62
			case "actualiteRubrique" :
151
	default:
-
 
152
    echo "commande inconnue, l'action ne correspond pas à une fonction";
-
 
153
    break;
-
 
154
}
-
 
155
 
-
 
156
function restaurerTable($base, $table) {
-
 
157
  global $bdTelaProd;
-
 
158
  global $bdWordpress;
-
 
159
  global $bdSpip;
-
 
160
 
-
 
161
  switch ($base) {
-
 
162
    case 'wordpress':
63
				$retour = $this->migrerActualitesRubrique();
163
      $base = $bdWordpress;
-
 
164
      break;
-
 
165
    case 'telaprod':
-
 
166
      $base = $bdTelaProd;
-
 
167
      break;
-
 
168
    case 'spip':
-
 
169
      $base = $bdSpip;
64
				break;
170
      break;
65
			case "actualiteComm" :
171
    default:
66
				$retour = $this->migrerActualitesCommentaires();
-
 
67
				break;
172
      die('base inconnue, choix possibles : wordpress | telaprod | spip');
Line 68... Line 173...
68
			default: break;
173
      break;
69
		}
174
  }
70
		
-
 
71
		if($this->mode_verbeux) {
175
 
-
 
176
  if (!$table) {
-
 
177
    die('faut renseigner une table à restaurer :)');
-
 
178
  }
-
 
179
 
-
 
180
  _renommeLaTable($base, $table, $table . 'BAK');
-
 
181
  restaureLaTable($base, $table);
-
 
182
}
72
			// echo pour que bash capte la sortie et stocke dans le log
183
 
Line 73... Line 184...
73
			//echo 'Identifiants des mails traites : '.implode(',', $retour)."--";
184
function sauvegardeLaTable($base, $table) {
74
		}
-
 
75
	}
-
 
76
	
185
  _copieLaTable($base, $table, $table . 'SAV');
77
	private function migrerUtilisateur() {
-
 
78
		$requete = "INSERT INTO ".$this->basewp."users
-
 
79
				(`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_status`, `display_name`) 
-
 
80
				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)), 
-
 
81
				`U_MAIL` as mail,  '' as user_url, `U_DATE`, '0', concat(`U_SURNAME`,' ',`U_NAME`)  FROM tela_prod_v4.`annuaire_tela`";
186
}
Line -... Line 187...
-
 
187
 
-
 
188
function restaureLaTable($base, $table) {
-
 
189
  _copieLaTable($base, $table . 'SAV', $table, true);
-
 
190
}
-
 
191
 
-
 
192
function _renommeLaTable($base, $tableSource, $tableDestination) {
-
 
193
  $reqRenameTable = 'RENAME TABLE ' . $tableSource . ' TO ' . $tableDestination . ';';
-
 
194
  try {
-
 
195
    $base->exec($reqRenameTable);
-
 
196
  } catch(Exception $e) {
-
 
197
    echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$reqRenameTable]" . PHP_EOL;
-
 
198
 
-
 
199
    die(var_dump($e));
-
 
200
  }
-
 
201
 
-
 
202
  echo "-- SUCCES table $tableSource renommée $tableDestination" . PHP_EOL;;
-
 
203
}
-
 
204
 
-
 
205
function _copieLaTable($base, $tableSource, $tableDestination, $faireLeManage = false) {
-
 
206
  try {
-
 
207
    if (true === $faireLeManage) {
-
 
208
      $requeteSuppressionTable = 'DROP TABLE IF EXISTS ' . $tableDestination . ';';
-
 
209
      try {
-
 
210
        $base->exec($requeteSuppressionTable);
-
 
211
      } catch(Exception $e) {
-
 
212
        echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteSuppressionTable]" . PHP_EOL;
-
 
213
        throw $e;
-
 
214
      }
-
 
215
    }
-
 
216
 
-
 
217
    $reqNouvelleTable = 'CREATE TABLE IF NOT EXISTS ' . $tableDestination . ' LIKE ' . $tableSource . ';';
-
 
218
    try {
-
 
219
      $base->exec($reqNouvelleTable);
-
 
220
    } catch(Exception $e) {
-
 
221
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$reqNouvelleTable]" . PHP_EOL;
-
 
222
      throw $e;
-
 
223
    }
-
 
224
 
-
 
225
    $reqInsertNouvelleTable = 'INSERT ' . $tableDestination . ' SELECT * FROM ' . $tableSource . ';';
-
 
226
    try {
Line -... Line 227...
-
 
227
      $base->exec($reqInsertNouvelleTable);
-
 
228
    } catch(Exception $e) {
-
 
229
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$reqInsertNouvelleTable]" . PHP_EOL;
-
 
230
      throw $e;
-
 
231
    }
-
 
232
 
-
 
233
    if (true === $faireLeManage) {
-
 
234
      $requeteSuppressionTable = 'DROP TABLE IF EXISTS ' . $tableSource . ';';
-
 
235
      try {
-
 
236
        $base->exec($requeteSuppressionTable);
-
 
237
      } catch(Exception $e) {
-
 
238
        echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteSuppressionTable]" . PHP_EOL;
-
 
239
        throw $e;
-
 
240
      }
-
 
241
    }
-
 
242
  } catch(Exception $e) {
-
 
243
    var_dump($e);
-
 
244
 
-
 
245
    return;
-
 
246
  }
-
 
247
 
-
 
248
 
82
		$retour = $this->bdd->executer($requete);
249
 
-
 
250
 
-
 
251
  echo "-- SUCCES contenu de $tableSource copié dans $tableDestination" . PHP_EOL;;
-
 
252
}
-
 
253
 
83
		echo 'Il y a '.count($retour).' utilisateurs migrés '."--";
254
/**
-
 
255
 * Migre les utilisateurs vers la table WordPress
84
		return $retour;
256
 *
-
 
257
 * Si ça a déjà été fait, ça écrase les valeurs éxistantes coté WordPress
-
 
258
 * Peut donc être relancé plusieurs fois avant la mise en prod
-
 
259
 */
-
 
260
function migrerUtilisateurs() {
-
 
261
  global $prefixe_tables_wp;
-
 
262
  global $bdTelaProd;
-
 
263
  global $bdWordpress;
-
 
264
  global $modeBourrin;
-
 
265
 
-
 
266
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'users');
-
 
267
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data');
-
 
268
 
-
 
269
  // nicename doit être unique, de préférence l'intitulé, voir suffixé avec un rand ou l'ID
-
 
270
  // user_login pareil, sinon nom-prenom-id (champ interne à wordpress, ne change jamais, n'est jamais affiché)
-
 
271
  // nickname = intitulé, affiché sur le site
-
 
272
  // recopier ces metas dans celles de wordpress
-
 
273
 
-
 
274
  $requeteUtilisateurs = "SELECT `U_ID` AS `ID`,
-
 
275
    `U_MAIL` AS `user_login`,
85
	}
276
    `U_PASSWD` AS `user_pass`,
-
 
277
    `U_MAIL` AS user_email,
-
 
278
    `U_WEB` AS user_url,
86
	
279
    `U_DATE` AS user_registered, '0' AS user_status,
-
 
280
    `U_SURNAME`,
-
 
281
    `U_NAME`,
87
 
282
    concat(`U_SURNAME`,' ',`U_NAME`) AS display_name
-
 
283
    FROM `annuaire_tela`";
-
 
284
 
-
 
285
  $utilisateurs = $bdTelaProd->query($requeteUtilisateurs)->fetchAll(PDO::FETCH_ASSOC);
-
 
286
 
-
 
287
  $compteur = 0;
-
 
288
  foreach ($utilisateurs as $utilisateur) {
-
 
289
 
-
 
290
    /*
-
 
291
    user_nicename : unique, éditable, suffixé si déjà utilisé
-
 
292
    user_login : unique, immuable, prendra la valeur de user_nicename
-
 
293
    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)
-
 
294
    nickname : éditable (équivalent du pseudo, mais coté WP)
-
 
295
    xprofileData[champ 1] (c'est le pseudo BP) unique, éditable, suffixé si déjà utilisé
-
 
296
    (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)
-
 
297
 
-
 
298
    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
-
 
299
    Tandis que nickname aura la valeur du pseudo actuel
-
 
300
    Et display_name prendra la valeur de pseudo, et sinon prenom-nom
-
 
301
    */
-
 
302
 
-
 
303
    $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);
-
 
304
    $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);
-
 
305
 
-
 
306
    $intitule = $utilisateur['U_SURNAME'] . ' ' . $utilisateur['U_NAME'];
-
 
307
    if ($pseudo_utilise['pseudo_utilise'] && $pseudo['pseudo']) {
-
 
308
      $intitule = $pseudo['pseudo'];
-
 
309
    }
-
 
310
 
-
 
311
    $futur_pseudo = $intitule;
-
 
312
    // die(var_dump($futur_pseudo));
-
 
313
 
-
 
314
    // removes all tags
-
 
315
    $futur_pseudo = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $futur_pseudo );
-
 
316
    $futur_pseudo = strip_tags($futur_pseudo);
-
 
317
    $futur_pseudo = preg_replace('/[\r\n\t ]+/', ' ', $futur_pseudo);
-
 
318
    // Kill octets
-
 
319
    $futur_pseudo = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '', $futur_pseudo );
-
 
320
    $futur_pseudo = preg_replace( '/&.+?;/', '', $futur_pseudo ); // Kill entities
-
 
321
    // Remplace les caractères accentués par le caractère correspondant
-
 
322
    $futur_pseudo = iconv('UTF-8', 'ASCII//TRANSLIT', $futur_pseudo);
-
 
323
    // Reduce to ASCII
-
 
324
    $futur_pseudo = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $futur_pseudo );
-
 
325
    // Consolidate contiguous whitespace
-
 
326
    $futur_pseudo = mb_ereg_replace( '\s+', ' ', $futur_pseudo );
-
 
327
    $futur_pseudo = trim($futur_pseudo);
-
 
328
    // on remplace les espaces par des tirets
-
 
329
    $futur_pseudo = mb_ereg_replace( ' ', '-', $futur_pseudo );
-
 
330
    // on passe tout en minuscules
-
 
331
    $futur_pseudo = mb_strtolower($futur_pseudo);
-
 
332
    // On coupe pour que ça dépasse pas 45 charactères
-
 
333
    $futur_pseudo = substr($futur_pseudo, 0, 45);
-
 
334
 
-
 
335
    // die(var_dump($futur_pseudo));
-
 
336
 
-
 
337
    $unique = $futur_pseudo;
-
 
338
    $count = 0;
-
 
339
    do {
-
 
340
      $count++;
-
 
341
      if ($count%100 === 0) {
-
 
342
        echo($count . 'ème étape pour ' . $unique);
-
 
343
      }
-
 
344
 
-
 
345
      $existant = false;
-
 
346
      // on cherche si un utilisateur existant possède déjà ces propriétés
-
 
347
      foreach (['user_nicename', 'user_login'] as $champ) {
-
 
348
        $requete_pseudo = "SELECT $champ FROM " . $prefixe_tables_wp . "users WHERE $champ = '$unique'";
-
 
349
        // die(var_dump($requete_pseudo));
-
 
350
 
-
 
351
        try {
-
 
352
          $utilisateur_existant = $bdWordpress->query($requete_pseudo)->fetchAll(PDO::FETCH_ASSOC);
-
 
353
          // die(var_dump($utilisateur_existant));
-
 
354
        } catch(Exception $e) {
-
 
355
          echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete_pseudo]" . PHP_EOL;
-
 
356
 
-
 
357
          if (true !== $modeBourrin) {
-
 
358
            restaureLaTable($bdWordpress, $prefixe_tables_wp . 'users');
-
 
359
            restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data');
-
 
360
 
-
 
361
            die(var_dump($e->errorInfo));
-
 
362
          }
-
 
363
        }
-
 
364
 
-
 
365
        if (!empty($utilisateur_existant)) {
-
 
366
          $existant = true;
-
 
367
          break;
-
 
368
        }
-
 
369
      }
-
 
370
 
-
 
371
      // si ça existe déjà on suffixe et on recommence
-
 
372
      if (true === $existant) {
-
 
373
        $unique = $futur_pseudo . '-' . rand(0, 1000);
-
 
374
      }
-
 
375
    } while (true === $existant);
-
 
376
 
-
 
377
    $utilisateur['user_nicename'] = $unique;
-
 
378
    $utilisateur['user_login'] = $unique;
-
 
379
    $utilisateur['display_name'] = $intitule;
-
 
380
    // $utilisateur['nickname'] = $pseudo; // nickname est dans les user_meta
-
 
381
    unset($utilisateur['U_SURNAME']);
-
 
382
    unset($utilisateur['U_NAME']);
-
 
383
 
-
 
384
 
-
 
385
    $req = 'INSERT INTO ' . $prefixe_tables_wp . 'users '
-
 
386
      . '(`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_status`, `display_name`) '
-
 
387
      . 'VALUES(' . implode(', ', array_map(array($bdWordpress, 'quote'), $utilisateur)) . ') '
-
 
388
      . '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`);'
-
 
389
    ;
-
 
390
 
-
 
391
    try {
-
 
392
      $bdWordpress->exec($req);
-
 
393
 
-
 
394
      $compteur++;
-
 
395
    } catch(Exception $e) {
-
 
396
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$req]" . PHP_EOL;
-
 
397
 
-
 
398
      if (true !== $modeBourrin) {
-
 
399
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'users');
-
 
400
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data');
-
 
401
 
-
 
402
        die(var_dump($e->errorInfo));
-
 
403
      }
-
 
404
    }
-
 
405
 
-
 
406
    $requete_pseudo_bp = "INSERT INTO " . $prefixe_tables_wp . "bp_xprofile_data (`field_id`, `user_id`, `value`, `last_updated`) VALUES
-
 
407
      ('1', {$utilisateur['ID']}, {$bdWordpress->quote($utilisateur['user_nicename'])}, '2017-05-19 15:06:16')
-
 
408
      ON DUPLICATE KEY UPDATE `field_id`=VALUES(`field_id`), `user_id`=VALUES(`user_id`), `value`=VALUES(`value`), `last_updated`=VALUES(`last_updated`);";
-
 
409
 
-
 
410
    try {
-
 
411
      $bdWordpress->exec($requete_pseudo_bp);
-
 
412
    } catch(Exception $e) {
-
 
413
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$req]" . PHP_EOL;
-
 
414
 
-
 
415
      if (true !== $modeBourrin) {
-
 
416
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'users');
-
 
417
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data');
-
 
418
 
-
 
419
        die(var_dump($e->errorInfo));
-
 
420
      }
-
 
421
    }
-
 
422
  }
-
 
423
 
-
 
424
  echo '-- ' . $compteur . '/' . count($utilisateurs) . ' utilisateurs migrés. ' . PHP_EOL;
-
 
425
}
-
 
426
 
-
 
427
/**
-
 
428
 * @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)
-
 
429
 * @todo il manque les inscriptions aux projets (ou alors vérifier)
-
 
430
 *
-
 
431
 */
-
 
432
function migrerUtilisateursMeta() {
-
 
433
  global $prefixe_tables_wp;
-
 
434
  global $bdTelaProd;
-
 
435
  global $bdWordpress;
-
 
436
  global $modeBourrin;
-
 
437
 
-
 
438
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'usermeta');
-
 
439
 
-
 
440
  $requeteUtilisateursMeta = "SELECT `U_ID`, `U_NAME`, `U_SURNAME` FROM `annuaire_tela`;";
-
 
441
  $utilisateursMeta = $bdTelaProd->query($requeteUtilisateursMeta)->fetchAll(PDO::FETCH_ASSOC);
-
 
442
 
-
 
443
  $compteur = 0;
-
 
444
  foreach ($utilisateursMeta as $utilisateurMeta) {
-
 
445
 
-
 
446
    $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);
-
 
447
    $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);
-
 
448
 
-
 
449
 
-
 
450
    // die(var_dump($utilisateur));
88
	//TODO encoder nick/first/last name pour '
451
 
89
	private function migrerUtilisateurMeta() {
452
    $nickname = $utilisateurMeta['U_SURNAME'] . ' ' . $utilisateurMeta['U_NAME'];
90
		$retour = array();
453
    if ($pseudo_utilise['pseudo_utilise'] && $pseudo['pseudo']) {
91
		$requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME` FROM `annuaire_tela`;";
454
      $nickname = $pseudo['pseudo'];
92
		$utilisateurs = $this->bdd->recupererTous($requete);
455
    }
-
 
456
 
93
		foreach ($utilisateurs as $utilisateur) {
457
    // _access est pour définir les catégories d'articles que l'utilisateur pourra écrire
94
			// _access est pour définir les catégories d'articles que l'utilisateur pourra écrire
458
    $requeteInsert = 'INSERT INTO ' . $prefixe_tables_wp . "usermeta (`user_id`, `meta_key`, `meta_value`) VALUES "
95
			$requete_insert = "INSERT INTO ".$this->basewp."usermeta (`user_id`, `meta_key`, `meta_value`) VALUES
459
      . "({$utilisateurMeta['U_ID']}, 'last_activity', '2017-05-19 15:06:16'), "
96
					({$utilisateur['U_ID']}, 'last_activity', '2016-05-18 15:38:18'),
460
      . "({$utilisateurMeta['U_ID']}, 'first_name', {$bdWordpress->quote($utilisateurMeta['U_SURNAME'])}), "
97
					({$utilisateur['U_ID']}, 'first_name', {$this->bdd->proteger($utilisateur['U_SURNAME'])}),
461
      . "({$utilisateurMeta['U_ID']}, 'last_name', {$bdWordpress->quote($utilisateurMeta['U_NAME'])}), "
98
					({$utilisateur['U_ID']}, 'last_name', {$this->bdd->proteger($utilisateur['U_NAME'])}),
462
      . "({$utilisateurMeta['U_ID']}, 'nickname', {$bdWordpress->quote($nickname)}), "
99
					({$utilisateur['U_ID']}, 'description', ''),
463
      . "({$utilisateurMeta['U_ID']}, 'description', ''), "
100
					({$utilisateur['U_ID']}, 'rich_editing', 'true'),
464
      . "({$utilisateurMeta['U_ID']}, 'rich_editing', 'true'), "
101
					({$utilisateur['U_ID']}, 'comment_shortcuts', 'false'),
465
      . "({$utilisateurMeta['U_ID']}, 'comment_shortcuts', 'false'), "
102
					({$utilisateur['U_ID']}, 'admin_color', 'fresh'),
466
      . "({$utilisateurMeta['U_ID']}, 'admin_color', 'fresh'), "
103
					({$utilisateur['U_ID']}, 'use_ssl', '0'),
467
      . "({$utilisateurMeta['U_ID']}, 'use_ssl', '0'), "
-
 
468
      . "({$utilisateurMeta['U_ID']}, 'show_admin_bar_front', 'true'), "
104
					({$utilisateur['U_ID']}, 'show_admin_bar_front', 'true'),
469
      . "({$utilisateurMeta['U_ID']}, '" . $prefixe_tables_wp . "capabilities', 'a:1:{s:11:\"contributor\";b:1;}'), "
-
 
470
      . "({$utilisateurMeta['U_ID']}, '" . $prefixe_tables_wp . "user_level', '1'), "
105
					({$utilisateur['U_ID']}, '".$this->basewp."capabilities', 'a:1:{s:11:\"contributor\";b:1;}'),
471
      . "({$utilisateurMeta['U_ID']}, 'dismissed_wp_pointers', ''), "
-
 
472
      . "({$utilisateurMeta['U_ID']}, 'wp_dashboard_quick_press_last_post_id', '63'), " // c koi ?
106
					({$utilisateur['U_ID']}, '".$this->basewp."user_level', '1'),
473
      . "({$utilisateurMeta['U_ID']}, '_restrict_media', '1'), " // lié au plugin restrict author media
107
					({$utilisateur['U_ID']}, 'dismissed_wp_pointers', ''),
474
      . "({$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\";}'), "
-
 
475
      . "({$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\';}') "
-
 
476
      . ";";
108
					({$utilisateur['U_ID']}, 'wp_dashboard_quick_press_last_post_id', '63'),
477
 
-
 
478
    try {
-
 
479
      $bdWordpress->exec($requeteInsert);
109
					({$utilisateur['U_ID']}, '_restrict_media', '1'),
480
 
-
 
481
      $compteur++;
110
					({$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\";}'),
482
    } catch(Exception $e) {
111
					({$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\';}');";
483
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL;
-
 
484
 
-
 
485
      if (true !== $modeBourrin) {
-
 
486
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'usermeta');
-
 
487
 
112
			$retour[] = $this->bdd->executer($requete_insert);
488
        die(var_dump($e->errorInfo));
113
		}
489
      }
114
		// echo pour que bash capte la sortie et stocke dans le log
490
    }
-
 
491
  }
115
		//echo 'Il y a '.count($utilisateurs).' utilisateurs '."--";
492
 
-
 
493
  echo '-- ' . $compteur . '/' . count($utilisateursMeta) . 'metas d\'utilisateur migrées. ' . PHP_EOL;
-
 
494
}
-
 
495
 
-
 
496
function migrerUtilisateursActivite() {
-
 
497
  global $prefixe_tables_wp;
116
		//print_r($utilisateurs);
498
  global $bdTelaProd;
117
		return $retour;
499
  global $bdWordpress;
-
 
500
  global $modeBourrin;
-
 
501
 
118
	}
502
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'bp_activity');
119
	
503
 
120
	private function migrerUtilisateurActivite() {
504
  $requete = 'SELECT `U_ID` FROM `annuaire_tela`;';
121
		$retour = array();
505
  $utilisateurs = $bdTelaProd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
506
 
-
 
507
  $compteur = 0;
122
		$requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME` FROM `annuaire_tela`;";
508
  foreach ($utilisateurs as $utilisateur) {
123
		$utilisateurs = $this->bdd->recupererTous($requete);
509
    $requeteInsert = 'INSERT INTO ' . $prefixe_tables_wp . "bp_activity
-
 
510
      (`id`, `user_id`, `component`, `type`, `action`, `content`, `primary_link`, `item_id`, `secondary_item_id`, `date_recorded`, `hide_sitewide`, `mptt_left`, `mptt_right`, `is_spam`)
124
		foreach ($utilisateurs as $utilisateur) {
511
      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
125
			$requete_insert = "INSERT INTO ".$this->basewp."bp_activity
512
 
-
 
513
    try {
126
					(`id`, `user_id`, `component`, `type`, `action`, `content`, `primary_link`, `item_id`, `secondary_item_id`, `date_recorded`, `hide_sitewide`, `mptt_left`, `mptt_right`, `is_spam`) 
514
      $bdWordpress->exec($requeteInsert);
-
 
515
 
-
 
516
      $compteur++;
127
					VALUES (NULL, {$utilisateur['U_ID']}, 'members', 'last_activity', '', '', '', '0', NULL, '2016-05-19 15:06:16', '0', '0', '0', '0');";
517
    } catch(Exception $e) {
-
 
518
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL;
-
 
519
 
128
			$retour[] = $this->bdd->executer($requete_insert);
520
      if (true !== $modeBourrin) {
-
 
521
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_activity');
-
 
522
 
-
 
523
        die(var_dump($e->errorInfo));
129
		}
524
      }
130
		// echo pour que bash capte la sortie et stocke dans le log
525
    }
-
 
526
	}
-
 
527
 
-
 
528
  echo '-- ' . $compteur . '/' . count($utilisateurs) . ' activités d\'utilisateur migrés. ' . PHP_EOL;
-
 
529
}
-
 
530
 
-
 
531
function migrerUtilisateursProfil() {
-
 
532
  global $prefixe_tables_wp;
-
 
533
  global $bdTelaProd;
-
 
534
  global $bdWordpress;
-
 
535
  global $modeBourrin;
-
 
536
 
-
 
537
  $codes_langues = [
-
 
538
    '30842'=>'Anglais',
-
 
539
    '30843'=>'Allemand',
-
 
540
    '30844'=>'Italien',
-
 
541
    '30845'=>'Espagnol',
-
 
542
    '30846'=>'Arabe',
-
 
543
    '30847'=>'Chinois',
-
 
544
    '30848'=>'Russe'
-
 
545
  ];
-
 
546
 
-
 
547
  $departements = [
-
 
548
    '01' => 'Ain',
-
 
549
    '02' => 'Aisne',
-
 
550
    '03' => 'Allier',
-
 
551
    '04' => 'Alpes-de-Haute-Provence',
-
 
552
    '05' => 'Hautes-Alpes',
-
 
553
    '06' => 'Alpes-Maritimes',
-
 
554
    '07' => 'Ardèche',
-
 
555
    '08' => 'Ardennes',
-
 
556
    '09' => 'Arièges',
-
 
557
    '10' => 'Aube',
-
 
558
    '11' => 'Aude',
-
 
559
    '12' => 'Aveyron',
-
 
560
    '13' => 'Bouches-du-Rhône',
-
 
561
    '14' => 'Calvados',
-
 
562
    '15' => 'Cantal',
-
 
563
    '16' => 'Charente',
-
 
564
    '17' => 'Charente-Maritime',
-
 
565
    '18' => 'Cher',
-
 
566
    '19' => 'Corrèze',
-
 
567
    '201' => 'Corse-du-Sud',
-
 
568
    '202' => 'Haute-Corse',
-
 
569
    '21' => 'Côte d\'Or',
-
 
570
    '22' => 'Côtes-d\'Armor',
-
 
571
    '23' => 'Creuse',
-
 
572
    '24' => 'Dordogne',
-
 
573
    '25' => 'Doubs',
-
 
574
    '26' => 'Drôme',
-
 
575
    '27' => 'Eure',
-
 
576
    '28' => 'Eure-et-Loir',
-
 
577
    '29' => 'Finistère',
-
 
578
    '30' => 'Gard',
-
 
579
    '31' => 'Haute-Garonne',
-
 
580
    '32' => 'Gers',
-
 
581
    '33' => 'Gironde',
-
 
582
    '34' => 'Hérault',
-
 
583
    '35' => 'Ille-et-Vilaine',
-
 
584
    '36' => 'Indre',
-
 
585
    '37' => 'Indre-et-Loire',
-
 
586
    '38' => 'Isère',
-
 
587
    '39' => 'Jura',
-
 
588
    '40' => 'Landes',
-
 
589
    '41' => 'Loir-et-Cher',
-
 
590
    '42' => 'Loire',
-
 
591
    '43' => 'Haute-Loire',
-
 
592
    '44' => 'Loire-Atlantique',
-
 
593
    '45' => 'Loiret',
-
 
594
    '46' => 'Lot',
-
 
595
    '47' => 'Lot-et-Garonne',
-
 
596
    '48' => 'Lozère',
-
 
597
    '49' => 'Maine-et-Loire',
-
 
598
    '50' => 'Manche',
-
 
599
    '51' => 'Marne',
-
 
600
    '52' => 'Haute-Marne',
-
 
601
    '53' => 'Mayenne',
-
 
602
    '54' => 'Meurthe-et-Moselle',
-
 
603
    '55' => 'Meuse',
-
 
604
    '56' => 'Morbihan',
-
 
605
    '57' => 'Moselle',
-
 
606
    '58' => 'Nièvre',
-
 
607
    '59' => 'Nord',
-
 
608
    '60' => 'Oise',
-
 
609
    '61' => 'Orne',
-
 
610
    '62' => 'Pas-de-Calais',
-
 
611
    '63' => 'Puy-de-Dôme',
-
 
612
    '64' => 'Pyrénées-Atlantiques',
-
 
613
    '65' => 'Hautes-Pyrénées',
-
 
614
    '66' => 'Pyrénées-Orientales',
-
 
615
    '67' => 'Bas-Rhin',
-
 
616
    '68' => 'Haut-Rhin',
-
 
617
    '69' => 'Rhône',
-
 
618
    '70' => 'Haute-Saône',
-
 
619
    '71' => 'Saône-et-Loire',
-
 
620
    '72' => 'Sarthe',
-
 
621
    '73' => 'Savoie',
-
 
622
    '74' => 'Haute-Savoie',
-
 
623
    '75' => 'Paris',
-
 
624
    '76' => 'Seine-Maritime',
-
 
625
    '77' => 'Seine-et-Marne',
-
 
626
    '78' => 'Yvelines',
-
 
627
    '79' => 'Deux-Sèvres',
-
 
628
    '80' => 'Somme',
-
 
629
    '81' => 'Tarn',
-
 
630
    '82' => 'Tarn-et-Garonne',
-
 
631
    '83' => 'Var',
-
 
632
    '84' => 'Vaucluse',
-
 
633
    '85' => 'Vendée',
-
 
634
    '86' => 'Vienne',
-
 
635
    '87' => 'Haute-Vienne',
-
 
636
    '88' => 'Vosges',
-
 
637
    '89' => 'Yonne',
-
 
638
    '90' => 'Territoire de Belfort',
-
 
639
    '91' => 'Essonne',
131
		//echo 'Il y a '.count($utilisateurs).' utilisateurs '."--";
640
    '92' => 'Hauts-de-Seine',
-
 
641
    '93' => 'Seine-Saint-Denis',
-
 
642
    '94' => 'Val-de-Marne',
-
 
643
    '95' => 'Val-d\'Oise',
-
 
644
    '971' => 'Guadeloupe',
-
 
645
    '972' => 'Martinique',
132
		//print_r($utilisateurs);
646
    '973' => 'Guyane',
-
 
647
    '974' => 'La Réunion',
-
 
648
    '976' => 'Mayotte',
-
 
649
  ];
-
 
650
 
-
 
651
// Export des meta de buddypress :
-
 
652
// 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`)
-
 
653
// (1, 1, 0, 'textbox', 'Pseudo', '', 1, 0, 0, 0, '', 0),
-
 
654
// (2, 3, 0, 'datebox', 'Date de naissance', '', 0, 0, 1, 0, '', 1),
-
 
655
// (3, 1, 0, 'selectbox', 'Pays', '', 1, 0, 4, 0, 'custom', 1),
-
 
656
// (4, 1, 0, 'textbox', 'Ville', '', 1, 0, 6, 0, '', 1),
-
 
657
// (9, 1, 0, 'textbox', 'Nom', '', 1, 0, 3, 0, '', 1),
-
 
658
// (10, 1, 0, 'textbox', 'Prénom', '', 0, 0, 2, 0, '', 1),
133
		return $retour;
659
// (12, 2, 0, 'selectbox', 'Expérience botanique', '', 1, 0, 0, 0, 'custom', 1),
-
 
660
// (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),
134
	}
661
// (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),
-
 
662
// (26, 3, 0, 'selectbox', 'Métier', '', 0, 0, 3, 0, 'custom', 1),
-
 
663
// (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),
-
 
664
// (69, 2, 0, 'selectbox', 'Membre d''une association naturaliste', '', 0, 0, 1, 0, 'custom', 1),
-
 
665
// (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),
135
	
666
// (52, 3, 0, 'url', 'Site web', 'Si vous avez un site web personnel', 0, 0, 2, 0, '', 1),
-
 
667
// (53, 3, 0, 'textarea', 'Présentation', '', 0, 0, 0, 0, '', 1),
-
 
668
// (54, 1, 0, 'checkbox', 'Inscription à la lettre d''actualité', '', 0, 0, 9, 0, 'custom', 1),
-
 
669
// (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),
-
 
670
// (592, 1, 0, 'selectbox', 'Département', '', 0, 0, 5, 0, 'custom', 1),
-
 
671
 
-
 
672
// Correspondances entre les anciennes meta et celles de BP :
-
 
673
// nom du champ             ; id actuel ; id BP       ; valeurs
136
	private function migrerUtilisateurProfil() {
674
// prenom                   ; 7         ; 10
-
 
675
// experience bota          ; 4         ; 12      (également présent dans la table annuaire_tela.U_NIV mais n'est jamais mis à jour)
-
 
676
// departement (ou cp)      ; 13        ; 592         ; pas trouvé d'exemple (faut utiliser annuaire_tela.U_ZIP_CODE)
-
 
677
// conditions d'utilisation ; 15        ; 59 sur test (1035 sur preprod)          ; 1
-
 
678
// lettre d'actu            ; 14        ; 54          ; pas trouvé d'exemple
-
 
679
// presentation             ; 125       ; 53          ; juste du texte
-
 
680
// site web                 ; 134       ; 52      (n'est pas rempli, c'est la valeur de annuaire_tela.U_WEB qui est utilisée en vrai)
-
 
681
// adresse                  ; 132       ; 51          ; pas trouvé d'exemple
-
 
682
// membre asso natur        ; 133       ; 69          ; [30833, 30834, 30811, 30812, 30813]
-
 
683
// compte                   ; pas d'équivalent ; 46
-
 
684
// metier                   ; pas d'équivalent ; 26
-
 
685
// zone geo d'interet       ; 120       ; 61          ; [30806] ex: 30805;;30806;;30807
-
 
686
// espece d'interet         ; pas forcément ça 8 ; 63 ; [30829]
-
 
687
 
-
 
688
  // l'index c'est l'identifiant actuel (amv_ce_colonne), et la valeur c'est celle coté bp
-
 
689
  $correspondance_categories = [
-
 
690
    '99'  => '1', // pseudo
-
 
691
    '2'   => '137', // langues
-
 
692
    '13'  => '592', // code postal
-
 
693
    '137' => '2', // date naissance
-
 
694
    '12'  => '3', // pays
-
 
695
    '103' => '4', // ville
-
 
696
    '1'   => '9', // nom
-
 
697
    '7'   => '10', // prenom
-
 
698
    '4'   => '12', // niveau bota
-
 
699
    '8'   => '63', // espece d'interet
-
 
700
    '120' => '61', // zones géo
-
 
701
    '133' => '69', // membre asso natur
-
 
702
    '132' => '51', // adresse
-
 
703
    '134' => '52', // site web
-
 
704
    '125' => '53', // presentation
137
		$retour = array();
705
    '14'  => '54', // lettre d'actu
-
 
706
    '15'  => '59', // conditions d'utilisation
-
 
707
  ];
-
 
708
 
-
 
709
  // expériences pour déterminer les metas utilisées de cotre coté
-
 
710
  // résultat de la requête
-
 
711
  // 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;
-
 
712
  // experience_bota  30787
138
		$requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME`, U_WEB, `U_CITY`, `U_COUNTRY`, pays, `U_NIV`,  `LABEL_NIV` FROM `annuaire_tela` 
713
  // conditions_utilisation  1
-
 
714
  // pseudo  KillianPseudoTest
-
 
715
  // date_naissance  02/01/1990
-
 
716
  // presentation  J'ai commencé la botanique hier, après avoir fait ...
-
 
717
  // specialite_bota_groupes   30829;;30837
-
 
718
  // specialite_bota_geo   30806;;30807
-
 
719
  // langues   30842;;30847
139
				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` 
720
  // mon_blog  http://lolilol.lol
-
 
721
  // membre_asso_bota  30833
140
				LEFT JOIN `annuaire_LABEL_NIV` ON `ID_LABEL_NIV` = `U_NIV`;";
722
  //
-
 
723
  // On voit que nombre de correspondances ne sont en fait pas
-
 
724
 
-
 
725
  $correspondances_niveau_bota = [
-
 
726
    '30786' => 'Débutant',
141
		$utilisateurs = $this->bdd->recupererTous($requete);
727
    '30787' => 'Ayant une bonne pratique',
142
		$requete_supp = "SELECT *  FROM `annu_meta_valeurs` WHERE `amv_ce_colonne` in (2,137, 99, 125) and (amv_valeur != ''  and amv_valeur != 0)";
728
    '30788' => 'Confirmé',
-
 
729
    '30790' => 'Ne se prononce pas'
143
		$infos_supp = $this->bdd->recupererTous($requete_supp); 
730
  ];
144
		$codes_langues = array("30842"=>"Anglais",
731
 
-
 
732
  $correspondances_membre_asso_naturaliste = [
-
 
733
    '30833' => 'Oui',
-
 
734
    '30834' => 'Non',
-
 
735
    '30811' => 'Ne se prononce pas',
-
 
736
    '30812' => 'Oui',
-
 
737
    '30813' => 'Non'
-
 
738
  ];
-
 
739
 
-
 
740
  // 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";}
-
 
741
  $correspondances_zones_geo = [
-
 
742
    '30805' => 'Zones tempérées', // Zones géographiques : tempérées et boréales
-
 
743
    '30806' => 'Zones méditerranéennes', // Zone géographique : Méditerranéenne
-
 
744
    '30807' => 'Zones tropicales' // Zones géographiques : subtropicales à tropicales
-
 
745
  ];
-
 
746
 
-
 
747
  // correspondance espèces d'interet
145
				"30843"=>"Allemand",
748
 
146
				"30844"=>"Italien",
749
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data');
-
 
750
 
147
				"30845"=>"Espagnol",
751
  $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)";
148
				"30846"=>"Arabe",
752
  $infos_supp = $bdTelaProd->query($requete_supp)->fetchAll(PDO::FETCH_ASSOC);
149
				"30847"=>"Chinois",
753
 
150
				"30848"=>"Russe");
-
 
151
		foreach ($infos_supp as $infos) {
754
  foreach ($infos_supp as $infos) {
152
			if ($infos['amv_ce_colonne'] == 2) {
755
    switch ($infos['amv_ce_colonne']) {
-
 
756
      case 2: // langues
-
 
757
        //exemple a:3:{i:0;s:7:"Anglais";i:1;s:8:"Espagnol";i:2;s:7:"Italien";}
-
 
758
        $langues = explode(';;', $infos['amv_valeur']);
-
 
759
        if (count($langues)) {
-
 
760
          $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = serialize($langues);
153
				//exemple a:3:{i:0;s:7:"Anglais";i:1;s:8:"Espagnol";i:2;s:7:"Italien";}
761
        }
-
 
762
 
-
 
763
        break;
-
 
764
      case 4: // niveau bota
-
 
765
        $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $correspondances_niveau_bota[$infos['amv_valeur']];
-
 
766
 
-
 
767
        break;
-
 
768
      case 133: // asso naturalistes
-
 
769
        $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $correspondances_membre_asso_naturaliste[$infos['amv_valeur']];
-
 
770
 
-
 
771
        break;
-
 
772
      case 15: // conditions d'utilisation
-
 
773
        if (1 == $infos['amv_valeur']) {
-
 
774
          $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = serialize("J\'accepte les conditions d\'utilisation");
-
 
775
        }
154
				$langues = explode(";;", $infos['amv_valeur']);
776
 
155
				$valeur = "a:".count($langues).':{';
777
        break;
-
 
778
      case 120: // zones géo
-
 
779
        // exemple: a:3:{i:0;s:16:"Zones tropicales";i:1;s:24:"Zones méditerranéennes";i:2;s:8:"Montagne";}
-
 
780
        $zones_geo = explode(';;', $infos['amv_valeur']);
156
				foreach ($langues as $n=>$langue) {
781
        if (count($zones_geo)) {
-
 
782
          $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = serialize($zones_geo);
-
 
783
        }
157
					$valeur .= 'i:'.$n.';s:'.strlen($codes_langues[$langue]).':"'.$codes_langues[$langue].'";';
784
 
158
				}
785
        break;
Line -... Line 786...
-
 
786
      default:
-
 
787
        $supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $infos['amv_valeur'];
159
				$valeur .='}';
788
 
160
				$supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $valeur;
789
        break;
161
			} else {
-
 
162
				$supp[$infos['amv_cle_ligne']][$infos['amv_ce_colonne']] = $infos['amv_valeur'];
790
    }
163
			}
791
  }
-
 
792
 
-
 
793
  $requete = "SELECT `U_ID`, `U_NAME`, `U_SURNAME`, U_WEB, `U_CITY`, `U_COUNTRY`, pays, `LABEL_NIV`, `U_ZIP_CODE` FROM `annuaire_tela`
-
 
794
    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`";
-
 
795
  $utilisateurs = $bdTelaProd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
796
 
-
 
797
  $compteur = 0;
-
 
798
  foreach ($utilisateurs as $utilisateur) {
-
 
799
    // on va essayer de trouver le département à partir du code postal
-
 
800
    if (preg_match('@(?:^(\d{2})(\d)\d{2}.*$)|(?:^(\d{2})\s.*$)@', $utilisateur['U_ZIP_CODE'], $matches)) {
-
 
801
      $numero_departement = $matches[1];
-
 
802
      $numero_complementaire = $matches[2]; // pour la corse (201/202) ou les  // DOM (97X) et TOM (98X)
-
 
803
 
-
 
804
      switch ($numero_departement) {
-
 
805
        case 975: // Saint-Pierre-et-Miquelon
-
 
806
        case 98: // TOM (98X)
-
 
807
          // on ne gère pas ces cas, considérés comme des pays à part dans le formulaire d'inscription
-
 
808
          break;
-
 
809
        case 97: // DOM (97X)
-
 
810
        case 20: // Corse (201/202)
-
 
811
          if (isset($departements[$numero_departement . $numero_complementaire])) {
-
 
812
            $utilisateur['U_ZIP_CODE'] = $departements[$numero_departement . $numero_complementaire];
-
 
813
          }
-
 
814
          break;
-
 
815
        default:
164
		}
816
          if (isset($departements[$numero_departement])) {
165
		
817
            $utilisateur['U_ZIP_CODE'] = $departements[$numero_departement];
166
		$correspondance_categories = array("99"=>"1",
818
          }
167
				"137"=>"2",
819
          break;
168
				"125"=>"11",
820
      }
169
				"2"=>"13");
821
    }
170
		foreach ($utilisateurs as $utilisateur) {
822
 
171
			$requete_insert = "INSERT INTO ".$this->basewp."bp_xprofile_data (`field_id`, `user_id`, `value`, `last_updated`) VALUES
823
    $requeteInsert = "INSERT INTO " . $prefixe_tables_wp . "bp_xprofile_data (`field_id`, `user_id`, `value`, `last_updated`) VALUES
172
				('3', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['pays'])}, '2016-05-19 15:06:16'),
824
      ('3', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['pays'])}, '2017-05-19 15:06:16'),
173
				('4', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['U_CITY'])}, '2016-05-19 15:06:16'),
825
      ('4', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_CITY'])}, '2017-05-19 15:06:16'),
174
				('9', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['U_NAME'])}, '2016-05-19 15:06:16'),
826
      ('9', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_NAME'])}, '2017-05-19 15:06:16'),
175
				('10', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['U_SURNAME'])}, '2016-05-19 15:06:16'),
827
      ('10', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_SURNAME'])}, '2017-05-19 15:06:16'),
176
				('12', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['LABEL_NIV'])}, '2016-05-19 15:06:16'),
828
      ('592', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_ZIP_CODE'])}, '2017-05-19 15:06:16'),
-
 
829
      ('21', {$utilisateur['U_ID']}, {$bdWordpress->quote($utilisateur['U_WEB'])}, '2017-05-19 15:06:16')";
-
 
830
    if (isset($supp[$utilisateur['U_ID']])) {
-
 
831
      foreach ($supp[$utilisateur['U_ID']] as $num => $val){
177
				('21', {$utilisateur['U_ID']}, {$this->bdd->proteger($utilisateur['U_WEB'])}, '2016-05-19 15:06:16')";
832
        $requeteInsert .= ",({$correspondance_categories[$num]}, {$utilisateur['U_ID']}, {$bdWordpress->quote($val)}, '2017-05-19 15:06:16')";
-
 
833
      }
-
 
834
    }
-
 
835
    $requeteInsert .= "
-
 
836
      ON DUPLICATE KEY UPDATE `field_id`=VALUES(`field_id`), `user_id`=VALUES(`user_id`), `value`=VALUES(`value`), `last_updated`=VALUES(`last_updated`);";
-
 
837
 
-
 
838
    try {
-
 
839
      $bdWordpress->exec($requeteInsert);
-
 
840
 
-
 
841
      $compteur++;
-
 
842
    } catch(Exception $e) {
178
			if (isset($supp[$utilisateur['U_ID']])) {
843
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL;
179
				foreach ($supp[$utilisateur['U_ID']] as $num=>$val){
-
 
180
					$requete_insert .= ",({$correspondance_categories[$num]}, {$utilisateur['U_ID']}, {$this->bdd->proteger($val)}, '2016-05-19 15:06:16')";
844
 
Line -... Line 845...
-
 
845
      if (true !== $modeBourrin) {
-
 
846
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'bp_xprofile_data');
-
 
847
 
-
 
848
        die(var_dump($e->errorInfo));
-
 
849
      }
-
 
850
    }
-
 
851
  }
-
 
852
 
-
 
853
  echo '-- ' . $compteur . '/' . count($utilisateurs) . ' profils d\'utilisateur migrés. ' . PHP_EOL;
-
 
854
}
-
 
855
 
-
 
856
function migrerEvenements() {
-
 
857
  global $prefixe_tables_wp;
-
 
858
  global $bdTelaProd;
-
 
859
  global $bdWordpress;
-
 
860
  global $modeBourrin;
-
 
861
 
-
 
862
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
-
 
863
 
-
 
864
  $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;";
-
 
865
 
-
 
866
  $evenements = $bdTelaProd->query($requeteEvenements)->fetchAll(PDO::FETCH_ASSOC);
-
 
867
 
181
				}				
868
  $compteur = 0;
-
 
869
  foreach ($evenements as $evenement) {
182
			}
870
    // gestion des dates normales et dates en GMT
-
 
871
    $date = new DateTime($evenement['post_date'], new DateTimeZone('Europe/Paris'));
-
 
872
    $evenement['post_date_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s');
-
 
873
    $date = new DateTime($evenement['post_modified'], new DateTimeZone('Europe/Paris'));
-
 
874
    $evenement['post_modified_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s');
-
 
875
 
-
 
876
    $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'
-
 
877
      . '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $evenement)) . ')'
-
 
878
      . '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`);'
-
 
879
    ;
-
 
880
 
-
 
881
    try {
-
 
882
      $bdWordpress->exec($requete);
-
 
883
 
-
 
884
      $compteur++;
-
 
885
    } catch(Exception $e) {
-
 
886
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL;
-
 
887
 
-
 
888
      if (true !== $modeBourrin) {
-
 
889
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
-
 
890
 
-
 
891
        die(var_dump($e->errorInfo));
-
 
892
      }
-
 
893
    }
-
 
894
 
-
 
895
    // collecte les infos pour l'enregistrement des redirections 301 des articles
-
 
896
    $ancienne_url = 'http://www.tela-botanica.org/page:evenements?action=8&id_fiche=' . $evenement['ID'] - 10000;
-
 
897
    $insert_redirection[] = '(' . $article['ID'] . ', ' . $bdWordpress->quote($ancienne_url) . ')';
-
 
898
 
-
 
899
    $requeteInsertRedirection = 'INSERT INTO ' . $prefixe_tables_wp . 'slug_history (`post_id`, `url`)
-
 
900
      VALUES ' . implode(', ', $insert_redirection) . '
-
 
901
      ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `url`=VALUES(`url`);';
-
 
902
 
-
 
903
    try {
-
 
904
        $bdWordpress->exec($requeteInsertRedirection);
-
 
905
      } catch(Exception $e) {
-
 
906
        echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsertRedirection]" . PHP_EOL;
-
 
907
 
-
 
908
        if (true !== $modeBourrin) {
-
 
909
          restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
-
 
910
          restaureLaTable($bdWordpress, $prefixe_tables_wp . 'slug_history');
183
			$requete_insert .= ";";
911
 
-
 
912
          die(var_dump($e->errorInfo));
184
			$retour[] = $this->bdd->executer($requete_insert);
913
        }
-
 
914
      }
185
		}
915
  }
-
 
916
 
-
 
917
  echo '-- ' . $compteur . '/' . count($evenements) . ' évènements migrés. ' . PHP_EOL;
-
 
918
}
-
 
919
/*
186
		return $retour;
920
 * @todo vérifier que les metas sont bien synchros avec l'actuel
-
 
921
 */
-
 
922
function migrerEvenementsMeta() {
-
 
923
  global $prefixe_tables_wp;
-
 
924
  global $bdTelaProd;
-
 
925
  global $bdWordpress;
-
 
926
  global $modeBourrin;
-
 
927
 
-
 
928
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'postmeta');
-
 
929
 
-
 
930
  $fin = 'AS meta_value FROM `bazar_fiche` WHERE year(`bf_date_debut_validite_fiche`) >= 2017';
-
 
931
 
-
 
932
	$requeteEvenementsChampsACF = "SELECT `bf_id_fiche`+10000 AS post_id,  '_edit_lock' AS meta_key, CONVERT(CONVERT('1476892394:1'  USING utf8)  USING utf8) $fin UNION
-
 
933
SELECT `bf_id_fiche`+10000 AS post_id,  '_edit_last' AS meta_key, CONVERT('1'  USING utf8) $fin UNION
-
 
934
SELECT `bf_id_fiche`+10000 AS post_id,  '_alp_processed' AS meta_key, CONVERT('1476891070'  USING utf8) $fin UNION
-
 
935
 
-
 
936
SELECT `bf_id_fiche`+10000 AS post_id,  '_place' AS meta_key, CONVERT('field_580366d5a9e01'  USING utf8) $fin UNION
-
 
937
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
-
 
938
 
-
 
939
SELECT `bf_id_fiche`+10000 AS post_id,  '_contact_0_description' AS meta_key, CONVERT('field_580e45789024f'  USING utf8) $fin UNION
-
 
940
SELECT `bf_id_fiche`+10000 AS post_id,  'contact_0_description' AS meta_key, CONVERT(bf_nom_contact  USING utf8) $fin UNION
-
 
941
 
-
 
942
SELECT `bf_id_fiche`+10000 AS post_id,  '_prices' AS meta_key, CONVERT('field_5803a6059a5d1'  USING utf8) $fin UNION
-
 
943
SELECT `bf_id_fiche`+10000 AS post_id,  'prices' AS meta_key, CONVERT(bf_tarif_individuel  USING utf8) $fin UNION
-
 
944
SELECT `bf_id_fiche`+10000 AS post_id,  '_is_free' AS meta_key, CONVERT('field_5803a5d09a5d0'  USING utf8) $fin UNION
-
 
945
SELECT `bf_id_fiche`+10000 AS post_id,  'is_free' AS meta_key, CONVERT('0'  USING utf8) $fin UNION
-
 
946
 
-
 
947
SELECT `bf_id_fiche`+10000 AS post_id,  '_image' AS meta_key, CONVERT('field_5803a65a08014'  USING utf8) $fin UNION
-
 
948
SELECT `bf_id_fiche`+10000 AS post_id,  'image' AS meta_key, CONVERT('7669'  USING utf8) $fin UNION
-
 
949
SELECT `bf_id_fiche`+10000 AS post_id,  '_contact' AS meta_key, CONVERT('field_580e45279024d'  USING utf8) $fin UNION
-
 
950
SELECT `bf_id_fiche`+10000 AS post_id,  'contact' AS meta_key, CONVERT('1'  USING utf8) $fin UNION
187
	}
951
 
-
 
952
SELECT `bf_id_fiche`+10000 AS post_id,  '_description' AS meta_key, CONVERT('field_580366bfa9e00'  USING utf8) $fin UNION
188
	
953
SELECT `bf_id_fiche`+10000 AS post_id,  'description' AS meta_key, CONVERT(bf_description  USING utf8) $fin UNION
-
 
954
 
-
 
955
SELECT `bf_id_fiche`+10000 AS post_id,  '_date' AS meta_key, CONVERT('field_580364c892ee1'  USING utf8) $fin UNION
189
	private function migrerEvenements() {
956
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
-
 
957
SELECT `bf_id_fiche`+10000 AS post_id,  '_date_end' AS meta_key, CONVERT('field_5803659792ee5'  USING utf8) $fin UNION
-
 
958
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;";
-
 
959
 
-
 
960
	$evenementsChampsACF = $bdTelaProd->query($requeteEvenementsChampsACF)->fetchAll(PDO::FETCH_ASSOC);
-
 
961
 
190
		$retour = array();
962
  $compteur = 0;
-
 
963
  foreach ($evenementsChampsACF as $champACF) {
-
 
964
    $requete = 'INSERT INTO ' . $prefixe_tables_wp . 'postmeta (`post_id`, `meta_key`, `meta_value`) VALUES'
-
 
965
      . '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $champACF)) . ')'
191
		/*
966
      . 'ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `meta_key`=VALUES(`meta_key`), `meta_value`=VALUES(`meta_value`);'
-
 
967
      ;
192
		 * */
968
 
-
 
969
    try {
-
 
970
      $bdWordpress->exec($requete);
-
 
971
 
-
 
972
      $compteur++;
-
 
973
    } catch(Exception $e) {
-
 
974
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL;
-
 
975
 
-
 
976
      if (true !== $modeBourrin) {
193
		$requete = "";
977
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'postmeta');
194
		$articles = $this->bdd->recupererTous($requete);
978
 
195
		
979
        die(var_dump($e->errorInfo));
196
		
980
      }
197
		$requete_insert = "INSERT INTO ".$this->basewp."posts VALUES ".implode($insert, ', ').";";
981
    }
198
		$retour[] = $this->bdd->executer($requete_insert);
982
  }
199
		echo 'Il y a '.count($retour).' actualités migrées '."--";
983
 
200
		return $retour;
984
  echo '-- ' . $compteur . '/' . count($evenementsChampsACF) . ' meta d\'évènements migrées. ' . PHP_EOL;
201
	}
985
}
202
	
986
 
203
	private function migrerEvenementsRubrique() {
987
// private function migrerEvenementsRubrique() {
204
		$requete = "INSERT INTO ".$this->basewp."term_relationships (`object_id`, `term_taxonomy_id`)
988
// 	$requete = "INSERT INTO ".$this->basewp."term_relationships (`object_id`, `term_taxonomy_id`)
-
 
989
// 		SELECT `bf_id_fiche` +10000, replace( replace( replace( replace( `bf_ce_nature` , '3', '39' ) , '4', '38' ) , '2', '37' ) , '1', '40' )
-
 
990
// 			FROM `bazar_fiche`
-
 
991
// 			WHERE year( `bf_date_debut_validite_fiche` ) =2016
-
 
992
// 			UNION SELECT `bf_id_fiche` +10000, 36 AS cat_evnt
-
 
993
// 			FROM `bazar_fiche`
-
 
994
// 			WHERE year( `bf_date_debut_validite_fiche` ) =2016";
-
 
995
// 	$retour = $this->bdd->executer($requete);
-
 
996
// 	echo 'Il y a '.count($retour).' actualités migrées '."--";
-
 
997
// }
-
 
998
 
-
 
999
 
-
 
1000
 /**
-
 
1001
  * Explication des champs de la table wp_posts : https://deliciousbrains.com/tour-wordpress-database/#wp_posts
-
 
1002
  *
-
 
1003
  * @todo : revoir la méthode d'ajout, là c'est un peu violent, ça écrase les menus, le footer, toussa
205
			SELECT `bf_id_fiche` +10000, replace( replace( replace( replace( `bf_ce_nature` , '3', '39' ) , '4', '38' ) , '2', '37' ) , '1', '40' )
1004
  * (wai les menus c'est stocké dans la table posts, deal with it)
-
 
1005
  * Vérifier l'auto-incrément de la table Posts, 20000 ids sont censés être réservés aux articles importés
-
 
1006
  * Voir : https://wordpress.stackexchange.com/a/78317
-
 
1007
  */
-
 
1008
function migrerActualites() {
-
 
1009
  global $prefixe_tables_wp;
-
 
1010
  global $bdSpip;
-
 
1011
  global $bdWordpress;
-
 
1012
  global $modeBourrin;
-
 
1013
  global $doc_loc;
-
 
1014
 
206
				FROM `bazar_fiche`
1015
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
Line 207... Line -...
207
				WHERE year( `bf_date_debut_validite_fiche` ) =2016
-
 
208
				UNION SELECT `bf_id_fiche` +10000, 36 AS cat_evnt
-
 
209
				FROM `bazar_fiche`
1016
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'slug_history');
210
				WHERE year( `bf_date_debut_validite_fiche` ) =2016";
1017
 
211
		$retour = $this->bdd->executer($requete);
1018
  $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`";
212
		echo 'Il y a '.count($retour).' actualités migrées '."--";
1019
  $documents = $bdSpip->query($requete_doc)->fetchAll(PDO::FETCH_ASSOC);
213
		return $retour;
1020
 
214
	}
1021
  foreach ($documents as $doc) {
215
	
1022
    $doc_loc[$doc['id_document']] = $doc['fichier'];
216
	private function migrerActualites() {
1023
  }
217
		$retour = array();
1024
 
218
		/*INSERT INTO `wp4_posts`
1025
	/*INSERT INTO `wp4_posts`
219
		 SELECT spip_articles.`id_article` as ID, `id_auteur` as post_author, `date` as post_date, `date` as post_date_gmt,
1026
	 SELECT spip_articles.`id_article` as ID, `id_auteur` as post_author, `date` as post_date, `date` as post_date_gmt,
220
		 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,
-
 
-
 
1027
	 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
		 `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,
1028
	 `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,
222
		 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)
1029
	 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)
223
		*/
1030
	*/
224
		$requete = "SELECT spip_articles.`id_article` as ID, `id_auteur` as post_author, `date` as post_date, `date` as post_date_gmt,
-
 
225
			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,
1031
	$requete = "SELECT spip_articles.`id_article` AS ID, `id_auteur` AS post_author, `date` AS post_date, `date` AS post_date_gmt,
Line 226... Line 1032...
226
			`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,
1032
		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,
227
			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)";
1033
		`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,
228
		$articles = $this->bdd->recupererTous($requete);
1034
		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() . " )";
-
 
1035
	$articles = $bdSpip->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
1036
 
-
 
1037
	$i = 0;
-
 
1038
  $compteurSucces = 0;
-
 
1039
  $length = count($articles);
-
 
1040
	foreach ($articles as $article) {
-
 
1041
 
229
		$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`";
1042
		$article['post_content'] = preg_replace("/\[([^\[]*)\-\>([^\[]*)\]/", '<a href="\2">\1</a>', $article['post_content']);
-
 
1043
		//$images = preg_grep("\<img([0-9]*)\|[a-z]*\>", $article['post_content']);
-
 
1044
		$article['post_content'] = preg_replace_callback("/\<img([0-9]*)\|[a-z]*\>/", 'transformerNumEnUrl', $article['post_content']);
-
 
1045
 
-
 
1046
    // gestion des dates normales et dates en GMT
-
 
1047
    $date = new DateTime($article['post_date'], new DateTimeZone('Europe/Paris'));
-
 
1048
    $article['post_date_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s');
-
 
1049
    $date = new DateTime($article['post_modified'], new DateTimeZone('Europe/Paris'));
-
 
1050
    $article['post_modified_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s');
-
 
1051
 
230
		$documents = $this->bdd->recupererTous($requete_doc);
1052
		$insert[] = '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $article)) . ')';
231
		foreach ($documents as $doc) {
1053
 
-
 
1054
		// collecte les infos pour l'enregistrement des redirections 301 des articles
232
			$this->doc_loc[$doc['id_document']] = $doc['fichier'];
1055
		$ancienne_url = 'http://www.tela-botanica.org/actu/article' . $article['ID'] . '.html';
-
 
1056
		$insert_redirection[] = '(' . $article['ID'] . ', ' . $bdWordpress->quote($ancienne_url) . ')';
-
 
1057
 
-
 
1058
		$i++;
-
 
1059
 
-
 
1060
    // Permet de d'insérer par lot de 50 ou bien à la fin
-
 
1061
		if (0 === $i % 50 || $i === $length -1) {
-
 
1062
			$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) . '
-
 
1063
        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`);';
-
 
1064
			try {
-
 
1065
        $bdWordpress->exec($requeteInsert);
-
 
1066
 
-
 
1067
        $compteurSucces += count($insert);
233
		}$i=0;
1068
      } catch(Exception $e) {
-
 
1069
        echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL;
-
 
1070
 
-
 
1071
        if (true !== $modeBourrin) {
-
 
1072
          restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
234
		foreach ($articles as $article) {
1073
          restaureLaTable($bdWordpress, $prefixe_tables_wp . 'slug_history');
-
 
1074
 
-
 
1075
          die(var_dump($e->errorInfo));
-
 
1076
        }
235
			
1077
      }
-
 
1078
			$insert = array();
236
			$article['post_content'] = preg_replace("/\[([^\[]*)\-\>([^\[]*)\]/", '<a href="\2" target="_blank">\1</a>', $article['post_content']);
1079
 
237
			//$images = preg_grep("\<img([0-9]*)\|[a-z]*\>", $article['post_content']);
1080
			$requeteInsertRedirection = 'INSERT INTO ' . $prefixe_tables_wp . 'slug_history (`post_id`, `url`)
-
 
1081
        VALUES ' . implode(', ', $insert_redirection) . '
238
			$article['post_content'] = preg_replace_callback("/\<img([0-9]*)\|[a-z]*\>/", array($this, transformerNumEnUrl), $article['post_content']);
1082
        ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `url`=VALUES(`url`);';
-
 
1083
			try {
-
 
1084
        $bdWordpress->exec($requeteInsertRedirection);
239
			$insert[] = "(".implode($this->bdd->proteger($article), ', ').")"; $i++;
1085
      } catch(Exception $e) {
-
 
1086
        echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsertRedirection]" . PHP_EOL;
240
			if ($i >50) {
1087
 
Line -... Line 1088...
-
 
1088
        if (true !== $modeBourrin) {
-
 
1089
          restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
-
 
1090
          restaureLaTable($bdWordpress, $prefixe_tables_wp . 'slug_history');
241
				$requete_insert = "INSERT INTO ".$this->basewp."posts VALUES ".implode($insert, ', ').";";
1091
 
-
 
1092
          die(var_dump($e->errorInfo));
-
 
1093
        }
242
				$retour[] = $this->bdd->executer($requete_insert);
1094
      }
243
				$insert = array(); $i = 0;
1095
			$insert_redirection = array();
244
			}
1096
		}
245
		}
1097
	}
-
 
1098
 
246
		$requete_insert = "INSERT INTO ".$this->basewp."posts VALUES ".implode($insert, ', ').";";
1099
  echo '-- ' . $compteurSucces . '/' . count($articles) . ' actualités migrées. ' . PHP_EOL;
247
		$retour[] = $this->bdd->executer($requete_insert);
1100
}
Line -... Line 1101...
-
 
1101
 
-
 
1102
function transformerNumEnUrl($matches) {
-
 
1103
  global $doc_loc;
-
 
1104
 
-
 
1105
	$remplace = '';
-
 
1106
	if (isset($matches[1])) {
-
 
1107
		$remplace = '<img src="http://www.tela-botanica.org/actu/'.$doc_loc[$matches[1]].'" \/\>';
-
 
1108
	}
-
 
1109
 
-
 
1110
	return $remplace;
-
 
1111
}
-
 
1112
 
-
 
1113
// Retourne les id des rubriques SPIP à migrer
-
 
1114
function _rubriquesSpipAMigrer() {
-
 
1115
  global $correspondanceCategorieRubriques;
-
 
1116
 
-
 
1117
  $rubriquesAMigrer = [];
-
 
1118
  foreach ($correspondanceCategorieRubriques as $correspondance) {
-
 
1119
    $rubriquesAMigrer[] = implode(',', $correspondance['rubrique-a-migrer']);
-
 
1120
  }
248
		echo 'Il y a '.count($retour).' actualités migrées '."--";
1121
 
-
 
1122
  return implode(',', $rubriquesAMigrer);
-
 
1123
}
-
 
1124
 
-
 
1125
/**
-
 
1126
 * Ça c'est fait pour que les articles importés avant se retrouvent dans la bonne catégorie
-
 
1127
 * (Du coup faut gerer les correspondances et tout, folie!)
-
 
1128
 * Là dans l'état faut créer les catégories correctement coté Wordpress avant de lancer le script, puis corriger les noms/slugs toussa
-
 
1129
 *
-
 
1130
 * @todo revoir l'insertion, ça défonce les menus là... Voir : https://wordpress.stackexchange.com/a/78317
-
 
1131
 * @todo vérifier que les évènements sont aussi migrés ou alors créer la fonction de migration équivalente pour eux
-
 
1132
 */
-
 
1133
function migrerRubriques() {
-
 
1134
  global $prefixe_tables_wp;
-
 
1135
  global $bdSpip;
-
 
1136
  global $bdWordpress;
-
 
1137
  global $modeBourrin;
-
 
1138
  global $correspondanceCategorieRubriques;
-
 
1139
 
-
 
1140
  // Contient la table de correspondances rubrique(SPIP)-categorie(WP), indexée par rubrique
-
 
1141
  $rubriqueCategorie = [];
-
 
1142
  foreach ($correspondanceCategorieRubriques as $correspondance) {
-
 
1143
    $requeteCategorie = 'SELECT term_id FROM ' . $prefixe_tables_wp . 'terms WHERE name = ' . $bdWordpress->quote($correspondance['titre']) . ' AND slug = ' . $bdWordpress->quote($correspondance['slug']) . ';';
-
 
1144
 
-
 
1145
    $categorie = $bdWordpress->query($requeteCategorie)->fetchAll(PDO::FETCH_ASSOC);
-
 
1146
 
-
 
1147
    if (0 === count($categorie)) {
-
 
1148
      var_dump($correspondance);
-
 
1149
      die('catégorie inéxistante, est-elle bien créée coté wordpress ? est-ce le bon slug ?');
-
 
1150
    } elseif (1 < count($categorie)) {
-
 
1151
      die('catégorie multiple, je suis censé deviner laquelle est la bonne ? merci de faire le ménage :)');
-
 
1152
    }
-
 
1153
 
-
 
1154
    // On fait correspondre à chaque rubrique à migrer sa catégorie
-
 
1155
    foreach ($correspondance['rubrique-a-migrer'] as $rubrique) {
-
 
1156
      $rubriqueCategorie[$rubrique] = $categorie[0]['term_id'];
-
 
1157
    }
-
 
1158
 
-
 
1159
    // Initialisation des compteurs
-
 
1160
    $compteur[$categorie[0]['term_id']] = 0;
249
		return $retour;
1161
  }
-
 
1162
 
-
 
1163
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'term_relationships');
-
 
1164
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'term_taxonomy');
-
 
1165
 
-
 
1166
  $requeteActualitesRubriques = 'SELECT `id_article`, `id_rubrique`
-
 
1167
    FROM `spip_articles` WHERE id_rubrique IN (' . _rubriquesSpipAMigrer() . ');' ;
-
 
1168
 
-
 
1169
  $actualites = $bdSpip->query($requeteActualitesRubriques)->fetchAll(PDO::FETCH_ASSOC);
-
 
1170
 
-
 
1171
  $compteur = 0;
-
 
1172
  foreach ($actualites as $actualite) {
-
 
1173
    $requete = 'INSERT INTO ' . $prefixe_tables_wp . 'term_relationships (`object_id`, `term_taxonomy_id`)
-
 
1174
      VALUES(' . $actualite['id_article'] . ', ' . $rubriqueCategorie[$actualite['id_rubrique']] . ')
-
 
1175
      ON DUPLICATE KEY UPDATE `object_id`=VALUES(`object_id`), `term_taxonomy_id`=VALUES(`term_taxonomy_id`);';
-
 
1176
 
-
 
1177
    $updateCompteur = 'INSERT INTO ' . $prefixe_tables_wp . 'term_taxonomy (`term_id`, `taxonomy`, `count`) '
-
 
1178
      . 'VALUES(' . $rubriqueCategorie[$actualite['id_rubrique']] . ', "category", 1)'
-
 
1179
      . 'ON DUPLICATE KEY UPDATE `term_id`=VALUES(`term_id`), `taxonomy`=VALUES(`taxonomy`), `count`=`count`+1'
-
 
1180
    ;
-
 
1181
 
-
 
1182
    try {
-
 
1183
      $bdWordpress->exec($requete);
-
 
1184
      $bdWordpress->exec($updateCompteur);
-
 
1185
 
-
 
1186
      $compteur++;
-
 
1187
    } catch(Exception $e) {
-
 
1188
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL;
-
 
1189
 
-
 
1190
      if (true !== $modeBourrin) {
-
 
1191
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'term_relationships');
-
 
1192
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'term_taxonomy');
-
 
1193
 
-
 
1194
        die(var_dump($e->errorInfo));
-
 
1195
      }
-
 
1196
    }
-
 
1197
  }
-
 
1198
 
250
	}
1199
  echo '-- ' . $compteur . '/' . count($actualites) . ' rubriques d\'actualités migrées. ' . PHP_EOL;
-
 
1200
}
251
	
1201
 
-
 
1202
function migrerActualitesCommentaires() {
-
 
1203
  global $prefixe_tables_wp;
-
 
1204
  global $bdSpip;
-
 
1205
  global $bdWordpress;
-
 
1206
  global $modeBourrin;
252
	private function transformerNumEnUrl($matches) {
1207
 
-
 
1208
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'comments');
253
		$remplace = "";
1209
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
-
 
1210
 
-
 
1211
  $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`
-
 
1212
    FROM `spip_forum`
-
 
1213
    WHERE id_article IN (SELECT `id_article` FROM `spip_articles` WHERE id_rubrique IN (' . _rubriquesSpipAMigrer() . ')) AND statut = "publie"';
-
 
1214
 
-
 
1215
  $actualitesCommentaires = $bdSpip->query($requeteActualitesCommentaires)->fetchAll(PDO::FETCH_ASSOC);
-
 
1216
 
254
		if (isset($matches[1])) {
1217
  $compteur = 0;
-
 
1218
  foreach ($actualitesCommentaires as $actualiteCommentaire) {
-
 
1219
    $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`) '
-
 
1220
      . 'VALUES(' . implode(', ', array_map(array($bdWordpress, 'quote'), $actualiteCommentaire)) . ')
-
 
1221
      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`);';
-
 
1222
 
-
 
1223
    $updateCompteurCommentaires = 'UPDATE ' . $prefixe_tables_wp . 'posts SET comment_count = comment_count + 1 WHERE ID = ' . $actualiteCommentaire['id_article'] . ';';
-
 
1224
 
-
 
1225
    try {
-
 
1226
      $bdWordpress->exec($requete);
-
 
1227
      $bdWordpress->exec($updateCompteurCommentaires);
255
			$remplace = '<img src="http://www.tela-botanica.org/actu/'.$this->doc_loc[$matches[1]].'" \/\>';
1228
 
Line -... Line 1229...
-
 
1229
      $compteur++;
-
 
1230
    } catch(Exception $e) {
-
 
1231
      echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL;
256
		}
1232
 
257
		return $remplace;
1233
      if (true !== $modeBourrin) {
258
	}
-
 
259
	
1234
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'comments');
-
 
1235
        restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
260
	private function migrerActualitesRubrique() {
1236
 
261
		$requete = "INSERT INTO ".$this->basewp."term_relationships (`object_id`, `term_taxonomy_id`)
1237
        die(var_dump($e->errorInfo));
-
 
1238
      }
Line -... Line 1239...
-
 
1239
    }
262
			SELECT `id_article`, replace(replace(replace(replace(replace(replace(`id_rubrique`, 22, 20), 54, 21), 30, 23), 19, 24), 51, 25), 70, 22)
1240
  }
-
 
1241
 
-
 
1242
  echo '-- ' . $compteur . '/' . count($actualitesCommentaires) . ' commentaires d\'actualité migrés. ' . PHP_EOL;
-
 
1243
}
-
 
1244
 
-
 
1245
function migrerActualitesImageDeCouverture() {
263
			FROM tela_prod_spip_actu.`spip_articles` WHERE id_rubrique in (22,54,70,30,19,51)";
1246
  global $prefixe_tables_wp;
-
 
1247
  global $wordpress_dir;
-
 
1248
  global $bdWordpress;
-
 
1249
  global $bdSpip;
-
 
1250
  global $modeBourrin;
264
		$retour = $this->bdd->executer($requete);
1251
 
265
		echo 'Il y a '.count($retour).' actualités migrées '."--";
1252
 
Line -... Line 1253...
-
 
1253
  // On vérifie qu'on peut bosser
266
		return $retour;
1254
  // Faut être au bon endroit, le repertoire de wordpress
-
 
1255
  // Et avoir wp-cli installé
-
 
1256
  // Un peu plus loin on va charger les images depuis un dossier spécifique
-
 
1257
  $old_path = getcwd();
267
	}
1258
  chdir($wordpress_dir);
-
 
1259
 
-
 
1260
  echo '-- exécution de "wp --info"' . PHP_EOL;
-
 
1261
  exec('wp --info', $output, $exit_code);
-
 
1262
  if (0 !== $exit_code) {
268
	
1263
    die('Faut lancer la commande depuis le repertoire de wordpress (et avoir wp-cli installé)');
-
 
1264
  } else {
-
 
1265
    var_dump($output);
-
 
1266
  }
-
 
1267
 
-
 
1268
  echo '-- recherche du dossier d\'images' . PHP_EOL;
-
 
1269
  if (!file_exists($wordpress_dir . '/IMG')) {
-
 
1270
    die('Faut rsync les images dans wordpress/IMG avant de commencer');
-
 
1271
  }
-
 
1272
 
-
 
1273
  // chdir($old_path); // commenté car inutile de rechanger de répertoire avant la fin du script
-
 
1274
 
-
 
1275
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
269
	private function migrerActualitesCommentaires() {
1276
  sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'postmeta');
Line -... Line 1277...
-
 
1277
 
-
 
1278
  $requete = sprintf('SELECT spip_articles.`id_article` AS ID, `date`, titre FROM `spip_articles` WHERE id_rubrique in ( %s ) ORDER BY id_article', _rubriquesSpipAMigrer());
-
 
1279
  $articles = $bdSpip->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
1280
 
-
 
1281
  $i = 0;
-
 
1282
  $compteurSucces = 0;
-
 
1283
  $compteurEchecs = 0;
-
 
1284
  $compteurAbusay = 0;
-
 
1285
  $length = count($articles);
-
 
1286
  foreach ($articles as $article) {
-
 
1287
 
-
 
1288
 
-
 
1289
    $wpcli_meta = 'wp post meta list ' . $article['ID'] . ' --format=json';
-
 
1290
 
-
 
1291
    exec($wpcli_meta, $wpcli_meta_command_output, $exit_code);
-
 
1292
 
-
 
1293
    // die(var_dump($wpcli_meta_command_output));
-
 
1294
 
-
 
1295
    // on va commencer par vérifier si l'article n'a pas déjà une image de couv
-
 
1296
    // [comme la sortie de "wp post meta get ID" est merdique (toujours à 1 et vide) on va ruser]
-
 
1297
    // cas 1 : le post n'existe pas ; code de sortie  1, tableau vide
-
 
1298
    // cas 2 : listes des metas à gérer
-
 
1299
    if (0 === $exit_code) {
-
 
1300
      $metas = json_decode($wpcli_meta_command_output[0], true);
-
 
1301
      unset($wpcli_meta_command_output);
-
 
1302
 
-
 
1303
      // on va fouiller les metas, si on trouve une image de couverture (_thumbnail_id), on passe à la suite
-
 
1304
      foreach ($metas as $meta) {
-
 
1305
        if ($meta['meta_key'] === '_thumbnail_id') {
-
 
1306
          echo 'han!! le post ' . $article['ID'] . ' bah il a déjà une image, trop abusééééééé' . PHP_EOL;
-
 
1307
          // echo 'id du post de l\'image ' . $meta['meta_value'] . PHP_EOL;
-
 
1308
          $compteurAbusay++;
-
 
1309
 
-
 
1310
          continue 2; // y'a déjà une couverture, on passe au prochain article
-
 
1311
        }
-
 
1312
      }
-
 
1313
    } else {
-
 
1314
      // cas d'erreur, genre le post existe pas, on arrète tout (ou pas)
-
 
1315
      echo $wpcli_meta . PHP_EOL;
-
 
1316
      var_dump($wpcli_meta_command_output);
-
 
1317
      var_dump($exit_code);
-
 
1318
      $compteurEchecs++;
-
 
1319
      // die('Erreur à l\'exécution de la commande');
-
 
1320
      echo('Erreur à l\'exécution de la commande (17)');
-
 
1321
      echo('Faut resynchroniser les actus, merci');
-
 
1322
    }
-
 
1323
 
-
 
1324
    // on va pas aller télécharger les images sur le site, on les mets
-
 
1325
    // dans un dossier exprès
-
 
1326
    // genre :
-
 
1327
    //    rsync -avz root@sequoia:/home/telabotap/www/actu/IMG/arton* wp-content/uploads/2017/03/
-
 
1328
    //
-
 
1329
    // on recherche l'image de couverture dans le dossier
-
 
1330
    $images = glob('IMG/arton' . $article['ID'] . '.*');
-
 
1331
    if (!empty($images)) {
-
 
1332
      $imageChemin = $images[0]; // normalement y'a qu'une image correspondant au filtre
-
 
1333
 
-
 
1334
      if (file_exists($imageChemin)) {
-
 
1335
        $imageNom = strtolower(pathinfo($imageChemin, PATHINFO_FILENAME));
-
 
1336
 
-
 
1337
        $wpcli_commande = 'wp media import ' . $imageChemin . ' --featured_image'
-
 
1338
          . ' --post_id=' . $article['ID']
-
 
1339
          . ' --title="image de couverture de l\'article ' . $article['ID'] . '"'
-
 
1340
          . ' --alt="image de couverture"'
-
 
1341
          . ' --desc="image de couverture de l\'article ' . $article['ID'] . '"' // post_content field
-
 
1342
          . ' --caption="image de couverture de l\'article ' . $article['ID'] . '"' // post_except field
-
 
1343
        ;
-
 
1344
 
-
 
1345
        exec($wpcli_commande, $command_output, $exit_code);
-
 
1346
 
-
 
1347
        if (0 === $exit_code) {
-
 
1348
          foreach ($command_output as $message) {
-
 
1349
            echo $message;
-
 
1350
          }
-
 
1351
          echo PHP_EOL;
-
 
1352
 
-
 
1353
          $compteurSucces++;
-
 
1354
 
-
 
1355
          unset($command_output);
-
 
1356
        } else {
-
 
1357
          echo 'commande en échec : "' . $wpcli_commande . '"' . PHP_EOL;
-
 
1358
          echo PHP_EOL;
-
 
1359
          var_dump($command_output);
-
 
1360
 
-
 
1361
          die('Erreur à l\'exécution de la commande (42)');
-
 
1362
        }
-
 
1363
      } else {
-
 
1364
        echo 'Image manquante : ' . $article['ID'];
-
 
1365
      }
-
 
1366
    }
-
 
1367
    // foreach ($imagesPaths as $path) {
-
 
1368
    //   if (file_exists($path) && is_file($path)) {
-
 
1369
    //     $imageChemin = $path;
-
 
1370
    //     break;
-
 
1371
    //   }
-
 
1372
    // }
-
 
1373
 
-
 
1374
 
-
 
1375
    // Si la méthode avec wp-cli fonctionne pas voir plus bas
-
 
1376
    // En mode sql dessous :
-
 
1377
 
-
 
1378
 
-
 
1379
    // vérifier si artonID.ext
-
 
1380
    // 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 ?
-
 
1381
    //
-
 
1382
    //
-
 
1383
    // Description de la table
-
 
1384
    //
-
 
1385
    // post_author sera admin "1"
-
 
1386
    // post_content sera une description, genre : image de couverture / titre de l'article
-
 
1387
    // post_title c'est le nom de l'image en minuscules sans l'extension
-
 
1388
    // post_excerpt c'est la légende
-
 
1389
    // post_status "inherit" avec post_parent à "0"
-
 
1390
    // comment_status "open"
-
 
1391
    // ping_status "closed"
270
		$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`)
1392
    // post_password vide
-
 
1393
    // post_name c'est comme post_title
-
 
1394
    // to_ping / pinged vides
-
 
1395
    // post_content_filtered vide
-
 
1396
    // post_parent c koi ?
-
 
1397
    // guid c koi ? dans mon exemple c'est l'url absolue de l'image
-
 
1398
    // menu_order à 0
-
 
1399
    // post_type attachment
-
 
1400
    // post_mime_type image/[gif,png,jpeg]
-
 
1401
    // comment_count à 0
-
 
1402
    //
-
 
1403
    //
-
 
1404
    // une image dans la galerie ça consiste en :
-
 
1405
    //  - un post de type attachment comme vu au dessus
-
 
1406
    //  - des meta, à savoir (exemples) :
-
 
1407
    //    - _wp_attached_file 2017/03/acab-11219026_10208737059251108_4677167688813950172_n.jpg
-
 
1408
    //    - _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:{}}}
-
 
1409
    //    - Dans cette dernière meta les seules choses importantes (sauf erreur) c'est les dimensions et l'emplacement du fichier, donc image_meta = osef
-
 
1410
    //
-
 
1411
    //    getimagesize() avec GD pour les tailles, ou mieux suivant ce qu'on a dans le serveur
-
 
1412
    //
-
 
1413
    // et une image de la galerie attachée à un article en tant qu'image à la une ça consite en :
-
 
1414
    //  une ligne de meta sur le post avec _thumbnail_id qui pointe sur l'ID du post de l'image ex: _thumbnail_id 7870
-
 
1415
 
-
 
1416
    // $image = array(
-
 
1417
    //   'post_author' => 1,
-
 
1418
    //   'post_date' => $article['date'],
-
 
1419
    //   'post_date_gmt' => $article['date'],
-
 
1420
    //   'post_content' => 'Image à la une de l\'article ' . $article['titre'],
-
 
1421
    //   'post_title' => $imagesNom,
-
 
1422
    //   'post_excerpt' => 'Image à la une de l\'article ' . $article['titre'],
-
 
1423
    //   'post_status' => 'inherit',
-
 
1424
    //   'comment_status' => 'open',
-
 
1425
    //   'ping_status' => 'closed',
-
 
1426
    //   'post_password' => '',
-
 
1427
    //   'post_name' => $imagesNom,
-
 
1428
    //   'to_ping' => '',
-
 
1429
    //   'pinged' => '',
-
 
1430
    //   'post_modified' => $article['date'],
-
 
1431
    //   'post_modified_gmt' => $article['date'],
-
 
1432
    //   'post_content_filtered' => '',
-
 
1433
    //   'post_parent' => 0,
271
			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
1434
    //   'guid' => 'https://www.tela-botanica.org/wp-content/uploads/2017/03/' . basename($imageChemin),
272
			TYPE , `id_parent` , `id_auteur`
1435
    //   'menu_order' => 0,
-
 
1436
    //   'post_type' => 'attachment',
-
 
1437
    //   'post_mime_type' => mime_content_type($imageChemin),
-
 
1438
    //   'comment_count' => 0
-
 
1439
    // );
-
 
1440
 
-
 
1441
    // $i++;
-
 
1442
 
-
 
1443
 
-
 
1444
    // // gestion des dates normales et dates en GMT
-
 
1445
    // $date = new DateTime($image['post_date'], new DateTimeZone('Europe/Paris'));
-
 
1446
    // $image['post_date_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s');
-
 
1447
    // $date = new DateTime($image['post_modified'], new DateTimeZone('Europe/Paris'));
-
 
1448
    // $image['post_modified_gmt'] = $date->setTimezone(new DateTimeZone('GMT'))->format('Y-m-d H:i:s');
-
 
1449
 
-
 
1450
    // $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)) . '
-
 
1451
    //   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`);'
-
 
1452
    // ;
-
 
1453
 
-
 
1454
    // $attachmentMetas = array(
-
 
1455
    //   'post_id' => article['ID'],
-
 
1456
    //   'meta_key' => '_thumbnail_id',
-
 
1457
    //   'meta_value' => $artucle['ID'] + 10000;
-
 
1458
    // );
-
 
1459
 
-
 
1460
    // $requeteInsertPostmeta = 'INSERT INTO ' . $prefixe_tables_wp . 'postmeta (`post_id`, `meta_key`, `meta_value`) VALUES'
-
 
1461
    //   . '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $attachmentMetas)) . ')'
-
 
1462
    //   . 'ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `meta_key`=VALUES(`meta_key`), `meta_value`=VALUES(`meta_value`);'
-
 
1463
    // ;
-
 
1464
 
-
 
1465
    // $postMetas = array(
-
 
1466
    //   'post_id' => article['ID'],
-
 
1467
    //   'meta_key' => '_thumbnail_id',
-
 
1468
    //   'meta_value' => $artucle['ID'] + 10000;
-
 
1469
    // );
-
 
1470
 
-
 
1471
    // $requeteInsertPostmeta = 'INSERT INTO ' . $prefixe_tables_wp . 'postmeta (`post_id`, `meta_key`, `meta_value`) VALUES'
-
 
1472
    //   . '(' . implode(', ', array_map(array($bdWordpress, 'quote'), $postMetas)) . ')'
-
 
1473
    //   . 'ON DUPLICATE KEY UPDATE `post_id`=VALUES(`post_id`), `meta_key`=VALUES(`meta_key`), `meta_value`=VALUES(`meta_value`);'
-
 
1474
    // ;
-
 
1475
 
-
 
1476
    // try {
-
 
1477
    //   $bdWordpress->exec($requeteInsertAttachment);
-
 
1478
 
-
 
1479
    //   $compteurSucces += count($insert);
-
 
1480
    // } catch(Exception $e) {
-
 
1481
    //   echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requeteInsert]" . PHP_EOL;
-
 
1482
 
-
 
1483
    //   if (true !== $modeBourrin) {
-
 
1484
    //     restaureLaTable($bdWordpress, $prefixe_tables_wp . 'posts');
-
 
1485
    //     restaureLaTable($bdWordpress, $prefixe_tables_wp . 'postmeta');
-
 
1486
 
-
 
1487
    //     die(var_dump($e->errorInfo));
-
 
1488
    //   }
-
 
1489
    // }
-
 
1490
  }
-
 
1491
 
-
 
1492
  echo '-- ' . $compteurSucces . ' images de couverture actualités migrées. ' . PHP_EOL;
-
 
1493
  echo '-- ' . $compteurEchecs . ' erreurs rencontrées pendant la migration (mais rien de grave). ' . PHP_EOL;
-
 
1494
  echo '-- ' . $compteurAbusay . ' images déjà migrées ' . PHP_EOL;
-
 
1495
  echo '-- ' . $length . ' articles au total ' . PHP_EOL;
-
 
1496
}
-
 
1497
 
-
 
1498
// @wphints : https://stackoverflow.com/questions/28643654/where-is-the-post-featured-image-link-stored-in-the-wordpress-database
-
 
1499
// @wphints : https://deliciousbrains.com/tour-wordpress-database/#wp_posts
-
 
1500
//
-
 
1501
// Une photo éligible en couverture est stockée dans la table *_posts avec un post_type = attachment.
-
 
1502
// Pour lier une image à un article il faut une ligne dans *_postmeta avec un type _thumbnail_id.
-
 
1503
//
-
 
1504
// Dans spip : l'image correspond à IMG/arton<<numarticle>>.png exemple : IMG/arton7965.png
-
 
1505
//
-
 
1506
// @TODO trouver une solution ? (ça marche pas car l'image doit être présente "dans" wordpress, connue de son gestionnaire de docs)
-
 
1507
// function migrerActualitesLogo() {
-
 
1508
//   global $prefixe_tables_wp;
-
 
1509
//   global $bdSpip;
-
 
1510
//   global $bdWordpress;
-
 
1511
//   global $modeBourrin;
-
 
1512
 
-
 
1513
//   sauvegardeLaTable($bdWordpress, $prefixe_tables_wp . 'term_relationships');
-
 
1514
 
-
 
1515
//   $requeteActualitesLogo = 'SELECT `id_article`, replace(replace(replace(replace(replace(replace(`id_rubrique`, 22, 20), 54, 21), 30, 23), 19, 24), 51, 25), 70, 22)
-
 
1516
//     FROM `spip_articles` WHERE id_rubrique in (22,54,70,30,19,51)';
-
 
1517
 
-
 
1518
//   $actualitesLogo = $bdSpip->query($requeteActualitesLogo)->fetchAll(PDO::FETCH_ASSOC);
-
 
1519
 
-
 
1520
//   $compteur = 0;
-
 
1521
//   foreach ($actualitesLogo as $actualiteLogo) {
-
 
1522
//     $requete = 'INSERT INTO ' . $prefixe_tables_wp . 'term_relationships (`object_id`, `term_taxonomy_id`) '
-
 
1523
//       . 'VALUES(' . implode(', ', array_map(array($bdWordpress, 'quote'), $actualiteLogo)) . ');';
-
 
1524
 
-
 
1525
//     try {
-
 
1526
//       $bdWordpress->exec($requete);
-
 
1527
 
-
 
1528
//       $compteur++;
-
 
1529
//     } catch(Exception $e) {
-
 
1530
//       echo "-- ECHEC " . __FUNCTION__ . " REQUÊTE: [$requete]" . PHP_EOL;
-
 
1531
 
-
 
1532
//       if (true !== $modeBourrin) {
-
 
1533
//         restaureLaTable($bdWordpress, $prefixe_tables_wp . 'term_relationships');
-
 
1534
 
-
 
1535
//         die(var_dump($e->errorInfo));
-
 
1536
//       }
-
 
1537
//     }
-
 
1538
//   }
-
 
1539
 
-
 
1540
//   echo '-- ' . $compteur . '/' . count($actualitesLogo) . ' logos d\'actualité migrés. ' . PHP_EOL;
-
 
1541
// }
-
 
1542
 
-
 
1543
function supprimerLesTablesSauvegardees($table = false) {
-
 
1544
  global $modeBourrin;
-
 
1545
  global $prefixe_tables_wp;
-
 
1546
  global $bdWordpress;
-
 
1547
 
-
 
1548
  if (true === $modeBourrin) {
-
 
1549
    if (false !== $table) {
-
 
1550
      $tables = [$table];
-
 
1551
    } else {
-
 
1552
      $tables = array(
-
 
1553
        $prefixe_tables_wp . 'users',
-
 
1554
        $prefixe_tables_wp . 'usermeta',
-
 
1555
        $prefixe_tables_wp . 'bp_activity',
-
 
1556
        $prefixe_tables_wp . 'bp_xprofile_data',
-
 
1557
        $prefixe_tables_wp . 'posts',
273
			FROM tela_prod_spip_actu.`spip_forum`
1558
        $prefixe_tables_wp . 'postmeta',
Line -... Line 1559...
-
 
1559
        $prefixe_tables_wp . 'slug_history',
274
			WHERE id_article in (SELECT `id_article` FROM tela_prod_spip_actu.`spip_articles` WHERE id_rubrique in (22,54,70,30,19,51))';
1560
        $prefixe_tables_wp . 'term_relationships',
275
	
1561
        $prefixe_tables_wp . 'term_taxonomy',
-
 
1562
        $prefixe_tables_wp . 'comments'