Ajax-Filterung
Technische Dokumentation für den /ajax-Endpunkt von Shoporama zum Filtern von Produkten. Für Entwickler und Themendesigner.
Alle Shoporama-Shops haben einen integrierten /ajax-Endpunkt, der Produkte im JSON-Format zurückgibt. Dadurch ist es möglich, dynamische Filter, Lazy Loading und Infinite Scroll ohne Neuladen der Seite zu erstellen, was dem Kunden ein schnelles und modernes Erlebnis bietet.
Dieser Artikel richtet sich in erster Linie an Entwickler und diejenigen, die ihr eigenes Theme erstellen oder anpassen. Wenn Sie das Delaware-Theme verwenden, steht Ihnen die Ajax-Filterung bereits von Haus aus zur Verfügung und Sie müssen den Endpunkt nicht selbst aufrufen.
Wie man den Endpunkt aufruft
Ein einfacher Aufruf, der Produkte aus einer oder mehreren Kategorien abruft:
fetch('/ajax?categories=123&limit=24') .then(response => response.json()) .then(products => { products.forEach(p => console.log(p.name, p.price))); });
Standardmäßig gibt der Endpunkt ein JSON-Array mit Produkten zurück. Wenn Sie Metadaten und Paginierung einschließen möchten, fügen Sie include_meta=1 und include_pagination=1 hinzu. Sie erhalten dann stattdessen ein Objekt mit Produkten, Metadaten und Paginierung.
Verfügbare Parameter
Mehrere der Parameter nehmen durch Pipes getrennte Werte an, so dass Sie nach mehreren Dingen gleichzeitig filtern können. Zum Beispiel: categories=12|34|56.
| Parameter | Parameter Beschreibung |
|---|---|
| Kategorien | Kategorie-IDs, durch Pipe getrennt. Kann mit exclude=1 kombiniert werden, um stattdessen auszuschließen |
| force_categories | Wie categories, jedoch werden die Kategorien erzwungen, ohne dass andere Filter sie weiter eingrenzen können |
| preis_bereich | Preisspanne als min|max, z.B. 100|500 |
| attribut_werte | IDs von Attributwerten (z. B. Farbe, Größe), durch Pipes getrennt. Include exclude=1 zum Ausschließen |
| attribut_tags | Filtert Attributwerte nach ihrem Tag statt nach der ID, z. B. rot|blau |
| attribute_tags_in_stock | Wie attribute_tags, aber nur Varianten auf Lager |
| attribut_tag | Filter auf ein ganzes Attribut (nicht auf einen bestimmten Wert) anhand seines Tags, z. B. nur Produkte, die das Attribut "Farbe" haben |
| extension[id] | Filter auf zusätzliche Felder. id ist die ID des zusätzlichen Feldes und der Wert kann durch Pipes getrennt werden |
| Marken | Marken-IDs, durch Rohre getrennt |
| Anbieter | Lieferanten-IDs, Pipe-getrennt |
| landing_pages | Landing Page IDs, Pipe-getrennt |
| produkt_ids | Spezifische Produkt-IDs, Pipe-getrennt |
| atags | Nach Produkt-Tags filtern |
| sortieren + sort_order | Sortiert das Ergebnis. sort_order ist asc oder desc (Standard) |
| Grenze / Versatz | Paginierung |
| meta | Spezifisches Meta-Feld, das für jedes Produkt angegeben werden soll. Verwenden Sie _all für alle Meta-Felder oder trennen Sie mehrere Namen durch Pipe-Trennung |
| nur_auf_lager_Varianten | Gibt für jedes Produkt nur Varianten zurück, die im Feld variant_stock auf Lager sind |
| einschließen_meta | Setzen Sie diesen Wert auf 1, um Attribute, Kategorien und Marken im Ergebnis zu erhalten (ideal für die Erstellung von Filter-UI) |
| include_pagination | Setzen Sie diesen Wert auf 1, um Offset, Limit, Count und Total zu erhalten. |
| hübsch | Setzen Sie diesen Wert auf 1, um schön formatiertes JSON zu erhalten (gut für die Fehlersuche) |
| neu aufbauen | Setzen Sie diesen Wert auf 1, um einen Neuaufbau des Cache für eine bestimmte URL zu erzwingen. |
Hinweis: Die Parameter category_id, tag, extra_field[...], price_from und price_to existieren nicht. Verwenden Sie stattdessen categories, atags, extension[id] und price_range. Die falschen Namen liefern einfach 0 Ergebnisse oder werden ignoriert, ohne dass eine Fehlermeldung erscheint.
Beispiel: Kategorie, Preisspanne und Farbe
Abrufen von roten Produkten zwischen 100 und 500 Kr. aus zwei Kategorien, sortiert nach Preis aufsteigend:
const params = new URLSearchParams({ categories: '12|34', price_range: '100|500', attribute_tags: 'red', sort: 'price', sort_order: 'asc', limit: 24 }); fetch('/ajax?' + params) .then(r => r.json()) .then(products => renderProducts(products));
Beispiel: Mit zusätzlichen Feldern filtern und Metadaten erhalten
Erweiterungsfelder werden mit der ID des Erweiterungsfeldes in Klammern angegeben. Sie finden die ID unter Einstellungen → Erweiterte Felder im Admin. Beispiel: Erweiterungsfeld 5 (z.B. "Material") sollte entweder "Baumwolle" oder "Leinen" sein:
// extension[5]=cotton|linen fetch('/ajax?categories=12&extension[5]=' + encodeURIComponent('cotton|linen') + '&include_meta=1&include_pagination=1&limit=24') .then(r => r.json()) .then(data => { console.log(data.products); console.log(data.meta.attributes); console.log(data.pagination); });
Felder für jedes Produkt in der Antwort
Jedes Produkt im Array products hat unter anderem die folgenden Felder:
- product_id, own_id, name, description, list_description
- Preis, real_price, sale_price, price_dk (Dänisch formatiert)
- stock, attr_stock, variant_stock, stock_string_de
- marke_name, lieferanten_id, lieferanten_name, profil_name
- kategorie_id, kategorie_name
- thumbnail (200x200 fit), thumbnails (Array mit allen Bildern in 200x200), url
- avg_rating, online_since, delivery_time, delivery_time_not_in_stock, approx_shipping
- hat_Kampagnen, kampagnen_info
- meta_values (nur ausgefüllt, wenn Sie meta=... senden)
Wenn der Händler die Option "Lagerbestand über Ajax ausblenden" aktiviert hat, werden Lagerbestand, attr_stock und Lagermengen in variant_stock auf Null gesetzt, so dass die Lagerbestandszahlen nicht an die Öffentlichkeit gelangen.
Zwischenspeicherung
Der Endpunkt wird auf dem Server für 12 Stunden pro eindeutiger URL zwischengespeichert. Die Antwort wird außerdem mit den richtigen Last-Modified- und Expires-Headern gesendet, so dass Browser und Zwischenspeicher eine schnelle 304 Not Modified zurückgeben können, wenn der Inhalt unverändert ist. Dies sorgt für kurze Antwortzeiten, bedeutet aber auch, dass Änderungen an einem Produkt erst dann wirksam werden, wenn der Cache abgelaufen ist. Sie können einen Cache-Neubau für eine bestimmte URL erzwingen, indem Sie rebuild=1 hinzufügen.
Lesen Sie mehr im Artikel Cache in Shoporama, der sich mit den Cache-Ebenen im Allgemeinen beschäftigt.
Implementierung in Ihr Theme
Um eine komplette ajax-gefilterte Produktliste zu erstellen, muss der Entwickler normalerweise
- Die Filter-UI mit Checkboxen oder Dropdowns basierend auf meta.attributes, meta.brands und meta.categories erstellen
- auf Änderungen in den Filtern achten und sie in einen Abfrage-String kompilieren
- Aufruf von /ajax mit den ausgewählten Parametern
- Dynamische Aktualisierung der Produktliste und Anzeige der Paginierung auf der Grundlage von pagination.total
Tipp: Erfahren Sie mehr über das Filtern im Allgemeinen unter Filtern in Ihrem Online-Shop. Wenn Sie das Delaware-Theme verwenden, steht Ihnen die Ajax-Filterung bereits von Haus aus zur Verfügung.
Häufig gestellte Fragen
Wo finde ich die ID eines zusätzlichen Feldes oder Attributwertes?
Im Admin unter Einstellungen → Erweiterte Felder für Extrafelder und unter Einstellungen → Profile für Attributwerte. Die IDs erscheinen in der Liste oder in der URL, wenn Sie ein Feld bearbeiten.
Warum erhalte ich keine Ergebnisse, wenn ich category_id=123 verwende?
Weil der Parameter nicht existiert. Ändern Sie ihn in categories=123 (Plural). Dies ist einer der häufigsten Fehler, wenn Sie zum ersten Mal eine Ajax-Filterung erstellen. Überprüfen Sie auch, dass Sie nicht price_from/price_to oder extra_field[...] verwenden, die ebenfalls nicht existieren.
Meine Änderungen an einem Produkt werden in /ajax nicht angezeigt. Was sollte ich tun?
Der Endpunkt wird für 12 Stunden zwischengespeichert. Warten Sie, oder rufen Sie die URL mit &rebuild=1 ab, um eine neue Generierung dieser bestimmten URL zu erzwingen.
Wirken sich viele Ajax-Aufrufe auf die Geschwindigkeit meiner Website aus? (Mikkel, Entwickler)
Der Cache sorgt dafür, dass wiederholte Aufrufe schnell sind. Achten Sie jedoch darauf, dass Sie nicht für jeden Tastendruck in einem Suchfeld einen neuen Aufruf machen. Verwenden Sie "debounce", damit Sie nur dann aufrufen, wenn der Benutzer 200-300 ms pausiert. Der Browser verwendet auch If-Modified-Since, so dass unveränderte Antworten als 304 kommen und fast keine Bandbreite verwendet wird.
Bekomme ich das gleiche Ergebnis wie auf der Kategorieseite?
Ziemlich genau. /ajax beachtet die gleichen Regeln, die ProductFactory auf Kategorieseiten verwendet, so dass sich Filterung, Sortierung und Sichtbarkeit (z. B. versteckte Produkte) gleich verhalten.
Kann ich eine Suche über /ajax durchführen? (Sofie, neue Mitarbeiterin)
/ajax akzeptiert keine Freitext-Suchparameter. Verwenden Sie für die Suche Shoporamas speziellen Such-Endpunkt im Thema (typischerweise /search) oder filtern Sie nach product_ids, wenn Sie die Suche selbst durchführen und nur Daten über eine bekannte Produktliste abrufen möchten.
Wie viele Produkte kann ich mit einem einzigen Aufruf abrufen? (Jonas, Skala)
Es gibt keine feste Grenze im Code, aber um die JSON-Nutzlast klein und die Antwort schnell zu halten, sollten Sie die Zahl auf ein paar hundert pro Aufruf beschränken. Verwenden Sie Limit und Offset auf die Seitenzahl, oder holen Sie den nächsten Stapel nur, wenn der Benutzer scrollt.
Werden die Lagerbestände meiner Kunden öffentlich zugänglich sein? (Malene, Marketing)
Grundsätzlich enthält die Antwort den Lagerbestand. Wenn Sie sie ausblenden möchten (damit Konkurrenten oder Roboter nicht sehen können, wie viel Sie auf Lager haben), kann Ihr Entwickler die Option "Lagerbestand über Ajax ausblenden" im Webshop aktivieren, woraufhin die Bestandsfelder als Null gesendet werden.
Kann ich /ajax als eine "echte" REST-API verwenden? (Mikkel, Entwickler)
Nein, es ist ein öffentlicher, cache-freundlicher Produkt-Endpunkt für die Front-End-Nutzung. Wenn Sie auf einer tieferen Ebene erstellen, aktualisieren oder integrieren müssen, verwenden Sie stattdessen die eigentliche REST-API, für die ein API-Schlüssel erforderlich ist.
Sollte ich mir Sorgen machen, dass die Filterung für Kunden in verschiedenen Sprachen unterschiedlich funktioniert?
Der Endpunkt läuft im gleichen Webshop-Kontext wie die Startseite, so dass Preise, Währung und Sichtbarkeit dem Webshop folgen, den der Aufruf umrahmt. Wenn Sie mehrere Webshops oder Sprachen haben, denken Sie daran, dass jeder Webshop seine eigene URL und damit seinen eigenen /ajax-Cache hat.
Möchten Sie, dass wir Ihnen helfen, die Ajax-Filterung in Ihr Thema einzubauen, oder haben Sie technische Fragen? Schreiben Sie an support@shoporama.dk.
Ähnliche Artikel
Filterung in Ihrem Online-Shop
Anleitung zur Einrichtung von Filtern in Ihrem Shoporama-Onlineshop, damit Kunden Produkte filtern können.
Konfiguration und Anpassung an das Thema Delaware
Vollständige Anleitung zur Einrichtung des Delaware-Themas für Ihren Shoporama-Onlineshop. Fußzeile, Mega-Menü, Farben, Zahlungssymbole,...
REST-API
Vollständige Anleitung zur REST-API von Shoporama: Authentifizierung, alle Endpunkte, Beispiele und Swagger-Dokumentation.
Zusätzliche Felder für Produkte importieren
Anleitung zum Importieren von zusätzlichen Feldern über den CSV-Import von Produkten in Shoporama.
Cache im Shoporama
Wie das Caching in Shoporama funktioniert. Wie oft der Cache aufgebaut wird, wann Ihre Änderungen wirksam werden und wie Sie einen Reset erzwingen...