API REST Shopify : gérer la pagination et parcourir les pages

J’aime beaucoup Shopify, car c’est une plateforme qui permet de faire très facilement une boutique sans avoir besoin de se préoccuper de l’hébergement et des pleins autres éléments. N’importe qui peut facilement créer sa boutique à moindres frais pour commencer facilement à faire de l’ecommerce.

Ce que j’aime aussi, c’est que si vous commencez à avoir plusieurs boutiques, Shopify met à disposition une API très complète qui permet de faire énormément de choses. Je vous avais d’ailleurs présenté dans un précédent article comment démarrer avec l’API Shopify avec la création d’une application.

Cela fonctionne très bien, mais il y a problème dans certains cas. En effet sur certains endpoint les réponses sont très simples et tout est renvoyé en un seul appel. Cependant pour d’autres cas comme la récupération des commandes ou de la liste des produits de votre boutique, l’API renvoie beaucoup de résultat sur plusieurs pages qu’il va falloir parcourir. C’est bien évidemment pour des questions de performances, car si votre boutique comptabilise des milliers de commandes, ce sera bien trop lourd de tout renvoyer via une seule réponse. De plus, l’API renvoie énormément d’informations sur les GET donc avec des milliers de résultats, ce serait beaucoup trop important en une seule fois. Il faut donc récupérer les pages de résultat de l’API de Shopify et naviguer entre elles.

Le principe de la pagination

Il faut savoir que par défaut, l’API de Shopify renvoie les enregistrements du plus récent au plus ancien. Lors de votre appel, vous allez donc avoir les données les plus fraîches, il est bien sur possible de changer cela en ajoutant un paramètre lors de votre appel à l’API de Shopify selon ce que vous voulez faire.

Ici, je vais me concentrer sur la récupération de l’ensemble des commandes de votre boutique Shopify via l’API. Ce sera de toute façon le même principe pour les autres endpoint GET de l’API qui peuvent renvoyer beaucoup de résultats.

Comme pour un blog classique sous WordPress ou un site e-commerce, la pagination est une fonctionnalité essentielle. Elle permet de charger les données par pages, ce qui est plus efficace et convivial, surtout lorsque vous travaillez avec de grandes quantités de données ou qu’il y a beaucoup dans une catégorie de votre blog par exemple.

Récupérer la page suivante dans l’entête de la réponse

Dans le cas de la récupération des commandes de ma boutique Shopify via l’API, voici le script qui me permet de récupérer toutes les commandes en parcourant toutes les pages disponibles de résultat. Attention, il faudra bien évidemment le modifier selon vos besoins et je l’utilise actuellement en ligne de commande dans Laravel.

$shopId = $shop->id;
$apiKey = $shop->api_key;
$apiSecret = $shop->api_secret;
$accessToken = $shop->access_token;
$shopName = $shop->shop_slug_intern;

$url = "https://{$shopName}.myshopify.com/admin/api/2023-10/orders.json?status=any";

while ($url) {

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'X-Shopify-Access-Token: ' . $accessToken,
    ));
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true); 
    
    $response = curl_exec($ch);
    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $header = substr($response, 0, $header_size);
    $body = substr($response, $header_size);
    $ordersArray = json_decode($body, true);
    
    foreach ($ordersArray['orders'] as $orderData) {
        // traitement de chaque commande
    }
    
    // Recherche de l'en-tête de lien pour la page suivante
    preg_match('/<([^>]+)>; rel="next"/', $header, $matches);
    $url = $matches[1] ?? null;
    var_dump($url);
    // Fermeture de la session cURL
    curl_close($ch);
}

Explications sur le script qui gère la pagination de l’API Shopify

Voici maintenant quelques explications pour bien comprendre ce script PHP avec cURL et l’adapter à vos besoins :

  1. Initialisation des Variables :
    • $shopId, $apiKey, $apiSecret, $accessToken, $shopName : Ces variables stockent les informations d’identification et de configuration nécessaires pour interagir avec l’API Shopify. Il faudra les générer via le précédent article que j’ai mentionné plus haut.
  2. Construction de l’URL de l’API :
    • L’URL pour accéder à l’API Shopify est construite en utilisant le slug de la boutique ($shopName). L’URL cible l’endpoint orders.json de l’API Shopify pour obtenir les commandes de la boutique.
  3. Boucle While :
    • La boucle while continue de s’exécuter tant qu’il y a une URL à laquelle faire une requête. C’est le mécanisme principal pour parcourir toutes les pages.
  4. Initialisation de cURL :
    • $ch = curl_init($url) : Initialise une nouvelle session cURL avec l’URL de l’API Shopify.
  5. Options cURL :
    • CURLOPT_HTTPHEADER : Définit les en-têtes HTTP nécessaires pour l’authentification et le format de contenu (JSON).
    • CURLOPT_RETURNTRANSFER : Permet à cURL de retourner le résultat de la requête.
    • CURLOPT_HEADER : Inclut les en-têtes dans la réponse pour pouvoir les analyser ultérieurement.
  6. Exécution de la Requête cURL et Récupération de la Réponse :
    • $response = curl_exec($ch) : Exécute la requête cURL et stocke la réponse.
    • $header_size, $header, $body : Ces lignes séparent les en-têtes HTTP du corps de la réponse.
  7. Traitement des Commandes :
    • json_decode($body, true) : Convertit le corps de la réponse JSON en un tableau PHP.
    • La boucle foreach traite chaque commande retournée par l’API.
  8. Pagination – Trouver l’URL de la Page Suivante :
    • preg_match('/<([^>]+)>; rel="next"/', $header, $matches) : Utilise une expression régulière pour rechercher l’en-tête Link dans la réponse. Cet en-tête contient l’URL de la page suivante des résultats.
    • $url = $matches[1] ?? null : Stocke l’URL de la page suivante s’il y en a une, sinon définit $url à null.
  9. Fermeture de la Session cURL :
    • curl_close($ch) : Ferme la session cURL actuelle avant de recommencer la boucle.
  10. Répétition :
    • Si un en-tête Link avec rel="next" est trouvé, la variable $url est mise à jour avec l’URL de la page suivante, et la boucle while continue. Si aucun en-tête Link n’est trouvé ou s’il n’y a plus de pages, $url devient null, et la boucle se termine.

Vous n’avez plus qu’à adapter selon vos besoins et utiliser le bon endpoint que vous voulez exploiter. C’est surtout la partie avec le preg_match qui est importante et qu’il faudra récupérer de votre côté. J’espère que ce petit tutoriel vous aura aidé pour parcourir les pages renvoyées par l’API de Shopify et que vous allez maîtriser sans problème la pagination.

Laisser un commentaire