Bonjour,

J'ai régulièrement a interroger des API externes afin de synchroniser automatiquement des données venant d'ERP avec wordpress : offres d'emplois, produits woocommerce ...
Tout se passe très bien lorsqu'il y a quelques 10ene voir 100ene d'offres mais les scripts plantent lorsqu'il y a trop de données. Mes scripts sont présents dans un plugin appelé par un CRON, toutes les nuits par exemple.

Je fais appel à votre aide pour savoir
1. Si mon code est totalement à la ramasse et explique à lui tout seul le fait que php s'emballe
2. Si vous savez comment je pourrais faire intelligemment un système de pagination pour que php ne traite que 20 articles par 20 par exemple (mes tentatives de pagination consistent à de la récurcivité, donc c'est le même worker php qui bosse à la page 1 comme à la page 10 et ça ne diminue en rien sa charge)
3. Si vous avez des conseils d'une manière générale ...

Ci dessous du code exemple. Il n'a pas pour but d'être fonctionnel mais de montrer la logique que j'utilise actuellement.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
// On récupère les articles WP
$arg = array(
	'post_type' => 'products',
	'post_status' => 'publish',
	'posts_per_page'=> -1
);
 
$query = new \WP_Query($arg);
 
// On boucle sur tous les produits WP et on rajoute une notion de "à supprimer => Oui" 
$listeProduitsWP = array();
foreach ($query->posts as $key => $value) {
	$idExterne = get_field('idExterne');
 
	$listeProduitsWP[$idExterne] = $value;
	$listeProduitsWP[$idExterne]->delete = true;
 
	// On décharge un peu la mémoire au fur & à mesure
	unset($query->posts[$key]); 
}
 
// Récupère potentiellement des milliers d'articles
$listeProduitExterne = getFromAPI('https//example/getproduit/page/1');
 
foreach ($listeProduitExterne as $key => $value) {
 
	// l'article existe coté WP et coté API, on update
	if(isset($listeProduitsWP[$value->idExterne])) {
		// On update le produit dans la base WP, en metant à jour au besoin son titre, sa quantité, toutes ses métadonnées 
 
		// L'article étant toujours existant dans l'API, on ne veut pas le supprimer de WP 
		$listeProduitsWP[$value->idExterne]->delete = false;
	}
	// l'article n'existe pas dans WP, on l'ajoute
	else {
		// Ajout d'un produit dans WP, avec toutes ses données
	}
 
}
 
// Maintenant, on a tout mis à jour, il reste à supprimer les articles WP qui ne sont plus dans l'API : 
foreach ($listeProduitsWP as $key => $value) {
	if($value->delete) {
		// On supprime l'article si delete est resté à true;
	}
}
 
// Et si pagination, on recommence à partir de là (j'utilise biensur des fonctions, je duplique pas mon code pour chaque page ^^) : 
$listeProduitExterne = getFromAPI('https//example/getproduit/page/2');
...

Pour la pagination, je me suis demandé si ça ne pouvait pas être une bonne idée que le code lancé par le CRON se relance lui même pour la page 2, puis 3 etc ... dans l'idée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
curl https://mon-propre-script?page=page+1
Je reste à votre entière disposition si vous avez des questions, merci beaucoup d'avance !