Dernièrement, lors d’un projet sur WordPress, j’ai dû créer des articles via un xml. Pour ce faire, j’ai dû extraire le contenu d’un zip (situé à la racine du ftp) et importer le xml avec les images associées pour créer des articles.

I – Extraction du zip

Pour extraire le contenu du dossier zip, j’ai réalisée un plugin.

Pour ce faire, créez un dossier dans le dossier « plugins » de WordPress et nommez le (par ex import_des_annonces). Puis créez un fichier php avec le même nom (par ex : import_des_annonces.php).

Enfin, collez le code suivant :

function extract_zip(){
	if ($zip->open('CHEMIN_ABSOLU/export_quimper.zip') === TRUE){
		//extract contents to /data/ folder
		$zip->extractTo('CHEMIN_ABSOLU/zip/');
		//close the archive
		$zip->close();
		echo 'Archive extracted to zip/ folder!';
	}else{
		echo 'Failed to open the archive!';
	}
}
add_action('extract_zip_hook', "extract_zip");

ATTENTION : remplacer « CHEMIN_ABSOLU » par le chemin vers votre fichier.
Pour trouver le chemin absolu :

  1. Créer un fichier « chemin.php » à la racine de votre ftp
  2. Écrivez celle ligne : et sauvegarder votre fichier
  3. Ouvrez votre navigateur et allez voir ce fichier PHP. Il vous donne le chemin absolu, par exemple : /home/site/www/admin/chemin.php
  4. Copiez le code SANS chemin.php et collez le dans le plugin à la place de « CHEMIN_ABSOLU »

 

II – Import des articles et des images

Ensuite pour importer les articles (et les images) via le xml, j’ai utilisée le plugin WP All Import (perso j’utilise la version Pro puisque cette dernière permet d’importer des custom posts ou custom fields et ici j’en avais besoin).

Pour en voir le fonctionnement, je vous renvoie sur la page du plugin.

 

III – Suppression du dossier zip

Pour supprimer le dossier que vous avez créé au point 1, collez ces fonctions dans le plugin :

function advRmDir($dir){
	// ajout du slash a la fin du chemin s'il n'y est pas
	if(!preg_match( "/^.*/$/", $dir)) $dir .= '/';
	// Ouverture du repertoire demande
	$handle = @opendir($dir);
	// si pas d'erreur d'ouverture du dossier on lance le scan
	if($handle != false){
		// Parcours du repertoire
		while($item = readdir($handle)){
			if($item != "." && $item != ".."){
				if(is_dir($dir.$item)) advRmDir($dir.$item);
				else unlink($dir.$item);
			}
		}
		closedir($handle); // Fermeture du repertoire
		$res = rmdir($dir); // suppression du repertoire
	}else{
		$res = false;
	}
	return $res;
}

function delete_zip(){
	$dir = 'CHEMIN_ABSOLU/zip/'; //on attribue la variable à $dir
	advRmDir($dir); //on efface le tout
}
add_action('delete_zip_hook', "delete_zip");

 

IV – Tâche Cron (optionnel)

4.1 – Cron pour le zip

Si vous avez besoin que cet import se fasse, par exemple, tout les jours à 1h, installez le plugin WP Crontrol et activez le.
Ensuite, allez dans le menu « Outils » et cliquez sur « Crontrol ». Dans la partie « Add Cron Event » ajoutez la tâche cron qui va permettre d’exectuer la fonction de dézippage du dossier zip.
Dans le champ « Hook name: » indiquez « extract_zip_hook » et dans « Next run (UTC): » indiquez l’heure que vous souhaitez (ATTENTION : c’est en heure UTC). Ensuite choisissez si vous voulez répétez cette tâche cron (toutes les heures, 12 heures ou 24 heures).
Pour finir, cliquez sur « Add Cron Event ».

 

4.2 – Cron pour WP All Import

Pour Wp All Import vous allez être obligé de passez par les cron du serveur ;-S
Dans le menu « Manage Imports », survolez votre import sauvegardé et cliquez sur « Cron Scheduling ». Vous avez deux liens qui sont de la forme :
http://YOUR-WEBSITE.com/?import_key=[YOUR_IMPORT_KEY]&import_id=[YOUR_IMPORT_ID]&action=trigger
http://YOUR-WEBSITE.com/?import_key=[YOUR_IMPORT_KEY]&import_id=[YOUR_IMPORT_ID]&action=processing

Il faut mettre ces deux liens en tâche cron. Pour cela, je vous renvoi à la doc : doc tâche cron wp all import

 

4.3 – Cron pour supprimer le dossier zip

Comme pour le point 4.1, dans « Hook name: » indiquez « delete_zip_hook ».

 

Enjoy 😉