Point de terminaison de l'historique SEO : redirections 301

v2.6.0 · CRUD · Redirections SEO

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éthodePoint de terminaisonPortéeDescription
GET/Export/JSON/seohistoryseohistory:readRépertorier toutes les redirections SEO
GET/Export/JSON/seohistory/{id}seohistory:readRedirection unique
POST/Import/JSON/seohistoryseohistory:writeCréer une nouvelle redirection
PUT/Import/JSON/seohistoryseohistory:writeMettre à jour une redirection existante
DELETE/Delete/JSON/seohistory/{id}seohistory:deleteSupprimer un par un par ID
DELETE/Delete/JSON/seohistoryseohistory:deleteSuppression groupée/par filtre

Filtre de requête (GET)

ParamètresDescriptionExemple
?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

  1. Supprimer l'hôte, la partie requête (?…) et l'ancre (#…) : https://shop.de/lng/en/fishing-rods/spinning-rods/ devient lng/en/fishing-rods/spinning-rods/.
  2. 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.
  3. Si le reste commence par un préfixe d’adresse tel que brand, cms, news ou badge (dans les boutiques plus anciennes, également manufacturer et blog), 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.
  4. 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).
  5. Si le chemin se termine par /, il s'agit d'une catégorie : /categories?seo_string= avec le chemin complet.
  6. Aucun résultat : l'historique SEO. La destination d'une redirection se trouve dans sh_item_type et sh_item_id (p article, c catégorie, s page CMS, m fabricant, n actualité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-alt devient k%25C3%25BCche-alt dans 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ées küche-alt ou réécrites kueche-alt).
  • Exactement, sans préfixe ni motif : % et _ sont des caractères. La casse (majuscules/minuscules), les barres obliques externes et .html n’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ès sh_timestamp en fonction du type de destination de la page (p pour une adresse sur .html, c pour 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

ChampTypeDescription
sh_idINTClé primaire
sh_base_idINTID de l'entité source
sh_base_typeENUMc=Catégorie, s=CMS, m=Fabricant, p=Produit, n=Actualités, o=Autres
sh_item_idINTID de l'entité cible
sh_item_typeENUMType de l'entité cible (valeurs identiques)
sh_deletestampDATETIMESuppression automatique (par défaut : +1 an)

Champs de langue

ChampTypeDescription
sh_seo_stringVARCHAR(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=123
Modifié dans la v2.122.11 : DELETE /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.
Modification dans la v2.122.12 : les espaces vides en fin de 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

Automatique : si l’ 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).
Prise en charge depuis la v2.13.0 : les cinq types d’entités avec des URL SEO :
  • 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.

Créer un client OAuth2