Point de terminaison de l'historique SEO : redirections 301
Historique SEO
Gérez les redirections 301 via l'API. Des entrées d'historique SEO sont également créées automatiquement lorsque l'seo_name change lors de l'importation de produits ou de catégories.
GET /Export/JSON/seohistory
POST /Import/JSON/seohistory
PUT /Import/JSON/seohistory
DELETE /Delete/JSON/seohistory/{id}Points de terminaison
| Méthode | Point de terminaison | Portée | Description |
|---|---|---|---|
| GET | /Export/JSON/seohistory | seohistory:read | Répertorier toutes les redirections SEO |
| GET | /Export/JSON/seohistory/{id} | seohistory:read | Redirection unique |
| POST | /Import/JSON/seohistory | seohistory:write | Créer une nouvelle redirection |
| PUT | /Import/JSON/seohistory | seohistory:write | Mettre à jour une redirection existante |
| DELETE | /Delete/JSON/seohistory/{id} | seohistory:delete | Supprimer un par un par ID |
| DELETE | /Delete/JSON/seohistory | seohistory:delete | Suppression groupée/par filtre |
Filtre de requête (GET)
| Paramètres | Description | Exemple |
|---|---|---|
?type= | Type d'entité (p=Produit, c=Catégorie, m=Fabricant, s=CMS, n=Actualités, o=Autres) ; depuis la version v2.122.12, les espaces vides en bordure ne sont plus pris en compte | ?type=p |
?base_id= | ID de l'entité source | ?base_id=70 |
?language= | Langue (code ISO ou ID) | ?language=de |
?seo_string= | NOUVEAU v2.122.11 Redirections d’une ancienne adresse, exactes (voir « Adresse de la boutique → ID ») | ?seo_string=alte-seite.html |
Adresse de la boutique → ID v2.122.11
Où se trouve l'adresse de la boutique, et vers où redirige une ancienne adresse ?
Trois filtres précis permettent, à partir d’une adresse connue (Search Console, ancien plan du site, e-mail client), d’identifier la catégorie, l’article ou la destination d’une redirection : ?seo_string= vers /categories et /seohistorys, ?seo_name= vers /products. Jusqu’à la version v2.122.10, les noms indiqués étaient UNKNOWN_FILTER, et la liste était fournie sans filtrage.
Étape par étape
- Supprimer l'hôte, la partie requête (
?…) et l'ancre (#…) :https://shop.de/lng/en/fishing-rods/spinning-rods/devientlng/en/fishing-rods/spinning-rods/. - Si le chemin commence par
lng/xx/: omettre ce segment et envoyer à la place?language=xx. Sans segment, c’est la langue par défaut de la boutique, par exemple?language=de. - Si le reste commence par un préfixe d’adresse tel que
brand,cms,newsoubadge(dans les boutiques plus anciennes, égalementmanufactureretblog), il s’agit d’un fabricant, d’une page CMS, d’un article d’actualité ou d’un badge produit. Pour ces adresses et pour les pages de boutique portant leur propre nom, les filtres n’existent pas. - Si le chemin se termine par
.html, il s'agit d'un article :/products?seo_name=avec le dernier segment sans.html(…/angelrute-xy.html→seo_name=angelrute-xy). - Si le chemin se termine par
/, il s'agit d'une catégorie :/categories?seo_string=avec le chemin complet. - Aucun résultat : l'historique SEO. La destination d'une redirection se trouve dans
sh_item_typeetsh_item_id(particle,ccatégorie,spage CMS,mfabricant,nactualités). Pour une catégorie, effectuer la recherche avec le chemin complet. Pour un article, commencer par le chemin complet (?seo_string=alte-kategorie/alter-artikel.html), puis, en l'absence de résultats, avec le dernier segment sans.html(?seo_string=alter-artikel) : en règle générale, SEO History ne répertorie un article renommé que sous son ancien slug.
# Kategorie zu https://shop.de/lng/en/fishing-rods/spinning-rods/
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
"https://shop.de/xpanel/xoport/Export/JSON/categories?seo_string=fishing-rods/spinning-rods&language=en"
# Artikel zu https://shop.de/angelruten/angelrute-xy.html (nur die Artikelnummer)
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
"https://shop.de/xpanel/xoport/Export/JSON/products?seo_name=angelrute-xy&fields=products_model"
# Wohin leitet https://shop.de/alte-kategorie/alter-artikel.html um? Erst der ganze Pfad …
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
"https://shop.de/xpanel/xoport/Export/JSON/seohistorys?seo_string=alte-kategorie/alter-artikel.html&language=de"
# … ohne Treffer der alte Slug
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
"https://shop.de/xpanel/xoport/Export/JSON/seohistorys?seo_string=alter-artikel&language=de"Recherche dans l’historique SEO
- La recherche s'effectue sur l'adresse telle qu'elle apparaît dans la barre d'adresse, les caractères spéciaux étant donc codés en pourcentage. Elle est à nouveau codée en tant que valeur de requête (
curl -G --data-urlencode,rawurlencode()) :k%C3%BCche-altdevientk%25C3%25BCche-altdans la partie requête. Le filtre de la version 4.9 de la boutique ne trouve pas d'autres variantes de la même adresse (décodéesküche-altou réécriteskueche-alt). - Exactement, sans préfixe ni motif :
%et_sont des caractères. La casse (majuscules/minuscules), les barres obliques externes et.htmln’ont aucune importance. - Si une adresse comporte plusieurs entrées, elles sont toutes affichées, la plus récente (
sh_id) en premier. La boutique elle-même retient la dernière entrée aprèssh_timestampen fonction du type de destination de la page (ppour une adresse sur.html,cpour une adresse sur/) ; s’il n’y en a pas, elle retient la dernière entrée, quel que soit son type ; si vous souhaitez reproduire ce choix, triez les entrées de cette manière. Le filtre fournit également les entrées expirées (sh_deletestamp) ; la boutique ne les redirige plus. - Le filtre fonctionne conjointement avec
?type=,?base_id=et/seohistory/{id}. Cas d'erreur : API d'exportation.
Structure des données
Champs
| Champ | Type | Description |
|---|---|---|
sh_id | INT | Clé primaire |
sh_base_id | INT | ID de l'entité source |
sh_base_type | ENUM | c=Catégorie, s=CMS, m=Fabricant, p=Produit, n=Actualités, o=Autres |
sh_item_id | INT | ID de l'entité cible |
sh_item_type | ENUM | Type de l'entité cible (valeurs identiques) |
sh_deletestamp | DATETIME | Suppression automatique (par défaut : +1 an) |
Champs de langue
| Champ | Type | Description |
|---|---|---|
sh_seo_string | VARCHAR(255) | Ancien chemin SEO (sans domaine, sans barre oblique initiale) |
Exemples de requêtes
POST — Nouvelle redirection
{
"type": "seohistory",
"data": [{
"sh_base_id": 70,
"sh_base_type": "c",
"sh_item_id": 102,
"sh_item_type": "c",
"sh_deletestamp": "2027-02-24 00:00:00",
"languages": {
"de": {"sh_seo_string": "alte-kategorie/alte-unterkat"},
"en": {"sh_seo_string": "old-category/old-subcat"}
}
}]
}DELETE — Traitement en masse et filtrage
# Bulk per JSON-Body: die sh_id aus dem GET
DELETE /Delete/JSON/seohistory
{"type": "seohistory", "data": [{"sh_id": 42}, {"sh_id": 43}, {"sh_id": 44}]}
# Abgelaufene Einträge bereinigen
DELETE /Delete/JSON/seohistory?expired=1
# Filter nach Typ und Quell-ID
DELETE /Delete/JSON/seohistory?type=p&base_id=123DELETE /seohistory(s)?seo_string= renvoie une erreur HTTP 400, rien n’est supprimé ; l’adresse recherche uniquement la requête GET. Jusqu’à la v2.122.10, le nom était ignoré et seules les entrées ?type=/?base_id= étaient supprimées ; avec ?type=p, toutes les entrées de produit étaient donc supprimées. Pour supprimer une entrée spécifique, utilisez son sh_id: DELETE /Delete/JSON/seohistory/{sh_id} ou via un corps JSON comme ci-dessus.type, base_id et expired ne sont plus pris en compte. Jusqu’à la v2.122.11, GET /seohistorys?type=%20p renvoyait des entrées de tous types, DELETE /seohistorys?type=%20p&base_id=42 supprimait les entrées de tous types correspondant à l’ID 42 et ?type=p&base_id=42%00 supprimait toutes les entrées de type p. Désormais, c’est la valeur validée qui s’applique. ⚠️ Cela entraîne également la suppression des requêtes qui étaient jusqu’à présent rejetées avec MISSING_FILTER, par exemple DELETE /seohistorys?type=%20p sans autre filtre : il s’agit désormais de toutes les entrées de type p. Tous les cas : API de suppression.Redirection automatique
Enregistrements automatiques de l’historique SEO lors de l’importation
seo_name (ou le nom lui-même, avec régénération automatique correspondante) change lors de l’importation JSON (PUT), une entrée d’historique SEO est automatiquement créée pour l’ancien chemin — de la même manière que pour l’importation XML. Durée de validité : 1 an. Les doublons sont détectés et évités (idempotent).- Produits (
p) — spécifiques à chaque langue - Catégories (
c) — spécifiques à chaque langue - Fabricants (
m) — indépendamment de la langue (une entrée, une ligne de description par langue) - Actualités (
n) — spécifiques à chaque langue - CMS (
s) — spécifique à chaque langue
Gérer l'historique SEO
Créez un client OAuth2 avec les scopes seohistory:read, seohistory:write et seohistory:delete.