Récupérer l’inventaire des PDF sans accès admin ni FTP

L’API REST native de WordPress expose tous les médias publiés à l’adresse /wp-json/wp/v2/media, y compris les PDF, sans authentification requise. En filtrant avec mime_type=application/pdf et en paginant par lots de 100 avec per_page=100, on reconstitue l’inventaire complet des fichiers, même sans identifiants admin ni accès FTP au serveur.

C’est la méthode la plus rapide quand un prestataire ne répond plus, quand un accès admin a été perdu, ou simplement quand on veut auditer une médiathèque avant une migration. Pas besoin de crawler les pages HTML du site ni de lancer un navigateur automatisé : la médiathèque est déjà structurée en JSON, accessible en lecture publique.

Ce qu’il te faut avant de commencer

1. Vérifier que les PDF sont exposés par l’API

Teste d’abord https://exemple.com/wp-json/wp/v2/media?per_page=1 dans un navigateur ou avec curl. Si tu obtiens un tableau JSON avec un objet média, l’API répond normalement.

Un endpoint REST désigne une URL précise à laquelle un client envoie une requête HTTP pour lire ou modifier une ressource exposée par une application, ici la médiathèque WordPress. L’endpoint de collection /wp-json/wp/v2/media est accessible en lecture publique dès lors que les pièces jointes sont rattachées à du contenu publié source : REST API Handbook, WordPress.org. Aucune clé API, aucun mot de passe : c’est ce qui rend l’export possible même sans les accès du site.

Si la requête renvoie une erreur 401 ou 403, le problème vient presque toujours d’un plugin de sécurité (Wordfence, iThemes, un pare-feu applicatif) qui bloque l’API par défaut. Il faut alors passer par un accès légitime au site pour lever temporairement ce blocage.

2. Filtrer par type MIME pour isoler les PDF

Le contrôleur d’attachements de WordPress accepte deux paramètres de filtrage distincts : media_type (une catégorie large comme “file” ou “image”) et mime_type (un type précis comme application/pdf) source : WP_REST_Attachments_Controller, WordPress.org.

ParamètreExempleRésultat
mime_type=application/pdf?mime_type=application/pdfUniquement les PDF
media_type=file?media_type=filePDF, zip, docs, tout sauf images/vidéos
mime_type combiné à page?mime_type=application/pdf&page=2La deuxième page de PDF

Depuis une pull request officielle de septembre 2025 sur le dépôt wordpress-develop, ces deux paramètres acceptent aussi une liste de valeurs séparées par des virgules ou un tableau, ce qui permet de demander plusieurs types MIME en une seule requête tout en gardant la rétrocompatibilité source : PR #10054, WordPress/wordpress-develop, 2025. Pour un simple export de PDF, un seul paramètre mime_type=application/pdf suffit.

3. Paginer par lots de 100 et suivre les en-têtes

per_page plafonne à 100 : pour dépasser ce volume, il faut boucler sur plusieurs requêtes et combiner les résultats côté client source : Pagination, REST API Handbook. Chaque réponse renvoie deux en-têtes HTTP utiles pour piloter la boucle : X-WP-Total (le nombre total de médias correspondant au filtre) et X-WP-TotalPages (le nombre de pages à parcourir).

Une boucle simple ressemble à ceci :

GET /wp-json/wp/v2/media?mime_type=application/pdf&per_page=100&page=1
GET /wp-json/wp/v2/media?mime_type=application/pdf&per_page=100&page=2
GET /wp-json/wp/v2/media?mime_type=application/pdf&per_page=100&page=3

Sur un outil interne mené en juin 2026 pour un fabricant de dispositifs dentaires client de Peechy, on a reconstitué l’inventaire complet d’un WordPress exactement avec cette méthode : une boucle GET /wp-json/wp/v2/media?mime_type=application/pdf&per_page=100&page=N, page après page, jusqu’à réunir 255 notices PDF. Aucun accès admin, aucun FTP, juste l’endpoint public et une boucle de pagination.

4. Télécharger les fichiers depuis source_url

Chaque objet JSON renvoyé contient un champ source_url : c’est le lien direct vers le fichier PDF réel, hébergé sur le serveur d’origine. Un script minimal télécharge chaque source_url un par un, en conservant l’id, le title et éventuellement l’alt_text dans un fichier CSV ou JSON à côté, pour garder la traçabilité entre le fichier téléchargé et sa fiche d’origine.

Cette étape est celle où le volume compte : 255 fichiers PDF, même compressés, peuvent représenter plusieurs centaines de mégaoctets. Prévois un espace de stockage temporaire suffisant avant de lancer le téléchargement en boucle, et garde le mapping id/nom de fichier, il servira à reconstruire un catalogue propre ensuite.

5. Choisir où héberger l’inventaire une fois récupéré

Une fois les PDF téléchargés en local, les reposer sur un WordPress classique n’a plus de sens si l’objectif est la fiabilité ou la vitesse de diffusion. Le stockage objet est un mode de stockage où chaque fichier est conservé comme un objet indépendant, adressable par une URL stable, sans hiérarchie de dossiers ni dépendance à un serveur applicatif.

SolutionTypePoint fort
Cloudflare R2Stockage objetZéro frais de sortie (egress) source : Cloudflare Learning Paths
AWS S3Stockage objetÉcosystème le plus mature, très documenté
OVHcloud Object StorageStockage objetHébergement européen, utile pour la conformité RGPD
Vercel BlobStockage objet géréIntégration directe avec un déploiement Next.js/Astro

Sur le projet mené en juin 2026, les 255 notices ont été hébergées sur Vercel Blob pour un volume total de 177 Mo. Un CDN est un réseau de serveurs répartis qui sert les fichiers depuis le point le plus proche du visiteur, ce qui réduit le temps de chargement par rapport à un fichier servi depuis un unique serveur WordPress.

Ce choix s’est révélé décisif : quelques semaines plus tard, le WordPress d’origine a été suspendu par l’hébergeur. L’inventaire, déjà exporté et hébergé ailleurs, a survécu à cette suspension. Le catalogue a ensuite été reconstruit en 14 langues à partir de 117 PDF fournis dans une archive zip par le client. Si l’export n’avait pas été fait en amont, ces 255 notices auraient tout simplement disparu avec le site. C’est le même scénario que celui décrit dans prestataire web disparu : récupérer son site étape par étape : agir avant que l’accès ne disparaisse change tout.

6. Vérifier le statut RGPD avant de redéployer les fichiers

Si les PDF contiennent des données personnelles (formulaires remplis, notices nominatives, factures), le choix de l’hébergeur de stockage devient un choix de sous-traitant au sens du RGPD. La CNIL rappelle que la qualification des acteurs du cloud (responsable de traitement, sous-traitant) a un impact direct sur la répartition des responsabilités et sur les clauses à prévoir au contrat source : CNIL, qualifications cloud. Avant de signer avec un fournisseur de stockage objet, exige sa politique de sécurité et ses certifications, notamment l’ISO/IEC 27001, un premier indicateur de fiabilité source : CNIL, gérer la sous-traitance. Pour le reste de la mise en conformité du site, la checklist complète est ici : RGPD et site web en 2026 : ce que tu dois absolument respecter.

Pièges courants

SymptômeCause probableSolution
Erreur 401/403 sur l’endpointPlugin de sécurité bloque l’API RESTDésactiver temporairement le blocage via un accès légitime
Certains PDF absents de la réponseFichier lié en dur dans le contenu, jamais attaché comme médiaCroiser avec un export du contenu HTML pour les liens orphelins
Boucle qui s’arrête trop tôtMauvaise lecture de X-WP-TotalPagesLire l’en-tête HTTP à chaque requête, pas seulement au premier appel
Téléchargement qui échoue en masseTimeout serveur sur de gros PDFAjouter un délai entre requêtes et relancer les échecs individuellement

Questions fréquentes

Faut-il être connecté en admin pour utiliser cet endpoint ?

Non. L’endpoint /wp-json/wp/v2/media est accessible en lecture publique dès lors que les pièces jointes sont rattachées à du contenu publié. Aucune authentification n’est nécessaire pour lister et télécharger les fichiers.

Que faire si le site bloque l'API REST par sécurité ?

Le blocage vient généralement d’un plugin de sécurité ou d’une règle de pare-feu. Il faut un accès légitime au site (admin ou hébergement) pour lever temporairement la restriction, le temps de l’export.

Peut-on filtrer plusieurs types de fichiers en une seule requête ?

Oui, depuis les évolutions récentes du contrôleur média, mime_type et media_type acceptent des listes séparées par des virgules. Pour un export de PDF uniquement, un seul filtre mime_type=application/pdf reste suffisant.

Combien de PDF peut-on récupérer avec cette méthode ?

Il n’y a pas de limite technique côté API au-delà des 100 résultats par page : il suffit de boucler sur les pages indiquées par l’en-tête X-WP-TotalPages. Un export de 255 fichiers ou plus se fait avec le même script, seule la durée d’exécution augmente.

Où héberger les PDF une fois téléchargés ?

Un stockage objet (Cloudflare R2, AWS S3, OVHcloud Object Storage, Vercel Blob) couplé à un CDN est la solution la plus fiable pour des fichiers statiques volumineux, largement préférable à un ré-hébergement sur un nouveau WordPress.

Un export réussi ne dépend pas de la taille du site ni de la version de WordPress installée : il dépend uniquement de savoir que l’endpoint existe, comment le filtrer, et où stocker le résultat avant que l’accès au site d’origine ne disparaisse.

Ce problème, Peechy s'en occupe

Plutôt que de tout gérer seul, confiez votre site à une agence qui s'occupe de tout, hébergement, sécurité, maintenance et corrections. Encore plus simple en abonnement : on règle les soucis avant même que vous les remarquiez.

Confier mon site à Peechy